_ZN6icu_786BMPSetC2EPKii:
   30|      1|        list(parentList), listLength(parentListLength) {
   31|      1|    uprv_memset(latin1Contains, 0, sizeof(latin1Contains));
  ------------------
  |  |  100|      1|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   32|      1|    uprv_memset(table7FF, 0, sizeof(table7FF));
  ------------------
  |  |  100|      1|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   33|      1|    uprv_memset(bmpBlockBits, 0, sizeof(bmpBlockBits));
  ------------------
  |  |  100|      1|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      1|#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|    list4kStarts[0]=findCodePoint(0x800, 0, listLength-1);
   43|      1|    int32_t i;
   44|     17|    for(i=1; i<=0x10; ++i) {
  ------------------
  |  Branch (44:14): [True: 16, False: 1]
  ------------------
   45|     16|        list4kStarts[i]=findCodePoint(i<<12, list4kStarts[i-1], listLength-1);
   46|     16|    }
   47|      1|    list4kStarts[0x11]=listLength-1;
   48|      1|    containsFFFD=containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10]);
   49|       |
   50|      1|    initBits();
   51|      1|    overrideIllegal();
   52|      1|}
_ZN6icu_786BMPSet8initBitsEv:
  121|      1|void BMPSet::initBits() {
  122|      1|    UChar32 start, limit;
  123|      1|    int32_t listIndex=0;
  124|       |
  125|       |    // Set latin1Contains[].
  126|      8|    do {
  127|      8|        start=list[listIndex++];
  128|      8|        if(listIndex<listLength) {
  ------------------
  |  Branch (128:12): [True: 8, False: 0]
  ------------------
  129|      8|            limit=list[listIndex++];
  130|      8|        } else {
  131|      0|            limit=0x110000;
  132|      0|        }
  133|      8|        if(start>=0x100) {
  ------------------
  |  Branch (133:12): [True: 0, False: 8]
  ------------------
  134|      0|            break;
  135|      0|        }
  136|    117|        do {
  137|    117|            latin1Contains[start++]=1;
  138|    117|        } while(start<limit && start<0x100);
  ------------------
  |  Branch (138:17): [True: 110, False: 7]
  |  Branch (138:32): [True: 109, False: 1]
  ------------------
  139|      8|    } while(limit<=0x100);
  ------------------
  |  Branch (139:13): [True: 7, False: 1]
  ------------------
  140|       |
  141|       |    // Find the first range overlapping with (or after) 80..FF again,
  142|       |    // to include them in table7FF as well.
  143|      3|    for(listIndex=0;;) {
  144|      3|        start=list[listIndex++];
  145|      3|        if(listIndex<listLength) {
  ------------------
  |  Branch (145:12): [True: 3, False: 0]
  ------------------
  146|      3|            limit=list[listIndex++];
  147|      3|        } else {
  148|      0|            limit=0x110000;
  149|      0|        }
  150|      3|        if(limit>0x80) {
  ------------------
  |  Branch (150:12): [True: 1, False: 2]
  ------------------
  151|      1|            if(start<0x80) {
  ------------------
  |  Branch (151:16): [True: 0, False: 1]
  ------------------
  152|      0|                start=0x80;
  153|      0|            }
  154|      1|            break;
  155|      1|        }
  156|      3|    }
  157|       |
  158|       |    // Set table7FF[].
  159|     47|    while(start<0x800) {
  ------------------
  |  Branch (159:11): [True: 46, False: 1]
  ------------------
  160|     46|        set32x64Bits(table7FF, start, limit<=0x800 ? limit : 0x800);
  ------------------
  |  Branch (160:39): [True: 46, False: 0]
  ------------------
  161|     46|        if(limit>0x800) {
  ------------------
  |  Branch (161:12): [True: 0, False: 46]
  ------------------
  162|      0|            start=0x800;
  163|      0|            break;
  164|      0|        }
  165|       |
  166|     46|        start=list[listIndex++];
  167|     46|        if(listIndex<listLength) {
  ------------------
  |  Branch (167:12): [True: 46, False: 0]
  ------------------
  168|     46|            limit=list[listIndex++];
  169|     46|        } else {
  170|      0|            limit=0x110000;
  171|      0|        }
  172|     46|    }
  173|       |
  174|       |    // Set bmpBlockBits[].
  175|      1|    int32_t minStart=0x800;
  176|    373|    while(start<0x10000) {
  ------------------
  |  Branch (176:11): [True: 372, False: 1]
  ------------------
  177|    372|        if(limit>0x10000) {
  ------------------
  |  Branch (177:12): [True: 0, False: 372]
  ------------------
  178|      0|            limit=0x10000;
  179|      0|        }
  180|       |
  181|    372|        if(start<minStart) {
  ------------------
  |  Branch (181:12): [True: 289, False: 83]
  ------------------
  182|    289|            start=minStart;
  183|    289|        }
  184|    372|        if(start<limit) {  // Else: Another range entirely in a known mixed-value block.
  ------------------
  |  Branch (184:12): [True: 130, False: 242]
  ------------------
  185|    130|            if(start&0x3f) {
  ------------------
  |  Branch (185:16): [True: 38, False: 92]
  ------------------
  186|       |                // Mixed-value block of 64 code points.
  187|     38|                start>>=6;
  188|     38|                bmpBlockBits[start&0x3f]|=0x10001<<(start>>6);
  189|     38|                start=(start+1)<<6;  // Round up to the next block boundary.
  190|     38|                minStart=start;      // Ignore further ranges in this block.
  191|     38|            }
  192|    130|            if(start<limit) {
  ------------------
  |  Branch (192:16): [True: 99, False: 31]
  ------------------
  193|     99|                if(start<(limit&~0x3f)) {
  ------------------
  |  Branch (193:20): [True: 18, False: 81]
  ------------------
  194|       |                    // Multiple all-ones blocks of 64 code points each.
  195|     18|                    set32x64Bits(bmpBlockBits, start>>6, limit>>6);
  196|     18|                }
  197|       |
  198|     99|                if(limit&0x3f) {
  ------------------
  |  Branch (198:20): [True: 97, False: 2]
  ------------------
  199|       |                    // Mixed-value block of 64 code points.
  200|     97|                    limit>>=6;
  201|     97|                    bmpBlockBits[limit&0x3f]|=0x10001<<(limit>>6);
  202|     97|                    limit=(limit+1)<<6;  // Round up to the next block boundary.
  203|     97|                    minStart=limit;      // Ignore further ranges in this block.
  204|     97|                }
  205|     99|            }
  206|    130|        }
  207|       |
  208|    372|        if(limit==0x10000) {
  ------------------
  |  Branch (208:12): [True: 0, False: 372]
  ------------------
  209|      0|            break;
  210|      0|        }
  211|       |
  212|    372|        start=list[listIndex++];
  213|    372|        if(listIndex<listLength) {
  ------------------
  |  Branch (213:12): [True: 372, False: 0]
  ------------------
  214|    372|            limit=list[listIndex++];
  215|    372|        } else {
  216|      0|            limit=0x110000;
  217|      0|        }
  218|    372|    }
  219|      1|}
_ZN6icu_786BMPSet15overrideIllegalEv:
  229|      1|void BMPSet::overrideIllegal() {
  230|      1|    uint32_t bits, mask;
  231|      1|    int32_t i;
  232|       |
  233|      1|    if(containsFFFD) {
  ------------------
  |  Branch (233:8): [True: 0, False: 1]
  ------------------
  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|    } else {
  250|      1|        mask= static_cast<uint32_t>(~(0x10001<<0xd));   // Lead byte 0xED.
  251|     33|        for(i=32; i<64; ++i) {  // Second half of 4k block.
  ------------------
  |  Branch (251:19): [True: 32, False: 1]
  ------------------
  252|     32|            bmpBlockBits[i]&=mask;
  253|     32|        }
  254|      1|    }
  255|      1|}
_ZNK6icu_786BMPSet13findCodePointEiii:
  257|     18|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|     18|    if (c < list[lo])
  ------------------
  |  Branch (270:9): [True: 8, False: 10]
  ------------------
  271|      8|        return lo;
  272|       |    // High runner test.  c is often after the last range, so an
  273|       |    // initial check for this condition pays off.
  274|     10|    if (lo >= hi || c >= list[hi-1])
  ------------------
  |  Branch (274:9): [True: 0, False: 10]
  |  Branch (274:21): [True: 0, False: 10]
  ------------------
  275|      0|        return hi;
  276|       |    // invariant: c >= list[lo]
  277|       |    // invariant: c < list[hi]
  278|    107|    for (;;) {
  279|    107|        int32_t i = (lo + hi) >> 1;
  280|    107|        if (i == lo) {
  ------------------
  |  Branch (280:13): [True: 10, False: 97]
  ------------------
  281|     10|            break; // Found!
  282|     97|        } else if (c < list[i]) {
  ------------------
  |  Branch (282:20): [True: 60, False: 37]
  ------------------
  283|     60|            hi = i;
  284|     60|        } else {
  285|     37|            lo = i;
  286|     37|        }
  287|    107|    }
  288|     10|    return hi;
  289|     10|}
bmpset.cpp:_ZN6icu_78L12set32x64BitsEPjii:
   70|     64|static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) {
   71|     64|    U_ASSERT(start<limit);
  ------------------
  |  |   35|     64|#   define U_ASSERT(exp) (void)0
  ------------------
   72|     64|    U_ASSERT(limit<=0x800);
  ------------------
  |  |   35|     64|#   define U_ASSERT(exp) (void)0
  ------------------
   73|       |
   74|     64|    int32_t lead=start>>6;  // Named for UTF-8 2-byte lead byte with upper 5 bits.
   75|     64|    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|     64|    uint32_t bits = static_cast<uint32_t>(1) << lead;
   79|     64|    if((start+1)==limit) {  // Single-character shortcut.
  ------------------
  |  Branch (79:8): [True: 21, False: 43]
  ------------------
   80|     21|        table[trail]|=bits;
   81|     21|        return;
   82|     21|    }
   83|       |
   84|     43|    int32_t limitLead=limit>>6;
   85|     43|    int32_t limitTrail=limit&0x3f;
   86|       |
   87|     43|    if(lead==limitLead) {
  ------------------
  |  Branch (87:8): [True: 30, False: 13]
  ------------------
   88|       |        // Partial vertical bit column.
   89|    308|        while(trail<limitTrail) {
  ------------------
  |  Branch (89:15): [True: 278, False: 30]
  ------------------
   90|    278|            table[trail++]|=bits;
   91|    278|        }
   92|     30|    } else {
   93|       |        // Partial vertical bit column,
   94|       |        // followed by a bit rectangle,
   95|       |        // followed by another partial vertical bit column.
   96|     13|        if(trail>0) {
  ------------------
  |  Branch (96:12): [True: 13, False: 0]
  ------------------
   97|    368|            do {
   98|    368|                table[trail++]|=bits;
   99|    368|            } while(trail<64);
  ------------------
  |  Branch (99:21): [True: 355, False: 13]
  ------------------
  100|     13|            ++lead;
  101|     13|        }
  102|     13|        if(lead<limitLead) {
  ------------------
  |  Branch (102:12): [True: 6, False: 7]
  ------------------
  103|      6|            bits = ~((static_cast<unsigned>(1) << lead) - 1);
  104|      6|            if(limitLead<0x20) {
  ------------------
  |  Branch (104:16): [True: 6, False: 0]
  ------------------
  105|      6|                bits &= (static_cast<unsigned>(1) << limitLead) - 1;
  106|      6|            }
  107|    390|            for(trail=0; trail<64; ++trail) {
  ------------------
  |  Branch (107:26): [True: 384, False: 6]
  ------------------
  108|    384|                table[trail]|=bits;
  109|    384|            }
  110|      6|        }
  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|     13|        bits = static_cast<uint32_t>(1) << ((limitLead == 0x20) ? (limitLead - 1) : limitLead);
  ------------------
  |  Branch (114:45): [True: 0, False: 13]
  ------------------
  115|    348|        for(trail=0; trail<limitTrail; ++trail) {
  ------------------
  |  Branch (115:22): [True: 335, False: 13]
  ------------------
  116|    335|            table[trail]|=bits;
  117|    335|        }
  118|     13|    }
  119|     43|}

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

_ZN6icu_7819LanguageBreakEngineC2Ev:
   44|    689|LanguageBreakEngine::LanguageBreakEngine() {
   45|    689|}
_ZN6icu_7819LanguageBreakEngineD2Ev:
   47|    684|LanguageBreakEngine::~LanguageBreakEngine() {
   48|    684|}
_ZN6icu_7820LanguageBreakFactoryC2Ev:
   54|      1|LanguageBreakFactory::LanguageBreakFactory() {
   55|      1|}
_ZN6icu_7815UnhandledEngineC2ER10UErrorCode:
   64|    684|UnhandledEngine::UnhandledEngine(UErrorCode &status) : fHandled(nullptr) {
   65|    684|    (void)status;
   66|    684|}
_ZN6icu_7815UnhandledEngineD2Ev:
   68|    684|UnhandledEngine::~UnhandledEngine() {
   69|    684|    delete fHandled;
   70|    684|    fHandled = nullptr;
   71|    684|}
_ZNK6icu_7815UnhandledEngine7handlesEiPKc:
   74|   255k|UnhandledEngine::handles(UChar32 c, const char* locale) const {
   75|   255k|    (void)locale; // Unused
   76|   255k|    return fHandled && fHandled->contains(c);
  ------------------
  |  Branch (76:12): [True: 255k, False: 0]
  |  Branch (76:24): [True: 215k, False: 40.3k]
  ------------------
   77|   255k|}
_ZNK6icu_7815UnhandledEngine10findBreaksEP5UTextiiRNS_9UVector32EaR10UErrorCode:
   85|   255k|                             UErrorCode &status) const {
   86|   255k|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (86:9): [True: 0, False: 255k]
  ------------------
   87|   255k|    utext_setNativeIndex(text, startPos);
  ------------------
  |  | 1915|   255k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   255k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   255k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   255k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   88|   255k|    UChar32 c = utext_current32(text);
  ------------------
  |  | 1893|   255k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|   255k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   255k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   255k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   89|  1.38M|    while (static_cast<int32_t>(utext_getNativeIndex(text)) < endPos && fHandled->contains(c)) {
  ------------------
  |  | 1897|  1.38M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.38M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.38M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.38M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (89:12): [True: 1.21M, False: 173k]
  |  Branch (89:73): [True: 1.13M, False: 82.8k]
  ------------------
   90|  1.13M|        utext_next32(text);            // TODO:  recast loop to work with post-increment operations.
  ------------------
  |  | 1904|  1.13M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  1.13M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.13M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.13M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   91|  1.13M|        c = utext_current32(text);
  ------------------
  |  | 1893|  1.13M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  1.13M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.13M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.13M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   92|  1.13M|    }
   93|   255k|    return 0;
   94|   255k|}
_ZN6icu_7815UnhandledEngine15handleCharacterEi:
   97|  40.5k|UnhandledEngine::handleCharacter(UChar32 c) {
   98|  40.5k|    if (fHandled == nullptr) {
  ------------------
  |  Branch (98:9): [True: 684, False: 39.8k]
  ------------------
   99|    684|        fHandled = new UnicodeSet();
  100|    684|        if (fHandled == nullptr) {
  ------------------
  |  Branch (100:13): [True: 0, False: 684]
  ------------------
  101|      0|            return;
  102|      0|        }
  103|    684|    }
  104|  40.5k|    if (!fHandled->contains(c)) {
  ------------------
  |  Branch (104:9): [True: 40.5k, False: 0]
  ------------------
  105|  40.5k|        UErrorCode status = U_ZERO_ERROR;
  106|       |        // Apply the entire script of the character.
  107|  40.5k|        int32_t script = u_getIntPropertyValue(c, UCHAR_SCRIPT);
  ------------------
  |  |  280|  40.5k|#define u_getIntPropertyValue U_ICU_ENTRY_POINT_RENAME(u_getIntPropertyValue)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  108|  40.5k|        fHandled->applyIntPropertyValue(UCHAR_SCRIPT, script, status);
  109|  40.5k|    }
  110|  40.5k|}
_ZN6icu_7823ICULanguageBreakFactoryC2ER10UErrorCode:
  116|      1|ICULanguageBreakFactory::ICULanguageBreakFactory(UErrorCode &/*status*/) {
  117|      1|    fEngines = nullptr;
  118|      1|}
_ZN6icu_7823ICULanguageBreakFactory13ensureEnginesER10UErrorCode:
  124|  45.3k|void ICULanguageBreakFactory::ensureEngines(UErrorCode& status) {
  125|  45.3k|    static UMutex gBreakEngineMutex;
  126|  45.3k|    Mutex m(&gBreakEngineMutex);
  127|  45.3k|    if (fEngines == nullptr) {
  ------------------
  |  Branch (127:9): [True: 1, False: 45.3k]
  ------------------
  128|      1|        LocalPointer<UStack>  engines(new UStack(uprv_deleteUObject, nullptr, status), status);
  ------------------
  |  | 1489|      1|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  129|      1|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (129:13): [True: 1, False: 0]
  ------------------
  130|      1|            fEngines = engines.orphan();
  131|      1|        }
  132|      1|    }
  133|  45.3k|}
_ZN6icu_7823ICULanguageBreakFactory12getEngineForEiPKc:
  136|  45.3k|ICULanguageBreakFactory::getEngineFor(UChar32 c, const char* locale) {
  137|  45.3k|    const LanguageBreakEngine *lbe = nullptr;
  138|  45.3k|    UErrorCode  status = U_ZERO_ERROR;
  139|  45.3k|    ensureEngines(status);
  140|  45.3k|    if (U_FAILURE(status) ) {
  ------------------
  |  Branch (140:9): [True: 0, False: 45.3k]
  ------------------
  141|       |        // Note: no way to return error code to caller.
  142|      0|        return nullptr;
  143|      0|    }
  144|       |
  145|  45.3k|    static UMutex gBreakEngineMutex;
  146|  45.3k|    Mutex m(&gBreakEngineMutex);
  147|  45.3k|    int32_t i = fEngines->size();
  148|   262k|    while (--i >= 0) {
  ------------------
  |  Branch (148:12): [True: 221k, False: 40.5k]
  ------------------
  149|   221k|        lbe = static_cast<const LanguageBreakEngine*>(fEngines->elementAt(i));
  150|   221k|        if (lbe != nullptr && lbe->handles(c, locale)) {
  ------------------
  |  Branch (150:13): [True: 221k, False: 0]
  |  Branch (150:31): [True: 4.81k, False: 216k]
  ------------------
  151|  4.81k|            return lbe;
  152|  4.81k|        }
  153|   221k|    }
  154|       |
  155|       |    // We didn't find an engine. Create one.
  156|  40.5k|    lbe = loadEngineFor(c, locale);
  157|  40.5k|    if (lbe != nullptr) {
  ------------------
  |  Branch (157:9): [True: 5, False: 40.5k]
  ------------------
  158|      5|        fEngines->push((void *)lbe, status);
  159|      5|    }
  160|  40.5k|    return U_SUCCESS(status) ? lbe : nullptr;
  ------------------
  |  Branch (160:12): [True: 40.5k, False: 0]
  ------------------
  161|  45.3k|}
_ZN6icu_7823ICULanguageBreakFactory13loadEngineForEiPKc:
  164|  40.5k|ICULanguageBreakFactory::loadEngineFor(UChar32 c, const char*) {
  165|  40.5k|    UErrorCode status = U_ZERO_ERROR;
  166|  40.5k|    UScriptCode code = uscript_getScript(c, &status);
  ------------------
  |  | 1706|  40.5k|#define uscript_getScript U_ICU_ENTRY_POINT_RENAME(uscript_getScript)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|  40.5k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (167:9): [True: 40.5k, False: 0]
  ------------------
  168|  40.5k|        const LanguageBreakEngine *engine = nullptr;
  169|       |        // Try to use LSTM first
  170|  40.5k|        const LSTMData *data = CreateLSTMDataForScript(code, status);
  ------------------
  |  |   63|  40.5k|#define CreateLSTMDataForScript U_ICU_ENTRY_POINT_RENAME(CreateLSTMDataForScript)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  171|  40.5k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (171:13): [True: 40.5k, False: 4]
  ------------------
  172|  40.5k|            if (data != nullptr) {
  ------------------
  |  Branch (172:17): [True: 0, False: 40.5k]
  ------------------
  173|      0|                engine = CreateLSTMBreakEngine(code, data, status);
  ------------------
  |  |   61|      0|#define CreateLSTMBreakEngine U_ICU_ENTRY_POINT_RENAME(CreateLSTMBreakEngine)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  174|      0|                if (U_SUCCESS(status) && engine != nullptr) {
  ------------------
  |  Branch (174:21): [True: 0, False: 0]
  |  Branch (174:42): [True: 0, False: 0]
  ------------------
  175|      0|                    return engine;
  176|      0|                }
  177|      0|                if (engine != nullptr) {
  ------------------
  |  Branch (177:21): [True: 0, False: 0]
  ------------------
  178|      0|                    delete engine;
  179|      0|                    engine = nullptr;
  180|      0|                } else {
  181|      0|                    DeleteLSTMData(data);
  ------------------
  |  |   64|      0|#define DeleteLSTMData U_ICU_ENTRY_POINT_RENAME(DeleteLSTMData)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  182|      0|                }
  183|      0|            }
  184|  40.5k|        }
  185|  40.5k|        status = U_ZERO_ERROR;  // fallback to dictionary based
  186|  40.5k|        DictionaryMatcher *m = loadDictionaryMatcherFor(code);
  187|  40.5k|        if (m != nullptr) {
  ------------------
  |  Branch (187:13): [True: 5, False: 40.5k]
  ------------------
  188|      5|            switch(code) {
  189|      1|            case USCRIPT_THAI:
  ------------------
  |  Branch (189:13): [True: 1, False: 4]
  ------------------
  190|      1|                engine = new ThaiBreakEngine(m, status);
  191|      1|                break;
  192|      1|            case USCRIPT_LAO:
  ------------------
  |  Branch (192:13): [True: 1, False: 4]
  ------------------
  193|      1|                engine = new LaoBreakEngine(m, status);
  194|      1|                break;
  195|      1|            case USCRIPT_MYANMAR:
  ------------------
  |  Branch (195:13): [True: 1, False: 4]
  ------------------
  196|      1|                engine = new BurmeseBreakEngine(m, status);
  197|      1|                break;
  198|      1|            case USCRIPT_KHMER:
  ------------------
  |  Branch (198:13): [True: 1, False: 4]
  ------------------
  199|      1|                engine = new KhmerBreakEngine(m, status);
  200|      1|                break;
  201|       |
  202|      0|#if !UCONFIG_NO_NORMALIZATION
  203|       |                // CJK not available w/o normalization
  204|      0|            case USCRIPT_HANGUL:
  ------------------
  |  Branch (204:13): [True: 0, False: 5]
  ------------------
  205|      0|                engine = new CjkBreakEngine(m, kKorean, status);
  206|      0|                break;
  207|       |
  208|       |            // use same BreakEngine and dictionary for both Chinese and Japanese
  209|      0|            case USCRIPT_HIRAGANA:
  ------------------
  |  Branch (209:13): [True: 0, False: 5]
  ------------------
  210|      0|            case USCRIPT_KATAKANA:
  ------------------
  |  Branch (210:13): [True: 0, False: 5]
  ------------------
  211|      1|            case USCRIPT_HAN:
  ------------------
  |  Branch (211:13): [True: 1, False: 4]
  ------------------
  212|      1|                engine = new CjkBreakEngine(m, kChineseJapanese, status);
  213|      1|                break;
  214|       |#if 0
  215|       |            // TODO: Have to get some characters with script=common handled
  216|       |            // by CjkBreakEngine (e.g. U+309B). Simply subjecting
  217|       |            // them to CjkBreakEngine does not work. The engine has to
  218|       |            // special-case them.
  219|       |            case USCRIPT_COMMON:
  220|       |            {
  221|       |                UBlockCode block = ublock_getCode(code);
  222|       |                if (block == UBLOCK_HIRAGANA || block == UBLOCK_KATAKANA)
  223|       |                   engine = new CjkBreakEngine(dict, kChineseJapanese, status);
  224|       |                break;
  225|       |            }
  226|       |#endif
  227|      0|#endif
  228|       |
  229|      0|            default:
  ------------------
  |  Branch (229:13): [True: 0, False: 5]
  ------------------
  230|      0|                break;
  231|      5|            }
  232|      5|            if (engine == nullptr) {
  ------------------
  |  Branch (232:17): [True: 0, False: 5]
  ------------------
  233|      0|                delete m;
  234|      0|            }
  235|      5|            else if (U_FAILURE(status)) {
  ------------------
  |  Branch (235:22): [True: 0, False: 5]
  ------------------
  236|      0|                delete engine;
  237|      0|                engine = nullptr;
  238|      0|            }
  239|      5|            return engine;
  240|      5|        }
  241|  40.5k|    }
  242|  40.5k|    return nullptr;
  243|  40.5k|}
_ZN6icu_7823ICULanguageBreakFactory24loadDictionaryMatcherForE11UScriptCode:
  246|  40.5k|ICULanguageBreakFactory::loadDictionaryMatcherFor(UScriptCode script) { 
  247|  40.5k|    UErrorCode status = U_ZERO_ERROR;
  248|       |    // open root from brkitr tree.
  249|  40.5k|    UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, "", &status);
  ------------------
  |  | 1691|  40.5k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, "", &status);
  ------------------
  |  |   13|  40.5k|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|  40.5k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  250|  40.5k|    b = ures_getByKeyWithFallback(b, "dictionaries", b, &status);
  ------------------
  |  | 1662|  40.5k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  251|  40.5k|    int32_t dictnlength = 0;
  252|  40.5k|    const char16_t *dictfname =
  253|  40.5k|        ures_getStringByKeyWithFallback(b, uscript_getShortName(script), &dictnlength, &status);
  ------------------
  |  | 1678|  40.5k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      ures_getStringByKeyWithFallback(b, uscript_getShortName(script), &dictnlength, &status);
  ------------------
  |  | 1708|  40.5k|#define uscript_getShortName U_ICU_ENTRY_POINT_RENAME(uscript_getShortName)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  254|  40.5k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (254:9): [True: 40.5k, False: 5]
  ------------------
  255|  40.5k|        ures_close(b);
  ------------------
  |  | 1652|  40.5k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|  40.5k|        return nullptr;
  257|  40.5k|    }
  258|      5|    CharString dictnbuf;
  259|      5|    CharString ext;
  260|      5|    const char16_t *extStart = u_memrchr(dictfname, 0x002e, dictnlength);  // last dot
  ------------------
  |  |  336|      5|#define u_memrchr U_ICU_ENTRY_POINT_RENAME(u_memrchr)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  261|      5|    if (extStart != nullptr) {
  ------------------
  |  Branch (261:9): [True: 5, False: 0]
  ------------------
  262|      5|        int32_t len = static_cast<int32_t>(extStart - dictfname);
  263|      5|        ext.appendInvariantChars(UnicodeString(false, extStart + 1, dictnlength - len - 1), status);
  264|      5|        dictnlength = len;
  265|      5|    }
  266|      5|    dictnbuf.appendInvariantChars(UnicodeString(false, dictfname, dictnlength), status);
  267|      5|    ures_close(b);
  ------------------
  |  | 1652|      5|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|       |
  269|      5|    UDataMemory *file = udata_open(U_ICUDATA_BRKITR, ext.data(), dictnbuf.data(), &status);
  ------------------
  |  |  893|      5|#define udata_open U_ICU_ENTRY_POINT_RENAME(udata_open)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UDataMemory *file = udata_open(U_ICUDATA_BRKITR, ext.data(), dictnbuf.data(), &status);
  ------------------
  |  |   13|      5|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|      5|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  270|      5|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (270:9): [True: 5, False: 0]
  ------------------
  271|       |        // build trie
  272|      5|        const uint8_t* data = static_cast<const uint8_t*>(udata_getMemory(file));
  ------------------
  |  |  891|      5|#define udata_getMemory U_ICU_ENTRY_POINT_RENAME(udata_getMemory)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|      5|        const int32_t* indexes = reinterpret_cast<const int32_t*>(data);
  274|      5|        const int32_t offset = indexes[DictionaryData::IX_STRING_TRIE_OFFSET];
  275|      5|        const int32_t trieType = indexes[DictionaryData::IX_TRIE_TYPE] & DictionaryData::TRIE_TYPE_MASK;
  276|      5|        DictionaryMatcher *m = nullptr;
  277|      5|        if (trieType == DictionaryData::TRIE_TYPE_BYTES) {
  ------------------
  |  Branch (277:13): [True: 4, False: 1]
  ------------------
  278|      4|            const int32_t transform = indexes[DictionaryData::IX_TRANSFORM];
  279|      4|            const char* characters = reinterpret_cast<const char*>(data + offset);
  280|      4|            m = new BytesDictionaryMatcher(characters, transform, file);
  281|      4|        }
  282|      1|        else if (trieType == DictionaryData::TRIE_TYPE_UCHARS) {
  ------------------
  |  Branch (282:18): [True: 1, False: 0]
  ------------------
  283|      1|            const char16_t* characters = reinterpret_cast<const char16_t*>(data + offset);
  284|      1|            m = new UCharsDictionaryMatcher(characters, file);
  285|      1|        }
  286|      5|        if (m == nullptr) {
  ------------------
  |  Branch (286:13): [True: 0, False: 5]
  ------------------
  287|       |            // no matcher exists to take ownership - either we are an invalid 
  288|       |            // type or memory allocation failed
  289|      0|            udata_close(file);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  290|      0|        }
  291|      5|        return m;
  292|      5|    } else if (dictfname != nullptr) {
  ------------------
  |  Branch (292:16): [True: 0, False: 0]
  ------------------
  293|       |        // we don't have a dictionary matcher.
  294|       |        // returning nullptr here will cause us to fail to find a dictionary break engine, as expected
  295|      0|        status = U_ZERO_ERROR;
  296|      0|        return nullptr;
  297|      0|    }
  298|      0|    return nullptr;
  299|      5|}

_ZN6icu_7813BreakIterator13buildInstanceERKNS_6LocaleEPKcR10UErrorCode:
   59|  14.7k|{
   60|  14.7k|    char fnbuff[256];
   61|  14.7k|    char ext[4]={'\0'};
   62|  14.7k|    CharString actual;
   63|  14.7k|    int32_t size;
   64|  14.7k|    const char16_t* brkfname = nullptr;
   65|  14.7k|    UResourceBundle brkRulesStack;
   66|  14.7k|    UResourceBundle brkNameStack;
   67|  14.7k|    UResourceBundle *brkRules = &brkRulesStack;
   68|  14.7k|    UResourceBundle *brkName  = &brkNameStack;
   69|  14.7k|    RuleBasedBreakIterator *result = nullptr;
   70|       |
   71|  14.7k|    if (U_FAILURE(status))
  ------------------
  |  Branch (71:9): [True: 0, False: 14.7k]
  ------------------
   72|      0|        return nullptr;
   73|       |
   74|  14.7k|    ures_initStackObject(brkRules);
  ------------------
  |  | 1690|  14.7k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|  14.7k|    ures_initStackObject(brkName);
  ------------------
  |  | 1690|  14.7k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|       |
   77|       |    // Get the locale
   78|  14.7k|    UResourceBundle *b = ures_openNoDefault(U_ICUDATA_BRKITR, loc.getName(), &status);
  ------------------
  |  | 1696|  14.7k|#define ures_openNoDefault U_ICU_ENTRY_POINT_RENAME(ures_openNoDefault)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle *b = ures_openNoDefault(U_ICUDATA_BRKITR, loc.getName(), &status);
  ------------------
  |  |   13|  14.7k|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|  14.7k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
   79|       |
   80|       |    // Get the "boundaries" array.
   81|  14.7k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (81:9): [True: 14.7k, False: 29]
  ------------------
   82|  14.7k|        brkRules = ures_getByKeyWithFallback(b, "boundaries", brkRules, &status);
  ------------------
  |  | 1662|  14.7k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|       |        // Get the string object naming the rules file
   84|  14.7k|        brkName = ures_getByKeyWithFallback(brkRules, type, brkName, &status);
  ------------------
  |  | 1662|  14.7k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   85|       |        // Get the actual string
   86|  14.7k|        brkfname = ures_getString(brkName, &size, &status);
  ------------------
  |  | 1675|  14.7k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   87|  14.7k|        U_ASSERT((size_t)size<sizeof(fnbuff));
  ------------------
  |  |   35|  14.7k|#   define U_ASSERT(exp) (void)0
  ------------------
   88|  14.7k|        if (static_cast<size_t>(size) >= sizeof(fnbuff)) {
  ------------------
  |  Branch (88:13): [True: 0, False: 14.7k]
  ------------------
   89|      0|            size=0;
   90|      0|            if (U_SUCCESS(status)) {
  ------------------
  |  Branch (90:17): [True: 0, False: 0]
  ------------------
   91|      0|                status = U_BUFFER_OVERFLOW_ERROR;
   92|      0|            }
   93|      0|        }
   94|       |
   95|       |        // Use the string if we found it
   96|  14.7k|        if (U_SUCCESS(status) && brkfname) {
  ------------------
  |  Branch (96:13): [True: 14.7k, False: 0]
  |  Branch (96:34): [True: 14.7k, False: 0]
  ------------------
   97|  14.7k|            actual.append(ures_getLocaleInternal(brkName, &status), -1, status);
  ------------------
  |  | 1670|  14.7k|#define ures_getLocaleInternal U_ICU_ENTRY_POINT_RENAME(ures_getLocaleInternal)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|       |
   99|  14.7k|            char16_t* extStart=u_strchr(brkfname, 0x002e);
  ------------------
  |  |  385|  14.7k|#define u_strchr U_ICU_ENTRY_POINT_RENAME(u_strchr)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  100|  14.7k|            int len = 0;
  101|  14.7k|            if (extStart != nullptr){
  ------------------
  |  Branch (101:17): [True: 14.7k, False: 0]
  ------------------
  102|  14.7k|                len = static_cast<int>(extStart - brkfname);
  103|  14.7k|                u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff
  ------------------
  |  |  211|  14.7k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  104|  14.7k|                u_UCharsToChars(brkfname, fnbuff, len);
  ------------------
  |  |  211|  14.7k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  105|  14.7k|            }
  106|  14.7k|            fnbuff[len]=0; // nul terminate
  107|  14.7k|        }
  108|  14.7k|    }
  109|       |
  110|  14.7k|    ures_close(brkRules);
  ------------------
  |  | 1652|  14.7k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  111|  14.7k|    ures_close(brkName);
  ------------------
  |  | 1652|  14.7k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|       |
  113|  14.7k|    UDataMemory* file = udata_open(U_ICUDATA_BRKITR, ext, fnbuff, &status);
  ------------------
  |  |  893|  14.7k|#define udata_open U_ICU_ENTRY_POINT_RENAME(udata_open)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UDataMemory* file = udata_open(U_ICUDATA_BRKITR, ext, fnbuff, &status);
  ------------------
  |  |   13|  14.7k|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|  14.7k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  114|  14.7k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (114:9): [True: 29, False: 14.7k]
  ------------------
  115|     29|        ures_close(b);
  ------------------
  |  | 1652|     29|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|     29|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     29|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     29|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|     29|        return nullptr;
  117|     29|    }
  118|       |
  119|       |    // Create a RuleBasedBreakIterator
  120|  14.7k|    result = new RuleBasedBreakIterator(file, uprv_strstr(type, "phrase") != nullptr, status);
  ------------------
  |  |   41|  14.7k|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|  14.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  121|       |
  122|       |    // If there is a result, set the valid locale and actual locale, and the kind
  123|  14.7k|    if (U_SUCCESS(status) && result != nullptr) {
  ------------------
  |  Branch (123:9): [True: 14.7k, False: 0]
  |  Branch (123:30): [True: 14.7k, False: 0]
  ------------------
  124|  14.7k|        U_LOCALE_BASED(locBased, *(BreakIterator*)result);
  ------------------
  |  |   25|  14.7k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  125|       |
  126|  14.7k|        locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status),
  ------------------
  |  | 1669|  14.7k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  127|  14.7k|                              actual.data(), status);
  128|  14.7k|        LocaleBased::setLocaleID(loc.getName(), result->requestLocale, status);
  129|  14.7k|    }
  130|       |
  131|  14.7k|    ures_close(b);
  ------------------
  |  | 1652|  14.7k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|       |
  133|  14.7k|    if (U_FAILURE(status) && result != nullptr) {  // Sometimes redundant check, but simple
  ------------------
  |  Branch (133:9): [True: 0, False: 14.7k]
  |  Branch (133:30): [True: 0, False: 0]
  ------------------
  134|      0|        delete result;
  135|      0|        return nullptr;
  136|      0|    }
  137|       |
  138|  14.7k|    if (result == nullptr) {
  ------------------
  |  Branch (138:9): [True: 0, False: 14.7k]
  ------------------
  139|      0|        udata_close(file);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  140|      0|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (140:13): [True: 0, False: 0]
  ------------------
  141|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  142|      0|        }
  143|      0|    }
  144|       |
  145|  14.7k|    return result;
  146|  14.7k|}
_ZN6icu_7813BreakIterator18createWordInstanceERKNS_6LocaleER10UErrorCode:
  151|  7.39k|{
  152|  7.39k|    return createInstance(key, UBRK_WORD, status);
  153|  7.39k|}
_ZN6icu_7813BreakIterator18createLineInstanceERKNS_6LocaleER10UErrorCode:
  160|  3.79k|{
  161|  3.79k|    return createInstance(key, UBRK_LINE, status);
  162|  3.79k|}
_ZN6icu_7813BreakIterator23createCharacterInstanceERKNS_6LocaleER10UErrorCode:
  169|    672|{
  170|    672|    return createInstance(key, UBRK_CHARACTER, status);
  171|    672|}
_ZN6icu_7813BreakIterator22createSentenceInstanceERKNS_6LocaleER10UErrorCode:
  178|  2.00k|{
  179|  2.00k|    return createInstance(key, UBRK_SENTENCE, status);
  180|  2.00k|}
_ZN6icu_7813BreakIterator19createTitleInstanceERKNS_6LocaleER10UErrorCode:
  187|    924|{
  188|    924|    return createInstance(key, UBRK_TITLE, status);
  189|    924|}
_ZN6icu_7813BreakIteratorC2Ev:
  207|  14.7k|{
  208|  14.7k|}
_ZN6icu_7813BreakIteratorD2Ev:
  230|  14.9k|{
  231|  14.9k|    delete validLocale;
  232|  14.9k|    delete actualLocale;
  233|  14.9k|    delete requestLocale;
  234|  14.9k|}
_ZN6icu_7813BreakIterator14createInstanceERKNS_6LocaleEiR10UErrorCode:
  381|  14.7k|{
  382|  14.7k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (382:9): [True: 0, False: 14.7k]
  ------------------
  383|      0|        return nullptr;
  384|      0|    }
  385|       |
  386|  14.7k|#if !UCONFIG_NO_SERVICE
  387|  14.7k|    if (hasService()) {
  ------------------
  |  Branch (387:9): [True: 0, False: 14.7k]
  ------------------
  388|      0|        Locale actualLoc("");
  389|      0|        BreakIterator *result = (BreakIterator*)gService->get(loc, kind, &actualLoc, status);
  390|       |        // TODO: The way the service code works in ICU 2.8 is that if
  391|       |        // there is a real registered break iterator, the actualLoc
  392|       |        // will be populated, but if the handleDefault path is taken
  393|       |        // (because nothing is registered that can handle the
  394|       |        // requested locale) then the actualLoc comes back empty.  In
  395|       |        // that case, the returned object already has its actual/valid
  396|       |        // locale data populated (by makeInstance, which is what
  397|       |        // handleDefault calls), so we don't touch it.  YES, A COMMENT
  398|       |        // THIS LONG is a sign of bad code -- so the action item is to
  399|       |        // revisit this in ICU 3.0 and clean it up/fix it/remove it.
  400|      0|        if (U_SUCCESS(status) && (result != nullptr) && *actualLoc.getName() != 0) {
  ------------------
  |  Branch (400:13): [True: 0, False: 0]
  |  Branch (400:34): [True: 0, False: 0]
  |  Branch (400:57): [True: 0, False: 0]
  ------------------
  401|      0|            U_LOCALE_BASED(locBased, *result);
  ------------------
  |  |   25|      0|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  402|      0|            locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName(), status);
  403|      0|        }
  404|      0|        return result;
  405|      0|    }
  406|  14.7k|    else
  407|  14.7k|#endif
  408|  14.7k|    {
  409|  14.7k|        return makeInstance(loc, kind, status);
  410|  14.7k|    }
  411|  14.7k|}
_ZN6icu_7813BreakIterator12makeInstanceERKNS_6LocaleEiR10UErrorCode:
  418|  14.7k|{
  419|       |
  420|  14.7k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (420:9): [True: 0, False: 14.7k]
  ------------------
  421|      0|        return nullptr;
  422|      0|    }
  423|       |
  424|  14.7k|    BreakIterator *result = nullptr;
  425|  14.7k|    switch (kind) {
  426|    672|    case UBRK_CHARACTER:
  ------------------
  |  Branch (426:5): [True: 672, False: 14.1k]
  ------------------
  427|    672|        {
  428|    672|            UTRACE_ENTRY(UTRACE_UBRK_CREATE_CHARACTER);
  429|    672|            result = BreakIterator::buildInstance(loc, "grapheme", status);
  430|    672|            UTRACE_EXIT_STATUS(status);
  431|    672|        }
  432|    672|        break;
  433|  7.39k|    case UBRK_WORD:
  ------------------
  |  Branch (433:5): [True: 7.39k, False: 7.39k]
  ------------------
  434|  7.39k|        {
  435|  7.39k|            UTRACE_ENTRY(UTRACE_UBRK_CREATE_WORD);
  436|  7.39k|            result = BreakIterator::buildInstance(loc, "word", status);
  437|  7.39k|            UTRACE_EXIT_STATUS(status);
  438|  7.39k|        }
  439|  7.39k|        break;
  440|  3.79k|    case UBRK_LINE:
  ------------------
  |  Branch (440:5): [True: 3.79k, False: 10.9k]
  ------------------
  441|  3.79k|        {
  442|  3.79k|            char lb_lw[kKeyValueLenMax];
  443|  3.79k|            UTRACE_ENTRY(UTRACE_UBRK_CREATE_LINE);
  444|  3.79k|            uprv_strcpy(lb_lw, "line");
  ------------------
  |  |   36|  3.79k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  3.79k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  445|  3.79k|            UErrorCode kvStatus = U_ZERO_ERROR;
  446|  3.79k|            auto value = loc.getKeywordValue<CharString>("lb", kvStatus);
  447|  3.79k|            if (U_SUCCESS(kvStatus) && (value == "strict" || value == "normal" || value == "loose")) {
  ------------------
  |  Branch (447:17): [True: 3.16k, False: 629]
  |  Branch (447:41): [True: 1, False: 3.16k]
  |  Branch (447:62): [True: 2, False: 3.16k]
  |  Branch (447:83): [True: 4, False: 3.16k]
  ------------------
  448|      7|                uprv_strcat(lb_lw, "_");
  ------------------
  |  |   39|      7|#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
  |  |  ------------------
  |  |  |  |  393|      7|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  449|      7|                uprv_strcat(lb_lw, value.data());
  ------------------
  |  |   39|      7|#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
  |  |  ------------------
  |  |  |  |  393|      7|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  450|      7|            }
  451|       |            // lw=phrase is only supported in Japanese and Korean
  452|  3.79k|            if (uprv_strcmp(loc.getLanguage(), "ja") == 0 || uprv_strcmp(loc.getLanguage(), "ko") == 0) {
  ------------------
  |  |   38|  3.79k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  3.79k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                          if (uprv_strcmp(loc.getLanguage(), "ja") == 0 || uprv_strcmp(loc.getLanguage(), "ko") == 0) {
  ------------------
  |  |   38|  3.64k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  3.64k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (452:17): [True: 152, False: 3.64k]
  |  Branch (452:62): [True: 49, False: 3.59k]
  ------------------
  453|    201|                value = loc.getKeywordValue<CharString>("lw", kvStatus);
  454|    201|                if (U_SUCCESS(kvStatus) && value == "phrase") {
  ------------------
  |  Branch (454:21): [True: 197, False: 4]
  |  Branch (454:44): [True: 1, False: 196]
  ------------------
  455|      1|                    uprv_strcat(lb_lw, "_");
  ------------------
  |  |   39|      1|#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  456|      1|                    uprv_strcat(lb_lw, value.data());
  ------------------
  |  |   39|      1|#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  457|      1|                }
  458|    201|            }
  459|  3.79k|            result = BreakIterator::buildInstance(loc, lb_lw, status);
  460|       |
  461|  3.79k|            UTRACE_DATA1(UTRACE_INFO, "lb_lw=%s", lb_lw);
  462|  3.79k|            UTRACE_EXIT_STATUS(status);
  463|  3.79k|        }
  464|  3.79k|        break;
  465|  2.00k|    case UBRK_SENTENCE:
  ------------------
  |  Branch (465:5): [True: 2.00k, False: 12.7k]
  ------------------
  466|  2.00k|        {
  467|  2.00k|            UTRACE_ENTRY(UTRACE_UBRK_CREATE_SENTENCE);
  468|  2.00k|            result = BreakIterator::buildInstance(loc, "sentence", status);
  469|  2.00k|#if !UCONFIG_NO_FILTERED_BREAK_ITERATION
  470|  2.00k|            char ssKeyValue[kKeyValueLenMax] = {0};
  471|  2.00k|            UErrorCode kvStatus = U_ZERO_ERROR;
  472|  2.00k|            int32_t kLen = loc.getKeywordValue("ss", ssKeyValue, kKeyValueLenMax, kvStatus);
  473|  2.00k|            if (U_SUCCESS(kvStatus) && kLen > 0 && uprv_strcmp(ssKeyValue,"standard")==0) {
  ------------------
  |  |   38|    274|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    274|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (473:17): [True: 1.88k, False: 122]
  |  Branch (473:40): [True: 274, False: 1.60k]
  |  Branch (473:52): [True: 201, False: 73]
  ------------------
  474|    201|                FilteredBreakIteratorBuilder* fbiBuilder = FilteredBreakIteratorBuilder::createInstance(loc, kvStatus);
  475|    201|                if (U_SUCCESS(kvStatus)) {
  ------------------
  |  Branch (475:21): [True: 180, False: 21]
  ------------------
  476|    180|                    result = fbiBuilder->build(result, status);
  477|    180|                    delete fbiBuilder;
  478|    180|                }
  479|    201|            }
  480|  2.00k|#endif
  481|  2.00k|            UTRACE_EXIT_STATUS(status);
  482|  2.00k|        }
  483|  2.00k|        break;
  484|    924|    case UBRK_TITLE:
  ------------------
  |  Branch (484:5): [True: 924, False: 13.8k]
  ------------------
  485|    924|        {
  486|    924|            UTRACE_ENTRY(UTRACE_UBRK_CREATE_TITLE);
  487|    924|            result = BreakIterator::buildInstance(loc, "title", status);
  488|    924|            UTRACE_EXIT_STATUS(status);
  489|    924|        }
  490|    924|        break;
  491|      0|    default:
  ------------------
  |  Branch (491:5): [True: 0, False: 14.7k]
  ------------------
  492|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  493|  14.7k|    }
  494|       |
  495|  14.7k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (495:9): [True: 29, False: 14.7k]
  ------------------
  496|     29|        delete result;
  497|     29|        return nullptr;
  498|     29|    }
  499|       |
  500|  14.7k|    return result;
  501|  14.7k|}
_ZNK6icu_7813BreakIterator9getLocaleE18ULocDataLocaleTypeR10UErrorCode:
  504|    348|BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
  505|    348|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (505:9): [True: 0, False: 348]
  ------------------
  506|      0|        return Locale::getRoot();
  507|      0|    }
  508|    348|    if (type == ULOC_REQUESTED_LOCALE) {
  ------------------
  |  Branch (508:9): [True: 0, False: 348]
  ------------------
  509|      0|        return requestLocale == nullptr ?
  ------------------
  |  Branch (509:16): [True: 0, False: 0]
  ------------------
  510|      0|            Locale::getRoot() : Locale(requestLocale->data());
  511|      0|    }
  512|    348|    return LocaleBased::getLocale(validLocale, actualLocale, type, status);
  513|    348|}
_ZNK6icu_7813BreakIterator11getLocaleIDE18ULocDataLocaleTypeR10UErrorCode:
  516|  2.56M|BreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
  517|  2.56M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (517:9): [True: 0, False: 2.56M]
  ------------------
  518|      0|        return nullptr;
  519|      0|    }
  520|  2.56M|    if (type == ULOC_REQUESTED_LOCALE) {
  ------------------
  |  Branch (520:9): [True: 2.56M, False: 0]
  ------------------
  521|  2.56M|        return requestLocale == nullptr ?  "" : requestLocale->data();
  ------------------
  |  Branch (521:16): [True: 0, False: 2.56M]
  ------------------
  522|  2.56M|    }
  523|      0|    return LocaleBased::getLocaleID(validLocale, actualLocale, type, status);
  524|  2.56M|}
_ZN6icu_7813BreakIteratorC2ERKNS_6LocaleES3_:
  549|    174|BreakIterator::BreakIterator (const Locale& valid, const Locale& actual) {
  550|    174|  UErrorCode status = U_ZERO_ERROR;
  551|    174|  U_LOCALE_BASED(locBased, (*this));
  ------------------
  |  |   25|    174|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  552|    174|  locBased.setLocaleIDs(valid.getName(), actual.getName(), status);
  553|    174|  U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|    174|#   define U_ASSERT(exp) (void)0
  ------------------
  554|    174|}
brkiter.cpp:_ZN6icu_78L10hasServiceEv:
  333|  14.7k|{
  334|  14.7k|    return !gInitOnceBrkiter.isReset() && getService() != nullptr;
  ------------------
  |  Branch (334:12): [True: 0, False: 14.7k]
  |  Branch (334:43): [True: 0, False: 0]
  ------------------
  335|  14.7k|}

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

_ZN6icu_7814StringByteSinkINS_10CharStringEEC2EPS1_:
   52|  3.99k|  StringByteSink(CharString* dest) : CharStringByteSink(dest) { }
locid.cpp:_ZN6icu_7812ByteSinkUtil28viaByteSinkToTerminatedCharsIZZNS_6Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS5_11char_traitsIcEEEEPciR10UErrorCodeEUlRNS_8ByteSinkESC_E_vEEiSA_iOT_SC_:
  112|  9.29k|                                                UErrorCode& status) {
  113|  9.29k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (113:13): [True: 0, False: 9.29k]
  ------------------
  114|  9.29k|        CheckedArrayByteSink sink(buffer, capacity);
  115|  9.29k|        lambda(sink, status);
  116|  9.29k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (116:13): [True: 2.20k, False: 7.08k]
  ------------------
  117|       |
  118|  7.08k|        int32_t reslen = sink.NumberOfBytesAppended();
  119|       |
  120|  7.08k|        if (sink.Overflowed()) {
  ------------------
  |  Branch (120:13): [True: 495, False: 6.59k]
  ------------------
  121|    495|            status = U_BUFFER_OVERFLOW_ERROR;
  122|    495|            return reslen;
  123|    495|        }
  124|       |
  125|  6.59k|        return u_terminateChars(buffer, capacity, reslen, &status);
  ------------------
  |  |  406|  6.59k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|  6.59k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.59k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.59k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|  7.08k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil28viaByteSinkToTerminatedCharsIZ23uloc_getKeywordValue_78E3$_0vEEiPciOT_R10UErrorCode:
  112|  2.00k|                                                UErrorCode& status) {
  113|  2.00k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (113:13): [True: 0, False: 2.00k]
  ------------------
  114|  2.00k|        CheckedArrayByteSink sink(buffer, capacity);
  115|  2.00k|        lambda(sink, status);
  116|  2.00k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (116:13): [True: 118, False: 1.88k]
  ------------------
  117|       |
  118|  1.88k|        int32_t reslen = sink.NumberOfBytesAppended();
  119|       |
  120|  1.88k|        if (sink.Overflowed()) {
  ------------------
  |  Branch (120:13): [True: 4, False: 1.88k]
  ------------------
  121|      4|            status = U_BUFFER_OVERFLOW_ERROR;
  122|      4|            return reslen;
  123|      4|        }
  124|       |
  125|  1.88k|        return u_terminateChars(buffer, capacity, reslen, &status);
  ------------------
  |  |  406|  1.88k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|  1.88k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|  55.5k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  55.5k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 55.5k]
  ------------------
  143|  55.5k|        CharString result;
  144|  55.5k|        CharStringByteSink sink(&result);
  145|  55.5k|        lambda(sink, status);
  146|  55.5k|        return result;
  147|  55.5k|    }
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|    }
uloc_tag.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ25ulocimp_forLanguageTag_78PKciPiR10UErrorCodeE3$_0vEENS_10CharStringEOT_S6_:
  141|  3.93k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  3.93k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 3.93k]
  ------------------
  143|  3.93k|        CharString result;
  144|  3.93k|        CharStringByteSink sink(&result);
  145|  3.93k|        lambda(sink, status);
  146|  3.93k|        return result;
  147|  3.93k|    }

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

_ZN6icu_789BytesTrieD2Ev:
   26|  9.52M|BytesTrie::~BytesTrie() {
   27|  9.52M|    uprv_free(ownedArray_);
  ------------------
  |  | 1503|  9.52M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  9.52M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.52M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.52M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   28|  9.52M|}
_ZN6icu_789BytesTrie9readValueEPKhi:
   32|     41|BytesTrie::readValue(const uint8_t *pos, int32_t leadByte) {
   33|     41|    int32_t value;
   34|     41|    if(leadByte<kMinTwoByteValueLead) {
  ------------------
  |  Branch (34:8): [True: 21, False: 20]
  ------------------
   35|     21|        value=leadByte-kMinOneByteValueLead;
   36|     21|    } else if(leadByte<kMinThreeByteValueLead) {
  ------------------
  |  Branch (36:15): [True: 13, False: 7]
  ------------------
   37|     13|        value=((leadByte-kMinTwoByteValueLead)<<8)|*pos;
   38|     13|    } else if(leadByte<kFourByteValueLead) {
  ------------------
  |  Branch (38:15): [True: 2, False: 5]
  ------------------
   39|      2|        value=((leadByte-kMinThreeByteValueLead)<<16)|(pos[0]<<8)|pos[1];
   40|      5|    } else if(leadByte==kFourByteValueLead) {
  ------------------
  |  Branch (40:15): [True: 3, False: 2]
  ------------------
   41|      3|        value=(pos[0]<<16)|(pos[1]<<8)|pos[2];
   42|      3|    } else {
   43|      2|        value=(pos[0]<<24)|(pos[1]<<16)|(pos[2]<<8)|pos[3];
   44|      2|    }
   45|     41|    return value;
   46|     41|}
_ZN6icu_789BytesTrie11jumpByDeltaEPKh:
   49|  34.8M|BytesTrie::jumpByDelta(const uint8_t *pos) {
   50|  34.8M|    int32_t delta=*pos++;
   51|  34.8M|    if(delta<kMinTwoByteDeltaLead) {
  ------------------
  |  Branch (51:8): [True: 2.23M, False: 32.6M]
  ------------------
   52|       |        // nothing to do
   53|  32.6M|    } else if(delta<kMinThreeByteDeltaLead) {
  ------------------
  |  Branch (53:15): [True: 16.5M, False: 16.0M]
  ------------------
   54|  16.5M|        delta=((delta-kMinTwoByteDeltaLead)<<8)|*pos++;
   55|  16.5M|    } else if(delta<kFourByteDeltaLead) {
  ------------------
  |  Branch (55:15): [True: 16.0M, False: 0]
  ------------------
   56|  16.0M|        delta=((delta-kMinThreeByteDeltaLead)<<16)|(pos[0]<<8)|pos[1];
   57|  16.0M|        pos+=2;
   58|  16.0M|    } 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|  34.8M|    return pos+delta;
   66|  34.8M|}
_ZN6icu_789BytesTrie10branchNextEPKhii:
   81|  25.9M|BytesTrie::branchNext(const uint8_t *pos, int32_t length, int32_t inByte) {
   82|       |    // Branch according to the current byte.
   83|  25.9M|    if(length==0) {
  ------------------
  |  Branch (83:8): [True: 17.7M, False: 8.23M]
  ------------------
   84|  17.7M|        length=*pos++;
   85|  17.7M|    }
   86|  25.9M|    ++length;
   87|       |    // The length of the branch is the number of bytes to select from.
   88|       |    // The data structure encodes a binary search.
   89|  92.6M|    while(length>kMaxBranchLinearSubNodeLength) {
  ------------------
  |  Branch (89:11): [True: 66.7M, False: 25.9M]
  ------------------
   90|  66.7M|        if(inByte<*pos++) {
  ------------------
  |  Branch (90:12): [True: 34.8M, False: 31.8M]
  ------------------
   91|  34.8M|            length>>=1;
   92|  34.8M|            pos=jumpByDelta(pos);
   93|  34.8M|        } else {
   94|  31.8M|            length=length-(length>>1);
   95|  31.8M|            pos=skipDelta(pos);
   96|  31.8M|        }
   97|  66.7M|    }
   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|  56.4M|    do {
  102|  56.4M|        if(inByte==*pos++) {
  ------------------
  |  Branch (102:12): [True: 10.3M, False: 46.1M]
  ------------------
  103|  10.3M|            UStringTrieResult result;
  104|  10.3M|            int32_t node=*pos;
  105|  10.3M|            U_ASSERT(node>=kMinValueLead);
  ------------------
  |  |   35|  10.3M|#   define U_ASSERT(exp) (void)0
  ------------------
  106|  10.3M|            if(node&kValueIsFinal) {
  ------------------
  |  Branch (106:16): [True: 110k, False: 10.2M]
  ------------------
  107|       |                // Leave the final value for getValue() to read.
  108|   110k|                result=USTRINGTRIE_FINAL_VALUE;
  109|  10.2M|            } else {
  110|       |                // Use the non-final value as the jump delta.
  111|  10.2M|                ++pos;
  112|       |                // int32_t delta=readValue(pos, node>>1);
  113|  10.2M|                node>>=1;
  114|  10.2M|                int32_t delta;
  115|  10.2M|                if(node<kMinTwoByteValueLead) {
  ------------------
  |  Branch (115:20): [True: 640k, False: 9.59M]
  ------------------
  116|   640k|                    delta=node-kMinOneByteValueLead;
  117|  9.59M|                } else if(node<kMinThreeByteValueLead) {
  ------------------
  |  Branch (117:27): [True: 7.25M, False: 2.33M]
  ------------------
  118|  7.25M|                    delta=((node-kMinTwoByteValueLead)<<8)|*pos++;
  119|  7.25M|                } else if(node<kFourByteValueLead) {
  ------------------
  |  Branch (119:27): [True: 2.33M, False: 0]
  ------------------
  120|  2.33M|                    delta=((node-kMinThreeByteValueLead)<<16)|(pos[0]<<8)|pos[1];
  121|  2.33M|                    pos+=2;
  122|  2.33M|                } 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.2M|                pos+=delta;
  131|  10.2M|                node=*pos;
  132|  10.2M|                result= node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (132:25): [True: 2.03M, False: 8.19M]
  ------------------
  133|  10.2M|            }
  134|  10.3M|            pos_=pos;
  135|  10.3M|            return result;
  136|  10.3M|        }
  137|  46.1M|        --length;
  138|  46.1M|        pos=skipValue(pos);
  139|  46.1M|    } while(length>1);
  ------------------
  |  Branch (139:13): [True: 30.5M, False: 15.6M]
  ------------------
  140|  15.6M|    if(inByte==*pos++) {
  ------------------
  |  Branch (140:8): [True: 7.73M, False: 7.86M]
  ------------------
  141|  7.73M|        pos_=pos;
  142|  7.73M|        int32_t node=*pos;
  143|  7.73M|        return node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (143:16): [True: 5.61M, False: 2.12M]
  ------------------
  144|  7.86M|    } else {
  145|  7.86M|        stop();
  146|  7.86M|        return USTRINGTRIE_NO_MATCH;
  147|  7.86M|    }
  148|  15.6M|}
_ZN6icu_789BytesTrie8nextImplEPKhi:
  151|  27.4M|BytesTrie::nextImpl(const uint8_t *pos, int32_t inByte) {
  152|  35.0M|    for(;;) {
  153|  35.0M|        int32_t node=*pos++;
  154|  35.0M|        if(node<kMinLinearMatch) {
  ------------------
  |  Branch (154:12): [True: 25.9M, False: 9.11M]
  ------------------
  155|  25.9M|            return branchNext(pos, node, inByte);
  156|  25.9M|        } else if(node<kMinValueLead) {
  ------------------
  |  Branch (156:19): [True: 1.49M, False: 7.62M]
  ------------------
  157|       |            // Match the first of length+1 bytes.
  158|  1.49M|            int32_t length=node-kMinLinearMatch;  // Actual match length minus 1.
  159|  1.49M|            if(inByte==*pos++) {
  ------------------
  |  Branch (159:16): [True: 9.56k, False: 1.48M]
  ------------------
  160|  9.56k|                remainingMatchLength_=--length;
  161|  9.56k|                pos_=pos;
  162|  9.56k|                return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (162:25): [True: 3.30k, False: 6.25k]
  |  Branch (162:37): [True: 2.76k, False: 535]
  ------------------
  163|  6.79k|                        valueResult(node) : USTRINGTRIE_NO_VALUE;
  164|  1.48M|            } else {
  165|       |                // No match.
  166|  1.48M|                break;
  167|  1.48M|            }
  168|  7.62M|        } else if(node&kValueIsFinal) {
  ------------------
  |  Branch (168:19): [True: 0, False: 7.62M]
  ------------------
  169|       |            // No further matching bytes.
  170|      0|            break;
  171|  7.62M|        } else {
  172|       |            // Skip intermediate value.
  173|  7.62M|            pos=skipValue(pos, node);
  174|       |            // The next node must not also be a value node.
  175|  7.62M|            U_ASSERT(*pos<kMinValueLead);
  ------------------
  |  |   35|  7.62M|#   define U_ASSERT(exp) (void)0
  ------------------
  176|  7.62M|        }
  177|  35.0M|    }
  178|  1.48M|    stop();
  179|  1.48M|    return USTRINGTRIE_NO_MATCH;
  180|  27.4M|}
_ZN6icu_789BytesTrie4nextEi:
  183|  17.9M|BytesTrie::next(int32_t inByte) {
  184|  17.9M|    const uint8_t *pos=pos_;
  185|  17.9M|    if(pos==nullptr) {
  ------------------
  |  Branch (185:8): [True: 0, False: 17.9M]
  ------------------
  186|      0|        return USTRINGTRIE_NO_MATCH;
  187|      0|    }
  188|  17.9M|    if(inByte<0) {
  ------------------
  |  Branch (188:8): [True: 1.68k, False: 17.9M]
  ------------------
  189|  1.68k|        inByte+=0x100;
  190|  1.68k|    }
  191|  17.9M|    int32_t length=remainingMatchLength_;  // Actual remaining match length minus 1.
  192|  17.9M|    if(length>=0) {
  ------------------
  |  Branch (192:8): [True: 6.72k, False: 17.9M]
  ------------------
  193|       |        // Remaining part of a linear-match node.
  194|  6.72k|        if(inByte==*pos++) {
  ------------------
  |  Branch (194:12): [True: 5.85k, False: 865]
  ------------------
  195|  5.85k|            remainingMatchLength_=--length;
  196|  5.85k|            pos_=pos;
  197|  5.85k|            int32_t node;
  198|  5.85k|            return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (198:21): [True: 5.20k, False: 652]
  |  Branch (198:33): [True: 5.01k, False: 194]
  ------------------
  199|  5.01k|                    valueResult(node) : USTRINGTRIE_NO_VALUE;
  200|  5.85k|        } else {
  201|    865|            stop();
  202|    865|            return USTRINGTRIE_NO_MATCH;
  203|    865|        }
  204|  6.72k|    }
  205|  17.9M|    return nextImpl(pos, inByte);
  206|  17.9M|}

_ZN6icu_7819CharacterProperties24getInclusionsForPropertyE9UPropertyR10UErrorCode:
  267|  40.5k|        UProperty prop, UErrorCode &errorCode) {
  268|  40.5k|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (268:9): [True: 0, False: 40.5k]
  ------------------
  269|  40.5k|    if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (269:9): [True: 40.5k, False: 1]
  |  Branch (269:36): [True: 40.5k, False: 12]
  ------------------
  270|  40.5k|        int32_t inclIndex = UPROPS_SRC_COUNT + (prop - UCHAR_INT_START);
  271|  40.5k|        Inclusion &i = gInclusions[inclIndex];
  272|  40.5k|        umtx_initOnce(i.fInitOnce, &initIntPropInclusion, prop, errorCode);
  273|  40.5k|        return i.fSet;
  274|  40.5k|    } else {
  275|     13|        UPropertySource src = uprops_getSource(prop);
  ------------------
  |  | 1392|     13|#define uprops_getSource U_ICU_ENTRY_POINT_RENAME(uprops_getSource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  276|     13|        return getInclusionsForSource(src, errorCode);
  277|     13|    }
  278|  40.5k|}
_ZN6icu_7819CharacterProperties20getBinaryPropertySetE9UPropertyR10UErrorCode:
  394|      1|const UnicodeSet *CharacterProperties::getBinaryPropertySet(UProperty property, UErrorCode &errorCode) {
  395|      1|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (395:9): [True: 0, False: 1]
  ------------------
  396|      1|    if (property < 0 || UCHAR_BINARY_LIMIT <= property) {
  ------------------
  |  Branch (396:9): [True: 0, False: 1]
  |  Branch (396:25): [True: 0, False: 1]
  ------------------
  397|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  398|      0|        return nullptr;
  399|      0|    }
  400|      1|    Mutex m(&cpMutex);
  401|      1|    UnicodeSet *set = sets[property];
  402|      1|    if (set == nullptr) {
  ------------------
  |  Branch (402:9): [True: 1, False: 0]
  ------------------
  403|      1|        sets[property] = set = makeSet(property, errorCode);
  404|      1|    }
  405|      1|    return set;
  406|      1|}
u_getBinaryPropertySet_78:
  413|      1|u_getBinaryPropertySet(UProperty property, UErrorCode *pErrorCode) {
  414|      1|    const UnicodeSet *set = CharacterProperties::getBinaryPropertySet(property, *pErrorCode);
  415|      1|    return U_SUCCESS(*pErrorCode) ? set->toUSet() : nullptr;
  ------------------
  |  Branch (415:12): [True: 1, False: 0]
  ------------------
  416|      1|}
characterproperties.cpp:_ZN12_GLOBAL__N_120initIntPropInclusionE9UPropertyR10UErrorCode:
  222|      2|void U_CALLCONV initIntPropInclusion(UProperty prop, UErrorCode &errorCode) {
  223|       |    // This function is invoked only via umtx_initOnce().
  224|      2|    U_ASSERT(UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT);
  ------------------
  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  ------------------
  225|      2|    int32_t inclIndex = UPROPS_SRC_COUNT + (prop - UCHAR_INT_START);
  226|      2|    U_ASSERT(gInclusions[inclIndex].fSet == nullptr);
  ------------------
  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  ------------------
  227|      2|    UPropertySource src = uprops_getSource(prop);
  ------------------
  |  | 1392|      2|#define uprops_getSource U_ICU_ENTRY_POINT_RENAME(uprops_getSource)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  228|      2|    const UnicodeSet *incl = getInclusionsForSource(src, errorCode);
  229|      2|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (229:9): [True: 0, False: 2]
  ------------------
  230|      0|        return;
  231|      0|    }
  232|       |
  233|      2|    LocalPointer<UnicodeSet> intPropIncl(new UnicodeSet(0, 0));
  234|      2|    if (intPropIncl.isNull()) {
  ------------------
  |  Branch (234:9): [True: 0, False: 2]
  ------------------
  235|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  236|      0|        return;
  237|      0|    }
  238|      2|    int32_t numRanges = incl->getRangeCount();
  239|      2|    int32_t prevValue = 0;
  240|  6.11k|    for (int32_t i = 0; i < numRanges; ++i) {
  ------------------
  |  Branch (240:25): [True: 6.11k, False: 2]
  ------------------
  241|  6.11k|        UChar32 rangeEnd = incl->getRangeEnd(i);
  242|  20.3k|        for (UChar32 c = incl->getRangeStart(i); c <= rangeEnd; ++c) {
  ------------------
  |  Branch (242:50): [True: 14.2k, False: 6.11k]
  ------------------
  243|       |            // TODO: Get a UCharacterProperty.IntProperty to avoid the property dispatch.
  244|  14.2k|            int32_t value = u_getIntPropertyValue(c, prop);
  ------------------
  |  |  280|  14.2k|#define u_getIntPropertyValue U_ICU_ENTRY_POINT_RENAME(u_getIntPropertyValue)
  |  |  ------------------
  |  |  |  |  123|  14.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  245|  14.2k|            if (value != prevValue) {
  ------------------
  |  Branch (245:17): [True: 5.29k, False: 8.96k]
  ------------------
  246|  5.29k|                intPropIncl->add(c);
  247|  5.29k|                prevValue = value;
  248|  5.29k|            }
  249|  14.2k|        }
  250|  6.11k|    }
  251|       |
  252|      2|    if (intPropIncl->isBogus()) {
  ------------------
  |  Branch (252:9): [True: 0, False: 2]
  ------------------
  253|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  254|      0|        return;
  255|      0|    }
  256|       |    // Compact for caching.
  257|      2|    intPropIncl->compact();
  258|      2|    gInclusions[inclIndex].fSet = intPropIncl.orphan();
  259|      2|    ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup);
  ------------------
  |  |  617|      2|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|      2|}
characterproperties.cpp:_ZN12_GLOBAL__N_122getInclusionsForSourceE15UPropertySourceR10UErrorCode:
  211|     15|const UnicodeSet *getInclusionsForSource(UPropertySource src, UErrorCode &errorCode) {
  212|     15|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (212:9): [True: 0, False: 15]
  ------------------
  213|     15|    if (src < 0 || UPROPS_SRC_COUNT <= src) {
  ------------------
  |  Branch (213:9): [True: 0, False: 15]
  |  Branch (213:20): [True: 0, False: 15]
  ------------------
  214|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  215|      0|        return nullptr;
  216|      0|    }
  217|     15|    Inclusion &i = gInclusions[src];
  218|     15|    umtx_initOnce(i.fInitOnce, &initInclusion, src, errorCode);
  219|     15|    return i.fSet;
  220|     15|}
characterproperties.cpp:_ZN12_GLOBAL__N_113initInclusionE15UPropertySourceR10UErrorCode:
   91|      2|void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) {
   92|       |    // This function is invoked only via umtx_initOnce().
   93|      2|    U_ASSERT(0 <= src && src < UPROPS_SRC_COUNT);
  ------------------
  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  ------------------
   94|      2|    if (src == UPROPS_SRC_NONE) {
  ------------------
  |  Branch (94:9): [True: 0, False: 2]
  ------------------
   95|      0|        errorCode = U_INTERNAL_PROGRAM_ERROR;
   96|      0|        return;
   97|      0|    }
   98|      2|    U_ASSERT(gInclusions[src].fSet == nullptr);
  ------------------
  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  ------------------
   99|       |
  100|      2|    LocalPointer<UnicodeSet> incl(new UnicodeSet());
  101|      2|    if (incl.isNull()) {
  ------------------
  |  Branch (101:9): [True: 0, False: 2]
  ------------------
  102|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  103|      0|        return;
  104|      0|    }
  105|      2|    USetAdder sa = {
  106|      2|        reinterpret_cast<USet*>(incl.getAlias()),
  107|      2|        _set_add,
  108|      2|        _set_addRange,
  109|      2|        _set_addString,
  110|      2|        nullptr, // don't need remove()
  111|      2|        nullptr // don't need removeRange()
  112|      2|    };
  113|       |
  114|      2|    switch(src) {
  115|      1|    case UPROPS_SRC_CHAR:
  ------------------
  |  Branch (115:5): [True: 1, False: 1]
  ------------------
  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: 1]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  164|      0|        ucase_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  568|      0|#define ucase_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ucase_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  165|      0|        break;
  166|      0|    case UPROPS_SRC_BIDI:
  ------------------
  |  Branch (166:5): [True: 0, False: 2]
  ------------------
  167|      0|        ubidi_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  435|      0|#define ubidi_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ubidi_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      0|        break;
  169|      0|    case UPROPS_SRC_INPC:
  ------------------
  |  Branch (169:5): [True: 0, False: 2]
  ------------------
  170|      0|    case UPROPS_SRC_INSC:
  ------------------
  |  Branch (170:5): [True: 0, False: 2]
  ------------------
  171|      0|    case UPROPS_SRC_VO:
  ------------------
  |  Branch (171:5): [True: 0, False: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  187|      0|    case UPROPS_SRC_MCM:
  ------------------
  |  Branch (187:5): [True: 0, False: 2]
  ------------------
  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: 2]
  ------------------
  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: 2]
  ------------------
  194|      0|        errorCode = U_INTERNAL_PROGRAM_ERROR;
  195|      0|        break;
  196|      2|    }
  197|       |
  198|      2|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (198:9): [True: 0, False: 2]
  ------------------
  199|      0|        return;
  200|      0|    }
  201|      2|    if (incl->isBogus()) {
  ------------------
  |  Branch (201:9): [True: 0, False: 2]
  ------------------
  202|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  203|      0|        return;
  204|      0|    }
  205|       |    // Compact for caching.
  206|      2|    incl->compact();
  207|      2|    gInclusions[src].fSet = incl.orphan();
  208|      2|    ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup);
  ------------------
  |  |  617|      2|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|      2|}
characterproperties.cpp:_ZN12_GLOBAL__N_18_set_addEP4USeti:
   60|  13.1k|_set_add(USet *set, UChar32 c) {
   61|  13.1k|    reinterpret_cast<UnicodeSet*>(set)->add(c);
   62|  13.1k|}
characterproperties.cpp:_ZN12_GLOBAL__N_17makeSetE9UPropertyR10UErrorCode:
  284|      1|UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) {
  285|      1|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (285:9): [True: 0, False: 1]
  ------------------
  286|      1|    LocalPointer<UnicodeSet> set(new UnicodeSet());
  287|      1|    if (set.isNull()) {
  ------------------
  |  Branch (287:9): [True: 0, False: 1]
  ------------------
  288|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  289|      0|        return nullptr;
  290|      0|    }
  291|      1|    if (UCHAR_BASIC_EMOJI <= property && property <= UCHAR_RGI_EMOJI) {
  ------------------
  |  Branch (291:9): [True: 0, False: 1]
  |  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|      1|    const UnicodeSet *inclusions =
  312|      1|        icu::CharacterProperties::getInclusionsForProperty(property, errorCode);
  313|      1|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (313:9): [True: 0, False: 1]
  ------------------
  314|      1|    int32_t numRanges = inclusions->getRangeCount();
  315|      1|    UChar32 startHasProperty = -1;
  316|       |
  317|  3.05k|    for (int32_t i = 0; i < numRanges; ++i) {
  ------------------
  |  Branch (317:25): [True: 3.05k, False: 1]
  ------------------
  318|  3.05k|        UChar32 rangeEnd = inclusions->getRangeEnd(i);
  319|  10.1k|        for (UChar32 c = inclusions->getRangeStart(i); c <= rangeEnd; ++c) {
  ------------------
  |  Branch (319:56): [True: 7.12k, False: 3.05k]
  ------------------
  320|       |            // TODO: Get a UCharacterProperty.BinaryProperty to avoid the property dispatch.
  321|  7.12k|            if (u_hasBinaryProperty(c, property)) {
  ------------------
  |  |  292|  7.12k|#define u_hasBinaryProperty U_ICU_ENTRY_POINT_RENAME(u_hasBinaryProperty)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (321:17): [True: 4.24k, False: 2.88k]
  ------------------
  322|  4.24k|                if (startHasProperty < 0) {
  ------------------
  |  Branch (322:21): [True: 757, False: 3.48k]
  ------------------
  323|       |                    // Transition from false to true.
  324|    757|                    startHasProperty = c;
  325|    757|                }
  326|  4.24k|            } else if (startHasProperty >= 0) {
  ------------------
  |  Branch (326:24): [True: 757, False: 2.12k]
  ------------------
  327|       |                // Transition from true to false.
  328|    757|                set->add(startHasProperty, c - 1);
  329|    757|                startHasProperty = -1;
  330|    757|            }
  331|  7.12k|        }
  332|  3.05k|    }
  333|      1|    if (startHasProperty >= 0) {
  ------------------
  |  Branch (333:9): [True: 0, False: 1]
  ------------------
  334|      0|        set->add(startHasProperty, 0x10FFFF);
  335|      0|    }
  336|      1|    set->freeze();
  337|      1|    return set.orphan();
  338|      1|}

_ZN6icu_7824ForwardCharacterIteratorD2Ev:
   14|  14.7k|ForwardCharacterIterator::~ForwardCharacterIterator() {}
_ZN6icu_7824ForwardCharacterIteratorC2Ev:
   16|  14.7k|: UObject()
   17|  14.7k|{}
_ZN6icu_7817CharacterIteratorC2Ei:
   28|  14.7k|: textLength(length), pos(0), begin(0), end(length) {
   29|  14.7k|    if(textLength < 0) {
  ------------------
  |  Branch (29:8): [True: 0, False: 14.7k]
  ------------------
   30|      0|        textLength = end = 0;
   31|      0|    }
   32|  14.7k|}

_ZN6icu_7810CharStringC2EOS0_:
   30|  5.54k|        : buffer(std::move(src.buffer)), len(src.len) {
   31|  5.54k|    src.len = 0;  // not strictly necessary because we make no guarantees on the source string
   32|  5.54k|}
_ZN6icu_7810CharStringaSEOS0_:
   34|  4.13k|CharString& CharString::operator=(CharString&& src) noexcept {
   35|  4.13k|    buffer = std::move(src.buffer);
   36|  4.13k|    len = src.len;
   37|  4.13k|    src.len = 0;  // not strictly necessary because we make no guarantees on the source string
   38|  4.13k|    return *this;
   39|  4.13k|}
_ZNK6icu_7810CharString11lastIndexOfEc:
   82|      2|int32_t CharString::lastIndexOf(char c) const {
   83|      8|    for(int32_t i=len; i>0;) {
  ------------------
  |  Branch (83:24): [True: 8, False: 0]
  ------------------
   84|      8|        if(buffer[--i]==c) {
  ------------------
  |  Branch (84:12): [True: 2, False: 6]
  ------------------
   85|      2|            return i;
   86|      2|        }
   87|      8|    }
   88|      0|    return -1;
   89|      2|}
_ZN6icu_7810CharString8truncateEi:
  103|      2|CharString &CharString::truncate(int32_t newLength) {
  104|      2|    if(newLength<0) {
  ------------------
  |  Branch (104:8): [True: 0, False: 2]
  ------------------
  105|      0|        newLength=0;
  106|      0|    }
  107|      2|    if(newLength<len) {
  ------------------
  |  Branch (107:8): [True: 2, False: 0]
  ------------------
  108|      2|        buffer[len=newLength]=0;
  109|      2|    }
  110|      2|    return *this;
  111|      2|}
_ZN6icu_7810CharString6appendEcR10UErrorCode:
  113|   154k|CharString &CharString::append(char c, UErrorCode &errorCode) {
  114|   154k|    if(ensureCapacity(len+2, 0, errorCode)) {
  ------------------
  |  Branch (114:8): [True: 154k, False: 0]
  ------------------
  115|   154k|        buffer[len++]=c;
  116|   154k|        buffer[len]=0;
  117|   154k|    }
  118|   154k|    return *this;
  119|   154k|}
_ZN6icu_7810CharString6appendEPKciR10UErrorCode:
  121|  17.7M|CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &errorCode) {
  122|  17.7M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (122:8): [True: 0, False: 17.7M]
  ------------------
  123|      0|        return *this;
  124|      0|    }
  125|  17.7M|    if(sLength<-1 || (s==nullptr && sLength!=0)) {
  ------------------
  |  Branch (125:8): [True: 0, False: 17.7M]
  |  Branch (125:23): [True: 13.8k, False: 17.7M]
  |  Branch (125:37): [True: 0, False: 13.8k]
  ------------------
  126|      0|        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
  127|      0|        return *this;
  128|      0|    }
  129|  17.7M|    if(sLength<0) {
  ------------------
  |  Branch (129:8): [True: 15.4k, False: 17.7M]
  ------------------
  130|  15.4k|        sLength= static_cast<int32_t>(uprv_strlen(s));
  ------------------
  |  |   37|  15.4k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  15.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  131|  15.4k|    }
  132|  17.7M|    if(sLength>0) {
  ------------------
  |  Branch (132:8): [True: 17.6M, False: 58.9k]
  ------------------
  133|  17.6M|        if(s==(buffer.getAlias()+len)) {
  ------------------
  |  Branch (133:12): [True: 74.4k, False: 17.6M]
  ------------------
  134|       |            // The caller wrote into the getAppendBuffer().
  135|  74.4k|            if(sLength>=(buffer.getCapacity()-len)) {
  ------------------
  |  Branch (135:16): [True: 0, False: 74.4k]
  ------------------
  136|       |                // The caller wrote too much.
  137|      0|                errorCode=U_INTERNAL_PROGRAM_ERROR;
  138|  74.4k|            } else {
  139|  74.4k|                buffer[len+=sLength]=0;
  140|  74.4k|            }
  141|  17.6M|        } else if(buffer.getAlias()<=s && s<(buffer.getAlias()+len) &&
  ------------------
  |  Branch (141:19): [True: 10.5M, False: 7.00M]
  |  Branch (141:43): [True: 0, False: 10.5M]
  ------------------
  142|  17.6M|                  sLength>=(buffer.getCapacity()-len)
  ------------------
  |  Branch (142:19): [True: 0, False: 0]
  ------------------
  143|  17.6M|        ) {
  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|  17.6M|        } else if(ensureCapacity(len+sLength+1, 0, errorCode)) {
  ------------------
  |  Branch (147:19): [True: 17.6M, False: 0]
  ------------------
  148|  17.6M|            uprv_memcpy(buffer.getAlias()+len, s, sLength);
  ------------------
  |  |   42|  17.6M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  17.6M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  17.6M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  17.6M|    _Pragma("clang diagnostic push") \
  |  |   45|  17.6M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  17.6M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  17.6M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  17.6M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  17.6M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  17.6M|    _Pragma("clang diagnostic pop") \
  |  |   49|  17.6M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  17.6M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  17.6M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  17.6M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|  17.6M|            buffer[len+=sLength]=0;
  150|  17.6M|        }
  151|  17.6M|    }
  152|  17.7M|    return *this;
  153|  17.7M|}
_ZN6icu_7810CharString15getAppendBufferEiiRiR10UErrorCode:
  190|  81.7k|                                  UErrorCode &errorCode) {
  191|  81.7k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (191:8): [True: 0, False: 81.7k]
  ------------------
  192|      0|        resultCapacity=0;
  193|      0|        return nullptr;
  194|      0|    }
  195|  81.7k|    int32_t appendCapacity=buffer.getCapacity()-len-1;  // -1 for NUL
  196|  81.7k|    if(appendCapacity>=minCapacity) {
  ------------------
  |  Branch (196:8): [True: 80.8k, False: 855]
  ------------------
  197|  80.8k|        resultCapacity=appendCapacity;
  198|  80.8k|        return buffer.getAlias()+len;
  199|  80.8k|    }
  200|    855|    if(ensureCapacity(len+minCapacity+1, len+desiredCapacityHint+1, errorCode)) {
  ------------------
  |  Branch (200:8): [True: 855, False: 0]
  ------------------
  201|    855|        resultCapacity=buffer.getCapacity()-len-1;
  202|    855|        return buffer.getAlias()+len;
  203|    855|    }
  204|      0|    resultCapacity=0;
  205|      0|    return nullptr;
  206|    855|}
_ZN6icu_7810CharString20appendInvariantCharsERKNS_13UnicodeStringER10UErrorCode:
  208|    579|CharString &CharString::appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode) {
  209|    579|    return appendInvariantChars(s.getBuffer(), s.length(), errorCode);
  210|    579|}
_ZN6icu_7810CharString20appendInvariantCharsEPKDsiR10UErrorCode:
  212|  1.39k|CharString &CharString::appendInvariantChars(const char16_t* uchars, int32_t ucharsLen, UErrorCode &errorCode) {
  213|  1.39k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (213:8): [True: 0, False: 1.39k]
  ------------------
  214|      0|        return *this;
  215|      0|    }
  216|  1.39k|    if (!uprv_isInvariantUString(uchars, ucharsLen)) {
  ------------------
  |  | 1518|  1.39k|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  123|  1.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (216:9): [True: 0, False: 1.39k]
  ------------------
  217|      0|        errorCode = U_INVARIANT_CONVERSION_ERROR;
  218|      0|        return *this;
  219|      0|    }
  220|  1.39k|    if(ensureCapacity(len+ucharsLen+1, 0, errorCode)) {
  ------------------
  |  Branch (220:8): [True: 1.39k, False: 0]
  ------------------
  221|  1.39k|        u_UCharsToChars(uchars, buffer.getAlias()+len, ucharsLen);
  ------------------
  |  |  211|  1.39k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  1.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|  1.39k|        len += ucharsLen;
  223|  1.39k|        buffer[len] = 0;
  224|  1.39k|    }
  225|  1.39k|    return *this;
  226|  1.39k|}
_ZN6icu_7810CharString14ensureCapacityEiiR10UErrorCode:
  230|  17.7M|                                 UErrorCode &errorCode) {
  231|  17.7M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (231:8): [True: 0, False: 17.7M]
  ------------------
  232|      0|        return false;
  233|      0|    }
  234|  17.7M|    if(capacity>buffer.getCapacity()) {
  ------------------
  |  Branch (234:8): [True: 26.6k, False: 17.7M]
  ------------------
  235|  26.6k|        if(desiredCapacityHint==0) {
  ------------------
  |  Branch (235:12): [True: 25.8k, False: 855]
  ------------------
  236|  25.8k|            desiredCapacityHint=capacity+buffer.getCapacity();
  237|  25.8k|        }
  238|  26.6k|        if( (desiredCapacityHint<=capacity || buffer.resize(desiredCapacityHint, len+1)==nullptr) &&
  ------------------
  |  Branch (238:14): [True: 855, False: 25.8k]
  |  Branch (238:47): [True: 0, False: 25.8k]
  ------------------
  239|  26.6k|            buffer.resize(capacity, len+1)==nullptr
  ------------------
  |  Branch (239:13): [True: 0, False: 855]
  ------------------
  240|  26.6k|        ) {
  241|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  242|      0|            return false;
  243|      0|        }
  244|  26.6k|    }
  245|  17.7M|    return true;
  246|  17.7M|}

_ZN6icu_7810CharStringC2Ev:
   43|   851k|    CharString() : len(0) { buffer[0]=0; }
_ZN6icu_7810CharString4dataEv:
   85|  6.34M|    char *data() { return buffer.getAlias(); }
_ZN6icu_7810CharStringD2Ev:
   56|  2.67M|    ~CharString() {}
_ZNK6icu_7810CharStringeqENS_11StringPieceE:
  115|  18.5k|    bool operator==(StringPiece other) const {
  116|  18.5k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|    471|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|    471|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (116:16): [True: 471, False: 18.0k]
  |  Branch (116:42): [True: 0, False: 471]
  |  Branch (116:54): [True: 8, False: 463]
  ------------------
  117|  18.5k|    }
_ZNK6icu_7810CharString4dataEv:
   84|   165k|    const char *data() const { return buffer.getAlias(); }
_ZN6icu_7810CharStringC2ENS_11StringPieceER10UErrorCode:
   44|  47.9k|    CharString(StringPiece s, UErrorCode &errorCode) : len(0) {
   45|  47.9k|        buffer[0]=0;
   46|  47.9k|        append(s, errorCode);
   47|  47.9k|    }
_ZN6icu_7810CharStringC2EPKciR10UErrorCode:
   52|  1.76M|    CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) {
   53|  1.76M|        buffer[0]=0;
   54|  1.76M|        append(s, sLength, errorCode);
   55|  1.76M|    }
_ZNK6icu_7810CharString7isEmptyEv:
   79|   314k|    UBool isEmpty() const { return len==0; }
_ZNK6icu_7810CharString6lengthEv:
   80|   316k|    int32_t length() const { return len; }
_ZNK6icu_7810CharStringixEi:
   81|      3|    char operator[](int32_t index) const { return buffer[index]; }
_ZNK6icu_7810CharString13toStringPieceEv:
   82|  3.54k|    StringPiece toStringPiece() const { return StringPiece(buffer.getAlias(), len); }
_ZNK6icu_7810CharStringeqERKS0_:
  108|  3.84k|    bool operator==(const CharString& other) const {
  109|  3.84k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|  2.78k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|  2.78k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (109:16): [True: 2.78k, False: 1.06k]
  |  Branch (109:42): [True: 0, False: 2.78k]
  |  Branch (109:54): [True: 989, False: 1.79k]
  ------------------
  110|  3.84k|    }
_ZN6icu_7810CharString5clearEv:
  127|  47.7k|    CharString &clear() { len=0; buffer[0]=0; return *this; }
_ZN6icu_7810CharString6appendENS_11StringPieceER10UErrorCode:
  131|   453k|    CharString &append(StringPiece s, UErrorCode &errorCode) {
  132|   453k|        return append(s.data(), s.length(), errorCode);
  133|   453k|    }
_ZN6icu_7810CharString6appendERKS0_R10UErrorCode:
  134|   154k|    CharString &append(const CharString &s, UErrorCode &errorCode) {
  135|   154k|        return append(s.data(), s.length(), errorCode);
  136|   154k|    }

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

_ZN6icu_7815MaybeStackArrayIcLi40EEC2Ev:
  344|  2.66M|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIcLi40EED2Ev:
  363|  2.67M|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIcLi40EEC2EOS1_:
  479|  5.54k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|  5.54k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 5.54k, False: 0]
  ------------------
  481|  5.54k|        ptr = stackArray;
  482|  5.54k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  5.54k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  5.54k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  5.54k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  5.54k|    _Pragma("clang diagnostic push") \
  |  |   45|  5.54k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  5.54k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  5.54k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  5.54k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  5.54k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  5.54k|    _Pragma("clang diagnostic pop") \
  |  |   49|  5.54k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  5.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  5.54k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  5.54k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|  5.54k|    } else {
  484|      0|        src.resetToStackArray();  // take ownership away from src
  485|      0|    }
  486|  5.54k|}
_ZN6icu_7815MaybeStackArrayIcLi40EEaSEOS1_:
  490|  4.13k|MaybeStackArray<T, stackCapacity>::operator=(MaybeStackArray <T, stackCapacity>&& src) noexcept {
  491|  4.13k|    releaseArray();  // in case this instance had its own memory allocated
  492|  4.13k|    capacity = src.capacity;
  493|  4.13k|    needToRelease = src.needToRelease;
  494|  4.13k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (494:9): [True: 3.12k, False: 1.01k]
  ------------------
  495|  3.12k|        ptr = stackArray;
  496|  3.12k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  3.12k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  3.12k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  3.12k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  3.12k|    _Pragma("clang diagnostic push") \
  |  |   45|  3.12k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  3.12k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  3.12k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  3.12k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  3.12k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  3.12k|    _Pragma("clang diagnostic pop") \
  |  |   49|  3.12k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  3.12k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  3.12k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  3.12k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|  3.12k|    } else {
  498|  1.01k|        ptr = src.ptr;
  499|  1.01k|        src.resetToStackArray();  // take ownership away from src
  500|  1.01k|    }
  501|  4.13k|    return *this;
  502|  4.13k|}
_ZNK6icu_7815MaybeStackArrayIcLi40EE11getCapacityEv:
  376|  17.9M|    int32_t getCapacity() const { return capacity; }
_ZNK6icu_7815MaybeStackArrayIcLi40EE8getAliasEv:
  381|  70.0M|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayIcLi40EEixEl:
  395|     11|    const T &operator[](ptrdiff_t i) const { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EEixEl:
  402|  20.6M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EE6resizeEii:
  505|  26.6k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  26.6k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 26.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|  26.6k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  26.6k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  26.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  26.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  26.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  26.6k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 26.6k, False: 0]
  ------------------
  512|  26.6k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 26.6k, False: 0]
  ------------------
  513|  26.6k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 26.6k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|  26.6k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 26.6k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|  26.6k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|  26.6k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  26.6k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  26.6k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  26.6k|    _Pragma("clang diagnostic push") \
  |  |   45|  26.6k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  26.6k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  26.6k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  26.6k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  26.6k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  26.6k|    _Pragma("clang diagnostic pop") \
  |  |   49|  26.6k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  26.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  26.6k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  26.6k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|  26.6k|            }
  521|  26.6k|            releaseArray();
  522|  26.6k|            ptr=p;
  523|  26.6k|            capacity=newCapacity;
  524|  26.6k|            needToRelease=true;
  525|  26.6k|        }
  526|  26.6k|        return p;
  527|  26.6k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  26.6k|}
_ZN6icu_7815MaybeStackArrayIcLi40EE12releaseArrayEv:
  458|  2.70M|    void releaseArray() {
  459|  2.70M|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 26.6k, False: 2.67M]
  ------------------
  460|  26.6k|            uprv_free(ptr);
  ------------------
  |  | 1503|  26.6k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  26.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  26.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  26.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  26.6k|        }
  462|  2.70M|    }
_ZN6icu_7815MaybeStackArrayIcLi40EE17resetToStackArrayEv:
  463|  1.01k|    void resetToStackArray() {
  464|  1.01k|        ptr=stackArray;
  465|  1.01k|        capacity=stackCapacity;
  466|  1.01k|        needToRelease=false;
  467|  1.01k|    }
_ZN6icu_7811LocalMemoryIiEC2EPi:
  195|    179|    explicit LocalMemory(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7811LocalMemoryIiED2Ev:
  206|    179|    ~LocalMemory() {
  207|    179|        uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|    179|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    179|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    179|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    179|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|    179|    }
_ZN6icu_7811LocalMemoryIiE23allocateInsteadAndResetEi:
  278|    174|inline T *LocalMemory<T>::allocateInsteadAndReset(int32_t newCapacity) {
  279|    174|    if(newCapacity>0) {
  ------------------
  |  Branch (279:8): [True: 33, False: 141]
  ------------------
  280|     33|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|     33|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     33|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     33|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     33|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  281|     33|        if(p!=nullptr) {
  ------------------
  |  Branch (281:12): [True: 33, False: 0]
  ------------------
  282|     33|            uprv_memset(p, 0, newCapacity*sizeof(T));
  ------------------
  |  |  100|     33|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|     33|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  283|     33|            uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|     33|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     33|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     33|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     33|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|     33|            LocalPointerBase<T>::ptr=p;
  285|     33|        }
  286|     33|        return p;
  287|    141|    } else {
  288|    141|        return nullptr;
  289|    141|    }
  290|    174|}
_ZNK6icu_7811LocalMemoryIiEixEl:
  274|  16.3k|    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_7815MaybeStackArrayIP13LocExtKeyDataLi8EEixEl:
  402|     37|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIP13LocExtKeyDataLi8EE12releaseArrayEv:
  458|      2|    void releaseArray() {
  459|      2|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 1, False: 1]
  ------------------
  460|      1|            uprv_free(ptr);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      1|        }
  462|      2|    }
_ZN6icu_7815MaybeStackArrayIP10LocExtTypeLi8EEixEl:
  402|  1.05k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIP10LocExtTypeLi8EE12releaseArrayEv:
  458|      7|    void releaseArray() {
  459|      7|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 6, False: 1]
  ------------------
  460|      6|            uprv_free(ptr);
  ------------------
  |  | 1503|      6|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      6|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      6|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      6|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      6|        }
  462|      7|    }
_ZN6icu_7815MaybeStackArrayIP9TypeAliasLi8EEixEl:
  402|    178|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIP9TypeAliasLi8EE12releaseArrayEv:
  458|      4|    void releaseArray() {
  459|      4|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 3, False: 1]
  ------------------
  460|      3|            uprv_free(ptr);
  ------------------
  |  | 1503|      3|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      3|        }
  462|      4|    }
_ZN6icu_7810MemoryPoolINS_10CharStringELi8EED2Ev:
  762|  2.62k|    ~MemoryPool() {
  763|  1.76M|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 1.76M, False: 2.62k]
  ------------------
  764|  1.76M|            delete fPool[i];
  765|  1.76M|        }
  766|  2.62k|    }
_ZN6icu_7815MaybeStackArrayIPNS_10CharStringELi8EEixEl:
  402|  3.52M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIPNS_10CharStringELi8EED2Ev:
  363|  2.62k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPNS_10CharStringELi8EE12releaseArrayEv:
  458|  3.61k|    void releaseArray() {
  459|  3.61k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 991, False: 2.62k]
  ------------------
  460|    991|            uprv_free(ptr);
  ------------------
  |  | 1503|    991|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    991|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    991|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    991|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|    991|        }
  462|  3.61k|    }
_ZN6icu_7810MemoryPoolINS_10CharStringELi8EEC2Ev:
  760|  2.62k|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIPNS_10CharStringELi8EEC2Ev:
  344|  2.62k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7810MemoryPoolI13LocExtKeyDataLi8EEC2Ev:
  760|      1|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIP13LocExtKeyDataLi8EEC2Ev:
  344|      1|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7810MemoryPoolI10LocExtTypeLi8EEC2Ev:
  760|      1|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIP10LocExtTypeLi8EEC2Ev:
  344|      1|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7810MemoryPoolI9TypeAliasLi8EEC2Ev:
  760|      1|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIP9TypeAliasLi8EEC2Ev:
  344|      1|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7810MemoryPoolINS_10CharStringELi8EE6createIJEEEPS1_DpOT_:
  796|    921|    T* create(Args&&... args) {
  797|    921|        int32_t capacity = fPool.getCapacity();
  798|    921|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 5, False: 916]
  ------------------
  799|    921|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 5]
  |  Branch (799:26): [True: 1, False: 4]
  ------------------
  800|      5|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|    921|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|    921|    }
_ZNK6icu_7815MaybeStackArrayIPNS_10CharStringELi8EE11getCapacityEv:
  376|  1.76M|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIPNS_10CharStringELi8EE6resizeEii:
  505|    992|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|    992|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 992, 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|    992|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|    992|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    992|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    992|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    992|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|    992|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 992, False: 0]
  ------------------
  512|    992|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 992, False: 0]
  ------------------
  513|    992|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 992]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|    992|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 992]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|    992|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|    992|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    992|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    992|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    992|    _Pragma("clang diagnostic push") \
  |  |   45|    992|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    992|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    992|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    992|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    992|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    992|    _Pragma("clang diagnostic pop") \
  |  |   49|    992|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    992|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    992|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    992|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|    992|            }
  521|    992|            releaseArray();
  522|    992|            ptr=p;
  523|    992|            capacity=newCapacity;
  524|    992|            needToRelease=true;
  525|    992|        }
  526|    992|        return p;
  527|    992|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|    992|}
_ZN6icu_7810MemoryPoolINS_10CharStringELi8EE6createIJRPKcR10UErrorCodeEEEPS1_DpOT_:
  796|    556|    T* create(Args&&... args) {
  797|    556|        int32_t capacity = fPool.getCapacity();
  798|    556|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 2, False: 554]
  ------------------
  799|    556|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 2]
  |  Branch (799:26): [True: 0, False: 2]
  ------------------
  800|      2|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|    556|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|    556|    }
_ZN6icu_7810MemoryPoolI10LocExtTypeLi8EE6createIJEEEPS1_DpOT_:
  796|  1.05k|    T* create(Args&&... args) {
  797|  1.05k|        int32_t capacity = fPool.getCapacity();
  798|  1.05k|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 7, False: 1.04k]
  ------------------
  799|  1.05k|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 7]
  |  Branch (799:26): [True: 1, False: 6]
  ------------------
  800|      7|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|  1.05k|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|  1.05k|    }
_ZNK6icu_7815MaybeStackArrayIP10LocExtTypeLi8EE11getCapacityEv:
  376|  1.05k|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIP10LocExtTypeLi8EE6resizeEii:
  505|      7|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|      7|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 7, 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|      7|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      7|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      7|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      7|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      7|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|      7|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 7, False: 0]
  ------------------
  512|      7|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 7, False: 0]
  ------------------
  513|      7|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 7]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|      7|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 7]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|      7|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      7|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      7|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      7|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      7|    _Pragma("clang diagnostic push") \
  |  |   45|      7|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      7|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      7|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      7|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      7|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      7|    _Pragma("clang diagnostic pop") \
  |  |   49|      7|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      7|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      7|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      7|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      7|            }
  521|      7|            releaseArray();
  522|      7|            ptr=p;
  523|      7|            capacity=newCapacity;
  524|      7|            needToRelease=true;
  525|      7|        }
  526|      7|        return p;
  527|      7|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|      7|}
_ZN6icu_7810MemoryPoolI9TypeAliasLi8EE6createIJS1_EEEPS1_DpOT_:
  796|    178|    T* create(Args&&... args) {
  797|    178|        int32_t capacity = fPool.getCapacity();
  798|    178|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 4, False: 174]
  ------------------
  799|    178|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 4]
  |  Branch (799:26): [True: 1, False: 3]
  ------------------
  800|      4|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|    178|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|    178|    }
_ZNK6icu_7815MaybeStackArrayIP9TypeAliasLi8EE11getCapacityEv:
  376|    178|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIP9TypeAliasLi8EE6resizeEii:
  505|      4|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|      4|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 4, 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|      4|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      4|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|      4|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 4, False: 0]
  ------------------
  512|      4|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 4, False: 0]
  ------------------
  513|      4|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 4]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|      4|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 4]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|      4|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      4|            }
  521|      4|            releaseArray();
  522|      4|            ptr=p;
  523|      4|            capacity=newCapacity;
  524|      4|            needToRelease=true;
  525|      4|        }
  526|      4|        return p;
  527|      4|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|      4|}
_ZN6icu_7810MemoryPoolI13LocExtKeyDataLi8EE6createIJEEEPS1_DpOT_:
  796|     37|    T* create(Args&&... args) {
  797|     37|        int32_t capacity = fPool.getCapacity();
  798|     37|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 2, False: 35]
  ------------------
  799|     37|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 2]
  |  Branch (799:26): [True: 1, False: 1]
  ------------------
  800|      2|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|     37|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|     37|    }
_ZNK6icu_7815MaybeStackArrayIP13LocExtKeyDataLi8EE11getCapacityEv:
  376|     37|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIP13LocExtKeyDataLi8EE6resizeEii:
  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|}
uloc_tag.cpp:_ZN6icu_7810MemoryPoolIN12_GLOBAL__N_118AttributeListEntryELi8EEC2Ev:
  760|  1.20k|    MemoryPool() : fCount(0), fPool() {}
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118AttributeListEntryELi8EEC2Ev:
  344|  1.20k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
uloc_tag.cpp:_ZN6icu_7810MemoryPoolIN12_GLOBAL__N_118ExtensionListEntryELi8EEC2Ev:
  760|  1.41k|    MemoryPool() : fCount(0), fPool() {}
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118ExtensionListEntryELi8EEC2Ev:
  344|  1.41k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
uloc_tag.cpp:_ZN6icu_7810MemoryPoolIN12_GLOBAL__N_118AttributeListEntryELi8EE6createIJEEEPS2_DpOT_:
  796|   149k|    T* create(Args&&... args) {
  797|   149k|        int32_t capacity = fPool.getCapacity();
  798|   149k|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 313, False: 149k]
  ------------------
  799|   149k|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 313]
  |  Branch (799:26): [True: 101, False: 212]
  ------------------
  800|    313|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|   149k|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|   149k|    }
uloc_tag.cpp:_ZNK6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118AttributeListEntryELi8EE11getCapacityEv:
  376|   149k|    int32_t getCapacity() const { return capacity; }
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118AttributeListEntryELi8EE6resizeEii:
  505|    313|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|    313|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 313, 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|    313|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|    313|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    313|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    313|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    313|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|    313|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 313, False: 0]
  ------------------
  512|    313|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 313, False: 0]
  ------------------
  513|    313|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 313]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|    313|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 313]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|    313|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|    313|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    313|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    313|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    313|    _Pragma("clang diagnostic push") \
  |  |   45|    313|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    313|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    313|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    313|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    313|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    313|    _Pragma("clang diagnostic pop") \
  |  |   49|    313|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    313|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    313|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    313|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|    313|            }
  521|    313|            releaseArray();
  522|    313|            ptr=p;
  523|    313|            capacity=newCapacity;
  524|    313|            needToRelease=true;
  525|    313|        }
  526|    313|        return p;
  527|    313|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|    313|}
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118AttributeListEntryELi8EE12releaseArrayEv:
  458|  1.51k|    void releaseArray() {
  459|  1.51k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 313, False: 1.20k]
  ------------------
  460|    313|            uprv_free(ptr);
  ------------------
  |  | 1503|    313|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    313|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    313|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    313|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|    313|        }
  462|  1.51k|    }
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118AttributeListEntryELi8EEixEl:
  402|   298k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
uloc_tag.cpp:_ZN6icu_7810MemoryPoolIN12_GLOBAL__N_118ExtensionListEntryELi8EE6createIJEEEPS2_DpOT_:
  796|  1.60M|    T* create(Args&&... args) {
  797|  1.60M|        int32_t capacity = fPool.getCapacity();
  798|  1.60M|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 817, False: 1.60M]
  ------------------
  799|  1.60M|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 817]
  |  Branch (799:26): [True: 433, False: 384]
  ------------------
  800|    817|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|  1.60M|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|  1.60M|    }
uloc_tag.cpp:_ZNK6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118ExtensionListEntryELi8EE11getCapacityEv:
  376|  1.60M|    int32_t getCapacity() const { return capacity; }
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118ExtensionListEntryELi8EE6resizeEii:
  505|    817|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|    817|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 817, 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|    817|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|    817|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    817|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    817|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    817|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|    817|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 817, False: 0]
  ------------------
  512|    817|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 817, False: 0]
  ------------------
  513|    817|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 817]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|    817|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 817]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|    817|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|    817|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    817|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    817|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    817|    _Pragma("clang diagnostic push") \
  |  |   45|    817|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    817|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    817|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    817|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    817|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    817|    _Pragma("clang diagnostic pop") \
  |  |   49|    817|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    817|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    817|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    817|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|    817|            }
  521|    817|            releaseArray();
  522|    817|            ptr=p;
  523|    817|            capacity=newCapacity;
  524|    817|            needToRelease=true;
  525|    817|        }
  526|    817|        return p;
  527|    817|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|    817|}
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118ExtensionListEntryELi8EE12releaseArrayEv:
  458|  2.23k|    void releaseArray() {
  459|  2.23k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 817, False: 1.41k]
  ------------------
  460|    817|            uprv_free(ptr);
  ------------------
  |  | 1503|    817|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    817|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    817|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    817|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|    817|        }
  462|  2.23k|    }
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118ExtensionListEntryELi8EEixEl:
  402|  3.21M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
uloc_tag.cpp:_ZN6icu_7810MemoryPoolIN12_GLOBAL__N_118ExtensionListEntryELi8EED2Ev:
  762|  1.41k|    ~MemoryPool() {
  763|  1.60M|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 1.60M, False: 1.41k]
  ------------------
  764|  1.60M|            delete fPool[i];
  765|  1.60M|        }
  766|  1.41k|    }
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118ExtensionListEntryELi8EED2Ev:
  363|  1.41k|    ~MaybeStackArray() { releaseArray(); }
uloc_tag.cpp:_ZN6icu_7810MemoryPoolIN12_GLOBAL__N_118AttributeListEntryELi8EED2Ev:
  762|  1.20k|    ~MemoryPool() {
  763|   150k|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 149k, False: 1.20k]
  ------------------
  764|   149k|            delete fPool[i];
  765|   149k|        }
  766|  1.20k|    }
uloc_tag.cpp:_ZN6icu_7815MaybeStackArrayIPN12_GLOBAL__N_118AttributeListEntryELi8EED2Ev:
  363|  1.20k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7810MemoryPoolINS_10CharStringELi8EE6createIJRPKcRiR10UErrorCodeEEEPS1_DpOT_:
  796|  1.75M|    T* create(Args&&... args) {
  797|  1.75M|        int32_t capacity = fPool.getCapacity();
  798|  1.75M|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 985, False: 1.75M]
  ------------------
  799|  1.75M|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 985]
  |  Branch (799:26): [True: 399, False: 586]
  ------------------
  800|    985|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|  1.75M|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|  1.75M|    }
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();} ()
_ZN6icu_7815MaybeStackArrayI11max_align_tLi7EEC2Ev:
  344|    695|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZNK6icu_7815MaybeStackArrayI11max_align_tLi7EE11getCapacityEv:
  376|    695|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi7EE12releaseArrayEv:
  458|    695|    void releaseArray() {
  459|    695|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 695]
  ------------------
  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|    695|    }
_ZNK6icu_7815MaybeStackArrayI11max_align_tLi7EE8getAliasEv:
  381|    695|    T *getAlias() const { return ptr; }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi7EED2Ev:
  363|    695|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi14EEC2Ev:
  344|    599|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZNK6icu_7815MaybeStackArrayI11max_align_tLi14EE11getCapacityEv:
  376|    599|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi14EE12releaseArrayEv:
  458|    599|    void releaseArray() {
  459|    599|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 599]
  ------------------
  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|    599|    }
_ZNK6icu_7815MaybeStackArrayI11max_align_tLi14EE8getAliasEv:
  381|  1.19k|    T *getAlias() const { return ptr; }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi14EED2Ev:
  363|    599|    ~MaybeStackArray() { releaseArray(); }

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

_ZN6icu_7821DictionaryBreakEngineC2Ev:
   38|      5|DictionaryBreakEngine::DictionaryBreakEngine() {
   39|      5|}
_ZNK6icu_7821DictionaryBreakEngine7handlesEiPKc:
   45|  6.88M|DictionaryBreakEngine::handles(UChar32 c, const char*) const {
   46|  6.88M|    return fSet.contains(c);
   47|  6.88M|}
_ZNK6icu_7821DictionaryBreakEngine10findBreaksEP5UTextiiRNS_9UVector32EaR10UErrorCode:
   55|  2.30M|                                 UErrorCode& status) const {
   56|  2.30M|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (56:9): [True: 0, False: 2.30M]
  ------------------
   57|  2.30M|    int32_t result = 0;
   58|       |
   59|       |    // Find the span of characters included in the set.
   60|       |    //   The span to break begins at the current position in the text, and
   61|       |    //   extends towards the start or end of the text, depending on 'reverse'.
   62|       |
   63|  2.30M|    utext_setNativeIndex(text, startPos);
  ------------------
  |  | 1915|  2.30M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.30M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.30M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.30M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|  2.30M|    int32_t start = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|  2.30M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.30M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.30M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.30M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   65|  2.30M|    int32_t current;
   66|  2.30M|    int32_t rangeStart;
   67|  2.30M|    int32_t rangeEnd;
   68|  2.30M|    UChar32 c = utext_current32(text);
  ------------------
  |  | 1893|  2.30M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  2.30M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.30M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.30M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|  57.0M|    while ((current = static_cast<int32_t>(utext_getNativeIndex(text))) < endPos && fSet.contains(c)) {
  ------------------
  |  | 1897|  57.0M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  57.0M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  57.0M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  57.0M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (69:12): [True: 55.0M, False: 2.04M]
  |  Branch (69:85): [True: 54.7M, False: 261k]
  ------------------
   70|  54.7M|        utext_next32(text);         // TODO:  recast loop for postincrement
  ------------------
  |  | 1904|  54.7M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  54.7M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  54.7M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  54.7M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   71|  54.7M|        c = utext_current32(text);
  ------------------
  |  | 1893|  54.7M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  54.7M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  54.7M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  54.7M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   72|  54.7M|    }
   73|  2.30M|    rangeStart = start;
   74|  2.30M|    rangeEnd = current;
   75|  2.30M|    result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks, isPhraseBreaking, status);
   76|  2.30M|    utext_setNativeIndex(text, current);
  ------------------
  |  | 1915|  2.30M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.30M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.30M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.30M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|       |    
   78|  2.30M|    return result;
   79|  2.30M|}
_ZN6icu_7821DictionaryBreakEngine13setCharactersERKNS_10UnicodeSetE:
   82|      5|DictionaryBreakEngine::setCharacters( const UnicodeSet &set ) {
   83|      5|    fSet = set;
   84|       |    // Compact for caching
   85|      5|    fSet.compact();
   86|      5|}
_ZN6icu_7812PossibleWord10candidatesEP5UTextPNS_17DictionaryMatcherEi:
  138|  21.6M|int32_t PossibleWord::candidates( UText *text, DictionaryMatcher *dict, int32_t rangeEnd ) {
  139|       |    // TODO: If getIndex is too slow, use offset < 0 and add discardAll()
  140|  21.6M|    int32_t start = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|  21.6M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  21.6M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.6M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.6M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  141|  21.6M|    if (start != offset) {
  ------------------
  |  Branch (141:9): [True: 9.52M, False: 12.1M]
  ------------------
  142|  9.52M|        offset = start;
  143|  9.52M|        count = dict->matches(text, rangeEnd-start, UPRV_LENGTHOF(cuLengths), cuLengths, cpLengths, nullptr, &prefix);
  ------------------
  |  |   99|  9.52M|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  144|       |        // Dictionary leaves text after longest prefix, not longest word. Back up.
  145|  9.52M|        if (count <= 0) {
  ------------------
  |  Branch (145:13): [True: 2.02M, False: 7.49M]
  ------------------
  146|  2.02M|            utext_setNativeIndex(text, start);
  ------------------
  |  | 1915|  2.02M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.02M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.02M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.02M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  147|  2.02M|        }
  148|  9.52M|    }
  149|  21.6M|    if (count > 0) {
  ------------------
  |  Branch (149:9): [True: 15.7M, False: 5.90M]
  ------------------
  150|  15.7M|        utext_setNativeIndex(text, start+cuLengths[count-1]);
  ------------------
  |  | 1915|  15.7M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  15.7M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  15.7M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  15.7M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  151|  15.7M|    }
  152|  21.6M|    current = count-1;
  153|  21.6M|    mark = current;
  154|  21.6M|    return count;
  155|  21.6M|}
_ZN6icu_7812PossibleWord12acceptMarkedEP5UText:
  158|  7.43M|PossibleWord::acceptMarked( UText *text ) {
  159|  7.43M|    utext_setNativeIndex(text, offset + cuLengths[mark]);
  ------------------
  |  | 1915|  7.43M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  7.43M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.43M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.43M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|  7.43M|    return cuLengths[mark];
  161|  7.43M|}
_ZN6icu_7812PossibleWord6backUpEP5UText:
  165|   427k|PossibleWord::backUp( UText *text ) {
  166|   427k|    if (current > 0) {
  ------------------
  |  Branch (166:9): [True: 267k, False: 160k]
  ------------------
  167|   267k|        utext_setNativeIndex(text, offset + cuLengths[--current]);
  ------------------
  |  | 1915|   267k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   267k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   267k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   267k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|   267k|        return true;
  169|   267k|    }
  170|   160k|    return false;
  171|   427k|}
_ZN6icu_7815ThaiBreakEngineC2EPNS_17DictionaryMatcherER10UErrorCode:
  201|      1|    : DictionaryBreakEngine(),
  202|      1|      fDictionary(adoptDictionary)
  203|      1|{
  204|      1|    UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
  205|      1|    UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Thai");
  206|      1|    UnicodeSet thaiWordSet(UnicodeString(u"[[:Thai:]&[:LineBreak=SA:]]"), status);
  207|      1|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (207:9): [True: 1, False: 0]
  ------------------
  208|      1|        setCharacters(thaiWordSet);
  209|      1|    }
  210|      1|    fMarkSet.applyPattern(UnicodeString(u"[[:Thai:]&[:LineBreak=SA:]&[:M:]]"), status);
  211|      1|    fMarkSet.add(0x0020);
  212|      1|    fEndWordSet = thaiWordSet;
  213|      1|    fEndWordSet.remove(0x0E31);             // MAI HAN-AKAT
  214|      1|    fEndWordSet.remove(0x0E40, 0x0E44);     // SARA E through SARA AI MAIMALAI
  215|      1|    fBeginWordSet.add(0x0E01, 0x0E2E);      // KO KAI through HO NOKHUK
  216|      1|    fBeginWordSet.add(0x0E40, 0x0E44);      // SARA E through SARA AI MAIMALAI
  217|      1|    fSuffixSet.add(THAI_PAIYANNOI);
  218|      1|    fSuffixSet.add(THAI_MAIYAMOK);
  219|       |
  220|       |    // Compact for caching.
  221|      1|    fMarkSet.compact();
  222|      1|    fEndWordSet.compact();
  223|      1|    fBeginWordSet.compact();
  224|      1|    fSuffixSet.compact();
  225|      1|    UTRACE_EXIT_STATUS(status);
  226|      1|}
_ZNK6icu_7815ThaiBreakEngine23divideUpDictionaryRangeEP5UTextiiRNS_9UVector32EaR10UErrorCode:
  238|  30.2k|                                                UErrorCode& status) const {
  239|  30.2k|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (239:9): [True: 0, False: 30.2k]
  ------------------
  240|  30.2k|    utext_setNativeIndex(text, rangeStart);
  ------------------
  |  | 1915|  30.2k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  30.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  30.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  30.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  241|  30.2k|    utext_moveIndex32(text, THAI_MIN_WORD_SPAN);
  ------------------
  |  | 1902|  30.2k|#define utext_moveIndex32 U_ICU_ENTRY_POINT_RENAME(utext_moveIndex32)
  |  |  ------------------
  |  |  |  |  123|  30.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  30.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  30.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  242|  30.2k|    if (utext_getNativeIndex(text) >= rangeEnd) {
  ------------------
  |  | 1897|  30.2k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  30.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  30.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  30.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (242:9): [True: 24.5k, False: 5.62k]
  ------------------
  243|  24.5k|        return 0;       // Not enough characters for two words
  244|  24.5k|    }
  245|  5.62k|    utext_setNativeIndex(text, rangeStart);
  ------------------
  |  | 1915|  5.62k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  5.62k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.62k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.62k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|       |
  247|       |
  248|  5.62k|    uint32_t wordsFound = 0;
  249|  5.62k|    int32_t cpWordLength = 0;    // Word Length in Code Points.
  250|  5.62k|    int32_t cuWordLength = 0;    // Word length in code units (UText native indexing)
  251|  5.62k|    int32_t current;
  252|  5.62k|    PossibleWord words[THAI_LOOKAHEAD];
  253|       |    
  254|  5.62k|    utext_setNativeIndex(text, rangeStart);
  ------------------
  |  | 1915|  5.62k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  5.62k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.62k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.62k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|       |    
  256|  1.45M|    while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) {
  ------------------
  |  | 1897|  1.45M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (256:12): [True: 1.45M, False: 0]
  |  Branch (256:33): [True: 1.44M, False: 5.62k]
  ------------------
  257|  1.44M|        cpWordLength = 0;
  258|  1.44M|        cuWordLength = 0;
  259|       |
  260|       |        // Look for candidate words at the current position
  261|  1.44M|        int32_t candidates = words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  262|       |        
  263|       |        // If we found exactly one, use that
  264|  1.44M|        if (candidates == 1) {
  ------------------
  |  Branch (264:13): [True: 718k, False: 727k]
  ------------------
  265|   718k|            cuWordLength = words[wordsFound % THAI_LOOKAHEAD].acceptMarked(text);
  266|   718k|            cpWordLength = words[wordsFound % THAI_LOOKAHEAD].markedCPLength();
  267|   718k|            wordsFound += 1;
  268|   718k|        }
  269|       |        // If there was more than one, see which one can take us forward the most words
  270|   727k|        else if (candidates > 1) {
  ------------------
  |  Branch (270:18): [True: 23.9k, False: 703k]
  ------------------
  271|       |            // If we're already at the end of the range, we're done
  272|  23.9k|            if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) {
  ------------------
  |  | 1897|  23.9k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  23.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  23.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  23.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (272:17): [True: 998, False: 22.9k]
  ------------------
  273|    998|                goto foundBest;
  274|    998|            }
  275|  45.0k|            do {
  276|  45.0k|                if (words[(wordsFound + 1) % THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) {
  ------------------
  |  Branch (276:21): [True: 11.5k, False: 33.5k]
  ------------------
  277|       |                    // Followed by another dictionary word; mark first word as a good candidate
  278|  11.5k|                    words[wordsFound%THAI_LOOKAHEAD].markCurrent();
  279|       |                    
  280|       |                    // If we're already at the end of the range, we're done
  281|  11.5k|                    if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) {
  ------------------
  |  | 1897|  11.5k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  11.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (281:25): [True: 844, False: 10.6k]
  ------------------
  282|    844|                        goto foundBest;
  283|    844|                    }
  284|       |                    
  285|       |                    // See if any of the possible second words is followed by a third word
  286|  19.1k|                    do {
  287|       |                        // If we find a third word, stop right away
  288|  19.1k|                        if (words[(wordsFound + 2) % THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd)) {
  ------------------
  |  Branch (288:29): [True: 8.72k, False: 10.3k]
  ------------------
  289|  8.72k|                            words[wordsFound % THAI_LOOKAHEAD].markCurrent();
  290|  8.72k|                            goto foundBest;
  291|  8.72k|                        }
  292|  19.1k|                    }
  293|  10.6k|                    while (words[(wordsFound + 1) % THAI_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (293:28): [True: 8.45k, False: 1.93k]
  ------------------
  294|  10.6k|                }
  295|  45.0k|            }
  296|  35.4k|            while (words[wordsFound % THAI_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (296:20): [True: 22.0k, False: 13.4k]
  ------------------
  297|  23.9k|foundBest:
  298|       |            // Set UText position to after the accepted word.
  299|  23.9k|            cuWordLength = words[wordsFound % THAI_LOOKAHEAD].acceptMarked(text);
  300|  23.9k|            cpWordLength = words[wordsFound % THAI_LOOKAHEAD].markedCPLength();
  301|  23.9k|            wordsFound += 1;
  302|  23.9k|        }
  303|       |        
  304|       |        // We come here after having either found a word or not. We look ahead to the
  305|       |        // next word. If it's not a dictionary word, we will combine it with the word we
  306|       |        // just found (if there is one), but only if the preceding word does not exceed
  307|       |        // the threshold.
  308|       |        // The text iterator should now be positioned at the end of the word we found.
  309|       |        
  310|  1.44M|        UChar32 uc = 0;
  311|  1.44M|        if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < THAI_ROOT_COMBINE_THRESHOLD) {
  ------------------
  |  | 1897|  1.44M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.44M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.44M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.44M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (311:13): [True: 1.44M, False: 1.97k]
  |  Branch (311:76): [True: 1.42M, False: 16.1k]
  ------------------
  312|       |            // if it is a dictionary word, do nothing. If it isn't, then if there is
  313|       |            // no preceding word, or the non-word shares less than the minimum threshold
  314|       |            // of characters with a dictionary word, then scan to resynchronize
  315|  1.42M|            if (words[wordsFound % THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
  ------------------
  |  Branch (315:17): [True: 1.39M, False: 33.2k]
  ------------------
  316|  1.42M|                  && (cuWordLength == 0
  ------------------
  |  Branch (316:23): [True: 703k, False: 691k]
  ------------------
  317|  1.39M|                      || words[wordsFound%THAI_LOOKAHEAD].longestPrefix() < THAI_PREFIX_COMBINE_THRESHOLD)) {
  ------------------
  |  Branch (317:26): [True: 1.15k, False: 690k]
  ------------------
  318|       |                // Look for a plausible word boundary
  319|   704k|                int32_t remaining = rangeEnd - (current+cuWordLength);
  320|   704k|                UChar32 pc;
  321|   704k|                int32_t chars = 0;
  322|   719k|                for (;;) {
  323|   719k|                    int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|   719k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   719k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   719k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   719k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  324|   719k|                    pc = utext_next32(text);
  ------------------
  |  | 1904|   719k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|   719k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   719k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   719k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|   719k|                    int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex;
  ------------------
  |  | 1897|   719k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   719k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   719k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   719k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  326|   719k|                    chars += pcSize;
  327|   719k|                    remaining -= pcSize;
  328|   719k|                    if (remaining <= 0) {
  ------------------
  |  Branch (328:25): [True: 3.27k, False: 715k]
  ------------------
  329|  3.27k|                        break;
  330|  3.27k|                    }
  331|   715k|                    uc = utext_current32(text);
  ------------------
  |  | 1893|   715k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|   715k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   715k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   715k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|   715k|                    if (fEndWordSet.contains(pc) && fBeginWordSet.contains(uc)) {
  ------------------
  |  Branch (332:25): [True: 713k, False: 2.75k]
  |  Branch (332:53): [True: 711k, False: 2.05k]
  ------------------
  333|       |                        // Maybe. See if it's in the dictionary.
  334|       |                        // NOTE: In the original Apple code, checked that the next
  335|       |                        // two characters after uc were not 0x0E4C THANTHAKHAT before
  336|       |                        // checking the dictionary. That is just a performance filter,
  337|       |                        // but it's not clear it's faster than checking the trie.
  338|   711k|                        int32_t num_candidates = words[(wordsFound + 1) % THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  339|   711k|                        utext_setNativeIndex(text, current + cuWordLength + chars);
  ------------------
  |  | 1915|   711k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   711k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   711k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   711k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  340|   711k|                        if (num_candidates > 0) {
  ------------------
  |  Branch (340:29): [True: 701k, False: 9.46k]
  ------------------
  341|   701k|                            break;
  342|   701k|                        }
  343|   711k|                    }
  344|   715k|                }
  345|       |                
  346|       |                // Bump the word count if there wasn't already one
  347|   704k|                if (cuWordLength <= 0) {
  ------------------
  |  Branch (347:21): [True: 703k, False: 1.15k]
  ------------------
  348|   703k|                    wordsFound += 1;
  349|   703k|                }
  350|       |                
  351|       |                // Update the length with the passed-over characters
  352|   704k|                cuWordLength += chars;
  353|   704k|            }
  354|   723k|            else {
  355|       |                // Back up to where we were for next iteration
  356|   723k|                utext_setNativeIndex(text, current+cuWordLength);
  ------------------
  |  | 1915|   723k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   723k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   723k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   723k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|   723k|            }
  358|  1.42M|        }
  359|       |
  360|       |        // Never stop before a combining mark.
  361|  1.44M|        int32_t currPos;
  362|  1.44M|        while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1897|  1.44M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.44M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.44M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.44M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1893|  1.44M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  1.44M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.44M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.44M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (362:16): [True: 1.44M, False: 5.25k]
  |  Branch (362:91): [True: 221, False: 1.44M]
  ------------------
  363|    221|            utext_next32(text);
  ------------------
  |  | 1904|    221|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|    221|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    221|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    221|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  364|    221|            cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos;
  ------------------
  |  | 1897|    221|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|    221|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    221|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    221|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  365|    221|        }
  366|       |
  367|       |        // Look ahead for possible suffixes if a dictionary word does not follow.
  368|       |        // We do this in code rather than using a rule so that the heuristic
  369|       |        // resynch continues to function. For example, one of the suffix characters
  370|       |        // could be a typo in the middle of a word.
  371|  1.44M|        if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cuWordLength > 0) {
  ------------------
  |  | 1897|  1.44M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.44M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.44M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.44M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (371:13): [True: 1.44M, False: 5.25k]
  |  Branch (371:76): [True: 1.44M, False: 0]
  ------------------
  372|  1.44M|            if (words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
  ------------------
  |  Branch (372:17): [True: 702k, False: 738k]
  ------------------
  373|  1.44M|                && fSuffixSet.contains(uc = utext_current32(text))) {
  ------------------
  |  | 1893|   702k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|   702k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   702k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   702k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (373:20): [True: 11.5k, False: 691k]
  ------------------
  374|  11.5k|                if (uc == THAI_PAIYANNOI) {
  ------------------
  |  Branch (374:21): [True: 10.8k, False: 665]
  ------------------
  375|  10.8k|                    if (!fSuffixSet.contains(utext_previous32(text))) {
  ------------------
  |  | 1912|  10.8k|#define utext_previous32 U_ICU_ENTRY_POINT_RENAME(utext_previous32)
  |  |  ------------------
  |  |  |  |  123|  10.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  10.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  10.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (375:25): [True: 2.35k, False: 8.50k]
  ------------------
  376|       |                        // Skip over previous end and PAIYANNOI
  377|  2.35k|                        utext_next32(text);
  ------------------
  |  | 1904|  2.35k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  2.35k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.35k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.35k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  378|  2.35k|                        int32_t paiyannoiIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|  2.35k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.35k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.35k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.35k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  379|  2.35k|                        utext_next32(text);
  ------------------
  |  | 1904|  2.35k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  2.35k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.35k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.35k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  380|  2.35k|                        cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - paiyannoiIndex; // Add PAIYANNOI to word
  ------------------
  |  | 1897|  2.35k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.35k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.35k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.35k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  381|  2.35k|                        uc = utext_current32(text);     // Fetch next character
  ------------------
  |  | 1893|  2.35k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  2.35k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.35k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.35k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  382|  2.35k|                    }
  383|  8.50k|                    else {
  384|       |                        // Restore prior position
  385|  8.50k|                        utext_next32(text);
  ------------------
  |  | 1904|  8.50k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  8.50k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.50k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.50k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  386|  8.50k|                    }
  387|  10.8k|                }
  388|  11.5k|                if (uc == THAI_MAIYAMOK) {
  ------------------
  |  Branch (388:21): [True: 2.56k, False: 8.95k]
  ------------------
  389|  2.56k|                    if (utext_previous32(text) != THAI_MAIYAMOK) {
  ------------------
  |  | 1912|  2.56k|#define utext_previous32 U_ICU_ENTRY_POINT_RENAME(utext_previous32)
  |  |  ------------------
  |  |  |  |  123|  2.56k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.56k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.56k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (389:25): [True: 2.12k, False: 440]
  ------------------
  390|       |                        // Skip over previous end and MAIYAMOK
  391|  2.12k|                        utext_next32(text);
  ------------------
  |  | 1904|  2.12k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  392|  2.12k|                        int32_t maiyamokIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|  2.12k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  393|  2.12k|                        utext_next32(text);
  ------------------
  |  | 1904|  2.12k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  394|  2.12k|                        cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - maiyamokIndex; // Add MAIYAMOK to word
  ------------------
  |  | 1897|  2.12k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  395|  2.12k|                    }
  396|    440|                    else {
  397|       |                        // Restore prior position
  398|    440|                        utext_next32(text);
  ------------------
  |  | 1904|    440|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|    440|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    440|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    440|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  399|    440|                    }
  400|  2.56k|                }
  401|  11.5k|            }
  402|  1.42M|            else {
  403|  1.42M|                utext_setNativeIndex(text, current+cuWordLength);
  ------------------
  |  | 1915|  1.42M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.42M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.42M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.42M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  404|  1.42M|            }
  405|  1.44M|        }
  406|       |
  407|       |        // Did we find a word on this iteration? If so, push it on the break stack
  408|  1.44M|        if (cuWordLength > 0) {
  ------------------
  |  Branch (408:13): [True: 1.44M, False: 0]
  ------------------
  409|  1.44M|            foundBreaks.push((current+cuWordLength), status);
  410|  1.44M|        }
  411|  1.44M|    }
  412|       |
  413|       |    // Don't return a break for the end of the dictionary range if there is one there.
  414|  5.62k|    if (foundBreaks.peeki() >= rangeEnd) {
  ------------------
  |  Branch (414:9): [True: 5.62k, False: 0]
  ------------------
  415|  5.62k|        (void) foundBreaks.popi();
  416|  5.62k|        wordsFound -= 1;
  417|  5.62k|    }
  418|       |
  419|  5.62k|    return wordsFound;
  420|  5.62k|}
_ZN6icu_7814LaoBreakEngineC2EPNS_17DictionaryMatcherER10UErrorCode:
  444|      1|    : DictionaryBreakEngine(),
  445|      1|      fDictionary(adoptDictionary)
  446|      1|{
  447|      1|    UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
  448|      1|    UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Laoo");
  449|      1|    UnicodeSet laoWordSet(UnicodeString(u"[[:Laoo:]&[:LineBreak=SA:]]"), status);
  450|      1|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (450:9): [True: 1, False: 0]
  ------------------
  451|      1|        setCharacters(laoWordSet);
  452|      1|    }
  453|      1|    fMarkSet.applyPattern(UnicodeString(u"[[:Laoo:]&[:LineBreak=SA:]&[:M:]]"), status);
  454|      1|    fMarkSet.add(0x0020);
  455|      1|    fEndWordSet = laoWordSet;
  456|      1|    fEndWordSet.remove(0x0EC0, 0x0EC4);     // prefix vowels
  457|      1|    fBeginWordSet.add(0x0E81, 0x0EAE);      // basic consonants (including holes for corresponding Thai characters)
  458|      1|    fBeginWordSet.add(0x0EDC, 0x0EDD);      // digraph consonants (no Thai equivalent)
  459|      1|    fBeginWordSet.add(0x0EC0, 0x0EC4);      // prefix vowels
  460|       |
  461|       |    // Compact for caching.
  462|      1|    fMarkSet.compact();
  463|      1|    fEndWordSet.compact();
  464|      1|    fBeginWordSet.compact();
  465|      1|    UTRACE_EXIT_STATUS(status);
  466|      1|}
_ZNK6icu_7814LaoBreakEngine23divideUpDictionaryRangeEP5UTextiiRNS_9UVector32EaR10UErrorCode:
  478|  25.2k|                                                UErrorCode& status) const {
  479|  25.2k|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (479:9): [True: 0, False: 25.2k]
  ------------------
  480|  25.2k|    if ((rangeEnd - rangeStart) < LAO_MIN_WORD_SPAN) {
  ------------------
  |  Branch (480:9): [True: 16.3k, False: 8.93k]
  ------------------
  481|  16.3k|        return 0;       // Not enough characters for two words
  482|  16.3k|    }
  483|       |
  484|  8.93k|    uint32_t wordsFound = 0;
  485|  8.93k|    int32_t cpWordLength = 0;
  486|  8.93k|    int32_t cuWordLength = 0;
  487|  8.93k|    int32_t current;
  488|  8.93k|    PossibleWord words[LAO_LOOKAHEAD];
  489|       |
  490|  8.93k|    utext_setNativeIndex(text, rangeStart);
  ------------------
  |  | 1915|  8.93k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  8.93k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.93k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.93k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  491|       |
  492|   227k|    while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) {
  ------------------
  |  | 1897|   227k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   227k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   227k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   227k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (492:12): [True: 227k, False: 0]
  |  Branch (492:33): [True: 218k, False: 8.93k]
  ------------------
  493|   218k|        cuWordLength = 0;
  494|   218k|        cpWordLength = 0;
  495|       |
  496|       |        // Look for candidate words at the current position
  497|   218k|        int32_t candidates = words[wordsFound%LAO_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  498|       |        
  499|       |        // If we found exactly one, use that
  500|   218k|        if (candidates == 1) {
  ------------------
  |  Branch (500:13): [True: 67.7k, False: 151k]
  ------------------
  501|  67.7k|            cuWordLength = words[wordsFound % LAO_LOOKAHEAD].acceptMarked(text);
  502|  67.7k|            cpWordLength = words[wordsFound % LAO_LOOKAHEAD].markedCPLength();
  503|  67.7k|            wordsFound += 1;
  504|  67.7k|        }
  505|       |        // If there was more than one, see which one can take us forward the most words
  506|   151k|        else if (candidates > 1) {
  ------------------
  |  Branch (506:18): [True: 83.2k, False: 67.7k]
  ------------------
  507|       |            // If we're already at the end of the range, we're done
  508|  83.2k|            if (utext_getNativeIndex(text) >= rangeEnd) {
  ------------------
  |  | 1897|  83.2k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  83.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  83.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  83.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (508:17): [True: 2.25k, False: 81.0k]
  ------------------
  509|  2.25k|                goto foundBest;
  510|  2.25k|            }
  511|   135k|            do {
  512|   135k|                if (words[(wordsFound + 1) % LAO_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) {
  ------------------
  |  Branch (512:21): [True: 55.6k, False: 79.9k]
  ------------------
  513|       |                    // Followed by another dictionary word; mark first word as a good candidate
  514|  55.6k|                    words[wordsFound%LAO_LOOKAHEAD].markCurrent();
  515|       |                    
  516|       |                    // If we're already at the end of the range, we're done
  517|  55.6k|                    if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) {
  ------------------
  |  | 1897|  55.6k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  55.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (517:25): [True: 1.44k, False: 54.2k]
  ------------------
  518|  1.44k|                        goto foundBest;
  519|  1.44k|                    }
  520|       |                    
  521|       |                    // See if any of the possible second words is followed by a third word
  522|   101k|                    do {
  523|       |                        // If we find a third word, stop right away
  524|   101k|                        if (words[(wordsFound + 2) % LAO_LOOKAHEAD].candidates(text, fDictionary, rangeEnd)) {
  ------------------
  |  Branch (524:29): [True: 26.8k, False: 74.4k]
  ------------------
  525|  26.8k|                            words[wordsFound % LAO_LOOKAHEAD].markCurrent();
  526|  26.8k|                            goto foundBest;
  527|  26.8k|                        }
  528|   101k|                    }
  529|  74.4k|                    while (words[(wordsFound + 1) % LAO_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (529:28): [True: 47.0k, False: 27.3k]
  ------------------
  530|  54.2k|                }
  531|   135k|            }
  532|   107k|            while (words[wordsFound % LAO_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (532:20): [True: 54.5k, False: 52.7k]
  ------------------
  533|  83.2k|foundBest:
  534|  83.2k|            cuWordLength = words[wordsFound % LAO_LOOKAHEAD].acceptMarked(text);
  535|  83.2k|            cpWordLength = words[wordsFound % LAO_LOOKAHEAD].markedCPLength();
  536|  83.2k|            wordsFound += 1;
  537|  83.2k|        }
  538|       |        
  539|       |        // We come here after having either found a word or not. We look ahead to the
  540|       |        // next word. If it's not a dictionary word, we will combine it with the word we
  541|       |        // just found (if there is one), but only if the preceding word does not exceed
  542|       |        // the threshold.
  543|       |        // The text iterator should now be positioned at the end of the word we found.
  544|   218k|        if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < LAO_ROOT_COMBINE_THRESHOLD) {
  ------------------
  |  | 1897|   218k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (544:13): [True: 214k, False: 4.06k]
  |  Branch (544:76): [True: 161k, False: 53.4k]
  ------------------
  545|       |            // if it is a dictionary word, do nothing. If it isn't, then if there is
  546|       |            // no preceding word, or the non-word shares less than the minimum threshold
  547|       |            // of characters with a dictionary word, then scan to resynchronize
  548|   161k|            if (words[wordsFound % LAO_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
  ------------------
  |  Branch (548:17): [True: 110k, False: 50.5k]
  ------------------
  549|   161k|                  && (cuWordLength == 0
  ------------------
  |  Branch (549:23): [True: 67.7k, False: 42.9k]
  ------------------
  550|   110k|                      || words[wordsFound%LAO_LOOKAHEAD].longestPrefix() < LAO_PREFIX_COMBINE_THRESHOLD)) {
  ------------------
  |  Branch (550:26): [True: 4.83k, False: 38.1k]
  ------------------
  551|       |                // Look for a plausible word boundary
  552|  72.6k|                int32_t remaining = rangeEnd - (current + cuWordLength);
  553|  72.6k|                UChar32 pc;
  554|  72.6k|                UChar32 uc;
  555|  72.6k|                int32_t chars = 0;
  556|   135k|                for (;;) {
  557|   135k|                    int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|   135k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   135k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   135k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   135k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  558|   135k|                    pc = utext_next32(text);
  ------------------
  |  | 1904|   135k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|   135k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   135k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   135k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  559|   135k|                    int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex;
  ------------------
  |  | 1897|   135k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   135k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   135k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   135k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  560|   135k|                    chars += pcSize;
  561|   135k|                    remaining -= pcSize;
  562|   135k|                    if (remaining <= 0) {
  ------------------
  |  Branch (562:25): [True: 4.84k, False: 130k]
  ------------------
  563|  4.84k|                        break;
  564|  4.84k|                    }
  565|   130k|                    uc = utext_current32(text);
  ------------------
  |  | 1893|   130k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|   130k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   130k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   130k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  566|   130k|                    if (fEndWordSet.contains(pc) && fBeginWordSet.contains(uc)) {
  ------------------
  |  Branch (566:25): [True: 78.2k, False: 52.5k]
  |  Branch (566:53): [True: 76.7k, False: 1.45k]
  ------------------
  567|       |                        // Maybe. See if it's in the dictionary.
  568|       |                        // TODO: this looks iffy; compare with old code.
  569|  76.7k|                        int32_t num_candidates = words[(wordsFound + 1) % LAO_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  570|  76.7k|                        utext_setNativeIndex(text, current + cuWordLength + chars);
  ------------------
  |  | 1915|  76.7k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  76.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  76.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  76.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|  76.7k|                        if (num_candidates > 0) {
  ------------------
  |  Branch (571:29): [True: 67.7k, False: 8.98k]
  ------------------
  572|  67.7k|                            break;
  573|  67.7k|                        }
  574|  76.7k|                    }
  575|   130k|                }
  576|       |                
  577|       |                // Bump the word count if there wasn't already one
  578|  72.6k|                if (cuWordLength <= 0) {
  ------------------
  |  Branch (578:21): [True: 67.7k, False: 4.83k]
  ------------------
  579|  67.7k|                    wordsFound += 1;
  580|  67.7k|                }
  581|       |                
  582|       |                // Update the length with the passed-over characters
  583|  72.6k|                cuWordLength += chars;
  584|  72.6k|            }
  585|  88.6k|            else {
  586|       |                // Back up to where we were for next iteration
  587|  88.6k|                utext_setNativeIndex(text, current + cuWordLength);
  ------------------
  |  | 1915|  88.6k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  88.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  88.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  88.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  588|  88.6k|            }
  589|   161k|        }
  590|       |        
  591|       |        // Never stop before a combining mark.
  592|   218k|        int32_t currPos;
  593|   219k|        while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1897|   219k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   219k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   219k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   219k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1893|   210k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|   210k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   210k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   210k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (593:16): [True: 210k, False: 8.93k]
  |  Branch (593:91): [True: 909, False: 209k]
  ------------------
  594|    909|            utext_next32(text);
  ------------------
  |  | 1904|    909|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|    909|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    909|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    909|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  595|    909|            cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos;
  ------------------
  |  | 1897|    909|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|    909|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    909|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    909|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  596|    909|        }
  597|       |        
  598|       |        // Look ahead for possible suffixes if a dictionary word does not follow.
  599|       |        // We do this in code rather than using a rule so that the heuristic
  600|       |        // resynch continues to function. For example, one of the suffix characters
  601|       |        // could be a typo in the middle of a word.
  602|       |        // NOT CURRENTLY APPLICABLE TO LAO
  603|       |
  604|       |        // Did we find a word on this iteration? If so, push it on the break stack
  605|   218k|        if (cuWordLength > 0) {
  ------------------
  |  Branch (605:13): [True: 218k, False: 0]
  ------------------
  606|   218k|            foundBreaks.push((current+cuWordLength), status);
  607|   218k|        }
  608|   218k|    }
  609|       |
  610|       |    // Don't return a break for the end of the dictionary range if there is one there.
  611|  8.93k|    if (foundBreaks.peeki() >= rangeEnd) {
  ------------------
  |  Branch (611:9): [True: 8.93k, False: 0]
  ------------------
  612|  8.93k|        (void) foundBreaks.popi();
  613|  8.93k|        wordsFound -= 1;
  614|  8.93k|    }
  615|       |
  616|  8.93k|    return wordsFound;
  617|  8.93k|}
_ZN6icu_7818BurmeseBreakEngineC2EPNS_17DictionaryMatcherER10UErrorCode:
  641|      1|    : DictionaryBreakEngine(),
  642|      1|      fDictionary(adoptDictionary)
  643|      1|{
  644|      1|    UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
  645|      1|    UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Mymr");
  646|      1|    fBeginWordSet.add(0x1000, 0x102A);      // basic consonants and independent vowels
  647|      1|    fEndWordSet.applyPattern(UnicodeString(u"[[:Mymr:]&[:LineBreak=SA:]]"), status);
  648|      1|    fMarkSet.applyPattern(UnicodeString(u"[[:Mymr:]&[:LineBreak=SA:]&[:M:]]"), status);
  649|      1|    fMarkSet.add(0x0020);
  650|      1|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (650:9): [True: 1, False: 0]
  ------------------
  651|      1|        setCharacters(fEndWordSet);
  652|      1|    }
  653|       |
  654|       |    // Compact for caching.
  655|      1|    fMarkSet.compact();
  656|      1|    fEndWordSet.compact();
  657|      1|    fBeginWordSet.compact();
  658|      1|    UTRACE_EXIT_STATUS(status);
  659|      1|}
_ZNK6icu_7818BurmeseBreakEngine23divideUpDictionaryRangeEP5UTextiiRNS_9UVector32EaR10UErrorCode:
  671|  40.0k|                                                UErrorCode& status ) const {
  672|  40.0k|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (672:9): [True: 0, False: 40.0k]
  ------------------
  673|  40.0k|    if ((rangeEnd - rangeStart) < BURMESE_MIN_WORD_SPAN) {
  ------------------
  |  Branch (673:9): [True: 33.0k, False: 7.06k]
  ------------------
  674|  33.0k|        return 0;       // Not enough characters for two words
  675|  33.0k|    }
  676|       |
  677|  7.06k|    uint32_t wordsFound = 0;
  678|  7.06k|    int32_t cpWordLength = 0;
  679|  7.06k|    int32_t cuWordLength = 0;
  680|  7.06k|    int32_t current;
  681|  7.06k|    PossibleWord words[BURMESE_LOOKAHEAD];
  682|       |
  683|  7.06k|    utext_setNativeIndex(text, rangeStart);
  ------------------
  |  | 1915|  7.06k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  7.06k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.06k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.06k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  684|       |
  685|  5.34M|    while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) {
  ------------------
  |  | 1897|  5.34M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  5.34M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.34M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.34M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (685:12): [True: 5.34M, False: 0]
  |  Branch (685:33): [True: 5.34M, False: 7.06k]
  ------------------
  686|  5.34M|        cuWordLength = 0;
  687|  5.34M|        cpWordLength = 0;
  688|       |
  689|       |        // Look for candidate words at the current position
  690|  5.34M|        int32_t candidates = words[wordsFound%BURMESE_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  691|       |        
  692|       |        // If we found exactly one, use that
  693|  5.34M|        if (candidates == 1) {
  ------------------
  |  Branch (693:13): [True: 5.31M, False: 25.6k]
  ------------------
  694|  5.31M|            cuWordLength = words[wordsFound % BURMESE_LOOKAHEAD].acceptMarked(text);
  695|  5.31M|            cpWordLength = words[wordsFound % BURMESE_LOOKAHEAD].markedCPLength();
  696|  5.31M|            wordsFound += 1;
  697|  5.31M|        }
  698|       |        // If there was more than one, see which one can take us forward the most words
  699|  25.6k|        else if (candidates > 1) {
  ------------------
  |  Branch (699:18): [True: 19.1k, False: 6.49k]
  ------------------
  700|       |            // If we're already at the end of the range, we're done
  701|  19.1k|            if (utext_getNativeIndex(text) >= rangeEnd) {
  ------------------
  |  | 1897|  19.1k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  19.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (701:17): [True: 1.30k, False: 17.8k]
  ------------------
  702|  1.30k|                goto foundBest;
  703|  1.30k|            }
  704|  45.7k|            do {
  705|  45.7k|                if (words[(wordsFound + 1) % BURMESE_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) {
  ------------------
  |  Branch (705:21): [True: 15.8k, False: 29.8k]
  ------------------
  706|       |                    // Followed by another dictionary word; mark first word as a good candidate
  707|  15.8k|                    words[wordsFound%BURMESE_LOOKAHEAD].markCurrent();
  708|       |                    
  709|       |                    // If we're already at the end of the range, we're done
  710|  15.8k|                    if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) {
  ------------------
  |  | 1897|  15.8k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  15.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  15.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  15.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (710:25): [True: 777, False: 15.0k]
  ------------------
  711|    777|                        goto foundBest;
  712|    777|                    }
  713|       |                    
  714|       |                    // See if any of the possible second words is followed by a third word
  715|  31.1k|                    do {
  716|       |                        // If we find a third word, stop right away
  717|  31.1k|                        if (words[(wordsFound + 2) % BURMESE_LOOKAHEAD].candidates(text, fDictionary, rangeEnd)) {
  ------------------
  |  Branch (717:29): [True: 8.11k, False: 23.0k]
  ------------------
  718|  8.11k|                            words[wordsFound % BURMESE_LOOKAHEAD].markCurrent();
  719|  8.11k|                            goto foundBest;
  720|  8.11k|                        }
  721|  31.1k|                    }
  722|  23.0k|                    while (words[(wordsFound + 1) % BURMESE_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (722:28): [True: 16.1k, False: 6.96k]
  ------------------
  723|  15.0k|                }
  724|  45.7k|            }
  725|  36.8k|            while (words[wordsFound % BURMESE_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (725:20): [True: 27.9k, False: 8.90k]
  ------------------
  726|  19.1k|foundBest:
  727|  19.1k|            cuWordLength = words[wordsFound % BURMESE_LOOKAHEAD].acceptMarked(text);
  728|  19.1k|            cpWordLength = words[wordsFound % BURMESE_LOOKAHEAD].markedCPLength();
  729|  19.1k|            wordsFound += 1;
  730|  19.1k|        }
  731|       |        
  732|       |        // We come here after having either found a word or not. We look ahead to the
  733|       |        // next word. If it's not a dictionary word, we will combine it with the word we
  734|       |        // just found (if there is one), but only if the preceding word does not exceed
  735|       |        // the threshold.
  736|       |        // The text iterator should now be positioned at the end of the word we found.
  737|  5.34M|        if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < BURMESE_ROOT_COMBINE_THRESHOLD) {
  ------------------
  |  | 1897|  5.34M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  5.34M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.34M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.34M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (737:13): [True: 5.33M, False: 4.07k]
  |  Branch (737:76): [True: 5.33M, False: 4.28k]
  ------------------
  738|       |            // if it is a dictionary word, do nothing. If it isn't, then if there is
  739|       |            // no preceding word, or the non-word shares less than the minimum threshold
  740|       |            // of characters with a dictionary word, then scan to resynchronize
  741|  5.33M|            if (words[wordsFound % BURMESE_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
  ------------------
  |  Branch (741:17): [True: 10.4k, False: 5.32M]
  ------------------
  742|  5.33M|                  && (cuWordLength == 0
  ------------------
  |  Branch (742:23): [True: 6.49k, False: 3.95k]
  ------------------
  743|  10.4k|                      || words[wordsFound%BURMESE_LOOKAHEAD].longestPrefix() < BURMESE_PREFIX_COMBINE_THRESHOLD)) {
  ------------------
  |  Branch (743:26): [True: 3.63k, False: 317]
  ------------------
  744|       |                // Look for a plausible word boundary
  745|  10.1k|                int32_t remaining = rangeEnd - (current + cuWordLength);
  746|  10.1k|                UChar32 pc;
  747|  10.1k|                UChar32 uc;
  748|  10.1k|                int32_t chars = 0;
  749|  22.6k|                for (;;) {
  750|  22.6k|                    int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|  22.6k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  22.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  22.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  22.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  751|  22.6k|                    pc = utext_next32(text);
  ------------------
  |  | 1904|  22.6k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  22.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  22.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  22.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|  22.6k|                    int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex;
  ------------------
  |  | 1897|  22.6k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  22.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  22.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  22.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  753|  22.6k|                    chars += pcSize;
  754|  22.6k|                    remaining -= pcSize;
  755|  22.6k|                    if (remaining <= 0) {
  ------------------
  |  Branch (755:25): [True: 2.90k, False: 19.7k]
  ------------------
  756|  2.90k|                        break;
  757|  2.90k|                    }
  758|  19.7k|                    uc = utext_current32(text);
  ------------------
  |  | 1893|  19.7k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  19.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  759|  19.7k|                    if (fEndWordSet.contains(pc) && fBeginWordSet.contains(uc)) {
  ------------------
  |  Branch (759:25): [True: 19.7k, False: 0]
  |  Branch (759:53): [True: 17.6k, False: 2.09k]
  ------------------
  760|       |                        // Maybe. See if it's in the dictionary.
  761|       |                        // TODO: this looks iffy; compare with old code.
  762|  17.6k|                        int32_t num_candidates = words[(wordsFound + 1) % BURMESE_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  763|  17.6k|                        utext_setNativeIndex(text, current + cuWordLength + chars);
  ------------------
  |  | 1915|  17.6k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  17.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  17.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  17.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  764|  17.6k|                        if (num_candidates > 0) {
  ------------------
  |  Branch (764:29): [True: 7.22k, False: 10.4k]
  ------------------
  765|  7.22k|                            break;
  766|  7.22k|                        }
  767|  17.6k|                    }
  768|  19.7k|                }
  769|       |                
  770|       |                // Bump the word count if there wasn't already one
  771|  10.1k|                if (cuWordLength <= 0) {
  ------------------
  |  Branch (771:21): [True: 6.49k, False: 3.63k]
  ------------------
  772|  6.49k|                    wordsFound += 1;
  773|  6.49k|                }
  774|       |                
  775|       |                // Update the length with the passed-over characters
  776|  10.1k|                cuWordLength += chars;
  777|  10.1k|            }
  778|  5.32M|            else {
  779|       |                // Back up to where we were for next iteration
  780|  5.32M|                utext_setNativeIndex(text, current + cuWordLength);
  ------------------
  |  | 1915|  5.32M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  5.32M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.32M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.32M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  781|  5.32M|            }
  782|  5.33M|        }
  783|       |        
  784|       |        // Never stop before a combining mark.
  785|  5.34M|        int32_t currPos;
  786|  5.34M|        while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1897|  5.34M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  5.34M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.34M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.34M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1893|  5.33M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  5.33M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.33M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.33M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (786:16): [True: 5.33M, False: 7.06k]
  |  Branch (786:91): [True: 1.09k, False: 5.33M]
  ------------------
  787|  1.09k|            utext_next32(text);
  ------------------
  |  | 1904|  1.09k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  1.09k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.09k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.09k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  788|  1.09k|            cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos;
  ------------------
  |  | 1897|  1.09k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.09k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.09k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.09k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  789|  1.09k|        }
  790|       |        
  791|       |        // Look ahead for possible suffixes if a dictionary word does not follow.
  792|       |        // We do this in code rather than using a rule so that the heuristic
  793|       |        // resynch continues to function. For example, one of the suffix characters
  794|       |        // could be a typo in the middle of a word.
  795|       |        // NOT CURRENTLY APPLICABLE TO BURMESE
  796|       |
  797|       |        // Did we find a word on this iteration? If so, push it on the break stack
  798|  5.34M|        if (cuWordLength > 0) {
  ------------------
  |  Branch (798:13): [True: 5.34M, False: 0]
  ------------------
  799|  5.34M|            foundBreaks.push((current+cuWordLength), status);
  800|  5.34M|        }
  801|  5.34M|    }
  802|       |
  803|       |    // Don't return a break for the end of the dictionary range if there is one there.
  804|  7.06k|    if (foundBreaks.peeki() >= rangeEnd) {
  ------------------
  |  Branch (804:9): [True: 7.06k, False: 0]
  ------------------
  805|  7.06k|        (void) foundBreaks.popi();
  806|  7.06k|        wordsFound -= 1;
  807|  7.06k|    }
  808|       |
  809|  7.06k|    return wordsFound;
  810|  7.06k|}
_ZN6icu_7816KhmerBreakEngineC2EPNS_17DictionaryMatcherER10UErrorCode:
  834|      1|    : DictionaryBreakEngine(),
  835|      1|      fDictionary(adoptDictionary)
  836|      1|{
  837|      1|    UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
  838|      1|    UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Khmr");
  839|      1|    UnicodeSet khmerWordSet(UnicodeString(u"[[:Khmr:]&[:LineBreak=SA:]]"), status);
  840|      1|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (840:9): [True: 1, False: 0]
  ------------------
  841|      1|        setCharacters(khmerWordSet);
  842|      1|    }
  843|      1|    fMarkSet.applyPattern(UnicodeString(u"[[:Khmr:]&[:LineBreak=SA:]&[:M:]]"), status);
  844|      1|    fMarkSet.add(0x0020);
  845|      1|    fEndWordSet = khmerWordSet;
  846|      1|    fBeginWordSet.add(0x1780, 0x17B3);
  847|       |    //fBeginWordSet.add(0x17A3, 0x17A4);      // deprecated vowels
  848|       |    //fEndWordSet.remove(0x17A5, 0x17A9);     // Khmer independent vowels that can't end a word
  849|       |    //fEndWordSet.remove(0x17B2);             // Khmer independent vowel that can't end a word
  850|      1|    fEndWordSet.remove(0x17D2);             // KHMER SIGN COENG that combines some following characters
  851|       |    //fEndWordSet.remove(0x17B6, 0x17C5);     // Remove dependent vowels
  852|       |//    fEndWordSet.remove(0x0E31);             // MAI HAN-AKAT
  853|       |//    fEndWordSet.remove(0x0E40, 0x0E44);     // SARA E through SARA AI MAIMALAI
  854|       |//    fBeginWordSet.add(0x0E01, 0x0E2E);      // KO KAI through HO NOKHUK
  855|       |//    fBeginWordSet.add(0x0E40, 0x0E44);      // SARA E through SARA AI MAIMALAI
  856|       |//    fSuffixSet.add(THAI_PAIYANNOI);
  857|       |//    fSuffixSet.add(THAI_MAIYAMOK);
  858|       |
  859|       |    // Compact for caching.
  860|      1|    fMarkSet.compact();
  861|      1|    fEndWordSet.compact();
  862|      1|    fBeginWordSet.compact();
  863|       |//    fSuffixSet.compact();
  864|      1|    UTRACE_EXIT_STATUS(status);
  865|      1|}
_ZNK6icu_7816KhmerBreakEngine23divideUpDictionaryRangeEP5UTextiiRNS_9UVector32EaR10UErrorCode:
  877|  16.9k|                                                UErrorCode& status ) const {
  878|  16.9k|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (878:9): [True: 0, False: 16.9k]
  ------------------
  879|  16.9k|    if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) {
  ------------------
  |  Branch (879:9): [True: 9.34k, False: 7.56k]
  ------------------
  880|  9.34k|        return 0;       // Not enough characters for two words
  881|  9.34k|    }
  882|       |
  883|  7.56k|    uint32_t wordsFound = 0;
  884|  7.56k|    int32_t cpWordLength = 0;
  885|  7.56k|    int32_t cuWordLength = 0;
  886|  7.56k|    int32_t current;
  887|  7.56k|    PossibleWord words[KHMER_LOOKAHEAD];
  888|       |
  889|  7.56k|    utext_setNativeIndex(text, rangeStart);
  ------------------
  |  | 1915|  7.56k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  7.56k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.56k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.56k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  890|       |
  891|  2.04M|    while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) {
  ------------------
  |  | 1897|  2.04M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.04M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (891:12): [True: 2.04M, False: 0]
  |  Branch (891:33): [True: 2.04M, False: 7.56k]
  ------------------
  892|  2.04M|        cuWordLength = 0;
  893|  2.04M|        cpWordLength = 0;
  894|       |
  895|       |        // Look for candidate words at the current position
  896|  2.04M|        int32_t candidates = words[wordsFound%KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  897|       |
  898|       |        // If we found exactly one, use that
  899|  2.04M|        if (candidates == 1) {
  ------------------
  |  Branch (899:13): [True: 1.16M, False: 878k]
  ------------------
  900|  1.16M|            cuWordLength = words[wordsFound % KHMER_LOOKAHEAD].acceptMarked(text);
  901|  1.16M|            cpWordLength = words[wordsFound % KHMER_LOOKAHEAD].markedCPLength();
  902|  1.16M|            wordsFound += 1;
  903|  1.16M|        }
  904|       |
  905|       |        // If there was more than one, see which one can take us forward the most words
  906|   878k|        else if (candidates > 1) {
  ------------------
  |  Branch (906:18): [True: 43.4k, False: 834k]
  ------------------
  907|       |            // If we're already at the end of the range, we're done
  908|  43.4k|            if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) {
  ------------------
  |  | 1897|  43.4k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  43.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  43.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  43.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (908:17): [True: 2.83k, False: 40.6k]
  ------------------
  909|  2.83k|                goto foundBest;
  910|  2.83k|            }
  911|  92.6k|            do {
  912|  92.6k|                if (words[(wordsFound + 1) % KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) {
  ------------------
  |  Branch (912:21): [True: 36.7k, False: 55.9k]
  ------------------
  913|       |                    // Followed by another dictionary word; mark first word as a good candidate
  914|  36.7k|                    words[wordsFound % KHMER_LOOKAHEAD].markCurrent();
  915|       |
  916|       |                    // If we're already at the end of the range, we're done
  917|  36.7k|                    if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) {
  ------------------
  |  | 1897|  36.7k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  36.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  36.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  36.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (917:25): [True: 2.38k, False: 34.3k]
  ------------------
  918|  2.38k|                        goto foundBest;
  919|  2.38k|                    }
  920|       |
  921|       |                    // See if any of the possible second words is followed by a third word
  922|  73.2k|                    do {
  923|       |                        // If we find a third word, stop right away
  924|  73.2k|                        if (words[(wordsFound + 2) % KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd)) {
  ------------------
  |  Branch (924:29): [True: 11.7k, False: 61.4k]
  ------------------
  925|  11.7k|                            words[wordsFound % KHMER_LOOKAHEAD].markCurrent();
  926|  11.7k|                            goto foundBest;
  927|  11.7k|                        }
  928|  73.2k|                    }
  929|  61.4k|                    while (words[(wordsFound + 1) % KHMER_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (929:28): [True: 38.9k, False: 22.5k]
  ------------------
  930|  34.3k|                }
  931|  92.6k|            }
  932|  78.4k|            while (words[wordsFound % KHMER_LOOKAHEAD].backUp(text));
  ------------------
  |  Branch (932:20): [True: 52.0k, False: 26.4k]
  ------------------
  933|  43.4k|foundBest:
  934|  43.4k|            cuWordLength = words[wordsFound % KHMER_LOOKAHEAD].acceptMarked(text);
  935|  43.4k|            cpWordLength = words[wordsFound % KHMER_LOOKAHEAD].markedCPLength();
  936|  43.4k|            wordsFound += 1;
  937|  43.4k|        }
  938|       |
  939|       |        // We come here after having either found a word or not. We look ahead to the
  940|       |        // next word. If it's not a dictionary word, we will combine it with the word we
  941|       |        // just found (if there is one), but only if the preceding word does not exceed
  942|       |        // the threshold.
  943|       |        // The text iterator should now be positioned at the end of the word we found.
  944|  2.04M|        if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < KHMER_ROOT_COMBINE_THRESHOLD) {
  ------------------
  |  | 1897|  2.04M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.04M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (944:13): [True: 2.03M, False: 5.54k]
  |  Branch (944:76): [True: 2.03M, False: 3.44k]
  ------------------
  945|       |            // if it is a dictionary word, do nothing. If it isn't, then if there is
  946|       |            // no preceding word, or the non-word shares less than the minimum threshold
  947|       |            // of characters with a dictionary word, then scan to resynchronize
  948|  2.03M|            if (words[wordsFound % KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
  ------------------
  |  Branch (948:17): [True: 1.67M, False: 359k]
  ------------------
  949|  2.03M|                  && (cuWordLength == 0
  ------------------
  |  Branch (949:23): [True: 834k, False: 837k]
  ------------------
  950|  1.67M|                      || words[wordsFound % KHMER_LOOKAHEAD].longestPrefix() < KHMER_PREFIX_COMBINE_THRESHOLD)) {
  ------------------
  |  Branch (950:26): [True: 5.39k, False: 832k]
  ------------------
  951|       |                // Look for a plausible word boundary
  952|   840k|                int32_t remaining = rangeEnd - (current+cuWordLength);
  953|   840k|                UChar32 pc;
  954|   840k|                UChar32 uc;
  955|   840k|                int32_t chars = 0;
  956|   843k|                for (;;) {
  957|   843k|                    int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|   843k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   843k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   843k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   843k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  958|   843k|                    pc = utext_next32(text);
  ------------------
  |  | 1904|   843k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|   843k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   843k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   843k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  959|   843k|                    int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex;
  ------------------
  |  | 1897|   843k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   843k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   843k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   843k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  960|   843k|                    chars += pcSize;
  961|   843k|                    remaining -= pcSize;
  962|   843k|                    if (remaining <= 0) {
  ------------------
  |  Branch (962:25): [True: 1.67k, False: 841k]
  ------------------
  963|  1.67k|                        break;
  964|  1.67k|                    }
  965|   841k|                    uc = utext_current32(text);
  ------------------
  |  | 1893|   841k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|   841k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   841k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   841k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  966|   841k|                    if (fEndWordSet.contains(pc) && fBeginWordSet.contains(uc)) {
  ------------------
  |  Branch (966:25): [True: 841k, False: 494]
  |  Branch (966:53): [True: 840k, False: 895]
  ------------------
  967|       |                        // Maybe. See if it's in the dictionary.
  968|   840k|                        int32_t num_candidates = words[(wordsFound + 1) % KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
  969|   840k|                        utext_setNativeIndex(text, current+cuWordLength+chars);
  ------------------
  |  | 1915|   840k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   840k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   840k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   840k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  970|   840k|                        if (num_candidates > 0) {
  ------------------
  |  Branch (970:29): [True: 838k, False: 1.87k]
  ------------------
  971|   838k|                            break;
  972|   838k|                        }
  973|   840k|                    }
  974|   841k|                }
  975|       |
  976|       |                // Bump the word count if there wasn't already one
  977|   840k|                if (cuWordLength <= 0) {
  ------------------
  |  Branch (977:21): [True: 834k, False: 5.39k]
  ------------------
  978|   834k|                    wordsFound += 1;
  979|   834k|                }
  980|       |
  981|       |                // Update the length with the passed-over characters
  982|   840k|                cuWordLength += chars;
  983|   840k|            }
  984|  1.19M|            else {
  985|       |                // Back up to where we were for next iteration
  986|  1.19M|                utext_setNativeIndex(text, current+cuWordLength);
  ------------------
  |  | 1915|  1.19M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.19M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.19M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.19M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  987|  1.19M|            }
  988|  2.03M|        }
  989|       |
  990|       |        // Never stop before a combining mark.
  991|  2.04M|        int32_t currPos;
  992|  2.04M|        while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1897|  2.04M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.04M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
  ------------------
  |  | 1893|  2.03M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  2.03M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.03M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.03M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (992:16): [True: 2.03M, False: 7.56k]
  |  Branch (992:91): [True: 1.91k, False: 2.03M]
  ------------------
  993|  1.91k|            utext_next32(text);
  ------------------
  |  | 1904|  1.91k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  1.91k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.91k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.91k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  994|  1.91k|            cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos;
  ------------------
  |  | 1897|  1.91k|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  1.91k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.91k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.91k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  995|  1.91k|        }
  996|       |
  997|       |        // Look ahead for possible suffixes if a dictionary word does not follow.
  998|       |        // We do this in code rather than using a rule so that the heuristic
  999|       |        // resynch continues to function. For example, one of the suffix characters
 1000|       |        // could be a typo in the middle of a word.
 1001|       |//        if ((int32_t)utext_getNativeIndex(text) < rangeEnd && wordLength > 0) {
 1002|       |//            if (words[wordsFound%KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
 1003|       |//                && fSuffixSet.contains(uc = utext_current32(text))) {
 1004|       |//                if (uc == KHMER_PAIYANNOI) {
 1005|       |//                    if (!fSuffixSet.contains(utext_previous32(text))) {
 1006|       |//                        // Skip over previous end and PAIYANNOI
 1007|       |//                        utext_next32(text);
 1008|       |//                        utext_next32(text);
 1009|       |//                        wordLength += 1;            // Add PAIYANNOI to word
 1010|       |//                        uc = utext_current32(text);     // Fetch next character
 1011|       |//                    }
 1012|       |//                    else {
 1013|       |//                        // Restore prior position
 1014|       |//                        utext_next32(text);
 1015|       |//                    }
 1016|       |//                }
 1017|       |//                if (uc == KHMER_MAIYAMOK) {
 1018|       |//                    if (utext_previous32(text) != KHMER_MAIYAMOK) {
 1019|       |//                        // Skip over previous end and MAIYAMOK
 1020|       |//                        utext_next32(text);
 1021|       |//                        utext_next32(text);
 1022|       |//                        wordLength += 1;            // Add MAIYAMOK to word
 1023|       |//                    }
 1024|       |//                    else {
 1025|       |//                        // Restore prior position
 1026|       |//                        utext_next32(text);
 1027|       |//                    }
 1028|       |//                }
 1029|       |//            }
 1030|       |//            else {
 1031|       |//                utext_setNativeIndex(text, current+wordLength);
 1032|       |//            }
 1033|       |//        }
 1034|       |
 1035|       |        // Did we find a word on this iteration? If so, push it on the break stack
 1036|  2.04M|        if (cuWordLength > 0) {
  ------------------
  |  Branch (1036:13): [True: 2.04M, False: 0]
  ------------------
 1037|  2.04M|            foundBreaks.push((current+cuWordLength), status);
 1038|  2.04M|        }
 1039|  2.04M|    }
 1040|       |    
 1041|       |    // Don't return a break for the end of the dictionary range if there is one there.
 1042|  7.56k|    if (foundBreaks.peeki() >= rangeEnd) {
  ------------------
  |  Branch (1042:9): [True: 7.56k, False: 0]
  ------------------
 1043|  7.56k|        (void) foundBreaks.popi();
 1044|  7.56k|        wordsFound -= 1;
 1045|  7.56k|    }
 1046|       |
 1047|  7.56k|    return wordsFound;
 1048|  7.56k|}
_ZN6icu_7814CjkBreakEngineC2EPNS_17DictionaryMatcherENS_12LanguageTypeER10UErrorCode:
 1057|      1|: DictionaryBreakEngine(), fDictionary(adoptDictionary), isCj(false) {
 1058|      1|    UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
 1059|      1|    UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Hani");
 1060|      1|    fMlBreakEngine = nullptr;
 1061|      1|    nfkcNorm2 = Normalizer2::getNFKCInstance(status);
 1062|       |    // Korean dictionary only includes Hangul syllables
 1063|      1|    fHangulWordSet.applyPattern(UnicodeString(u"[\\uac00-\\ud7a3]"), status);
 1064|      1|    fHangulWordSet.compact();
 1065|       |    // Digits, open puncutation and Alphabetic characters.
 1066|      1|    fDigitOrOpenPunctuationOrAlphabetSet.applyPattern(
 1067|      1|        UnicodeString(u"[[:Nd:][:Pi:][:Ps:][:Alphabetic:]]"), status);
 1068|      1|    fDigitOrOpenPunctuationOrAlphabetSet.compact();
 1069|      1|    fClosePunctuationSet.applyPattern(UnicodeString(u"[[:Pc:][:Pd:][:Pe:][:Pf:][:Po:]]"), status);
 1070|      1|    fClosePunctuationSet.compact();
 1071|       |
 1072|       |    // handle Korean and Japanese/Chinese using different dictionaries
 1073|      1|    if (type == kKorean) {
  ------------------
  |  Branch (1073:9): [True: 0, False: 1]
  ------------------
 1074|      0|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1074:13): [True: 0, False: 0]
  ------------------
 1075|      0|            setCharacters(fHangulWordSet);
 1076|      0|        }
 1077|      1|    } else { // Chinese and Japanese
 1078|      1|        UnicodeSet cjSet(UnicodeString(u"[[:Han:][:Hiragana:][:Katakana:]\\u30fc\\uff70\\uff9e\\uff9f]"), status);
 1079|      1|        isCj = true;
 1080|      1|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1080:13): [True: 1, False: 0]
  ------------------
 1081|      1|            setCharacters(cjSet);
 1082|       |#if UCONFIG_USE_ML_PHRASE_BREAKING
 1083|       |            fMlBreakEngine = new MlBreakEngine(fDigitOrOpenPunctuationOrAlphabetSet,
 1084|       |                                               fClosePunctuationSet, status);
 1085|       |            if (fMlBreakEngine == nullptr) {
 1086|       |                status = U_MEMORY_ALLOCATION_ERROR;
 1087|       |            }
 1088|       |#else
 1089|      1|            initJapanesePhraseParameter(status);
 1090|      1|#endif
 1091|      1|        }
 1092|      1|    }
 1093|      1|    UTRACE_EXIT_STATUS(status);
 1094|      1|}
_ZNK6icu_7814CjkBreakEngine23divideUpDictionaryRangeEP5UTextiiRNS_9UVector32EaR10UErrorCode:
 1139|  2.19M|        UErrorCode& status) const {
 1140|  2.19M|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (1140:9): [True: 0, False: 2.19M]
  ------------------
 1141|  2.19M|    if (rangeStart >= rangeEnd) {
  ------------------
  |  Branch (1141:9): [True: 0, False: 2.19M]
  ------------------
 1142|      0|        return 0;
 1143|      0|    }
 1144|       |
 1145|       |    // UnicodeString version of input UText, NFKC normalized if necessary.
 1146|  2.19M|    UnicodeString inString;
 1147|       |
 1148|       |    // inputMap[inStringIndex] = corresponding native index from UText inText.
 1149|       |    // If nullptr then mapping is 1:1
 1150|  2.19M|    LocalPointer<UVector32>     inputMap;
 1151|       |
 1152|       |    // if UText has the input string as one contiguous UTF-16 chunk
 1153|  2.19M|    if ((inText->providerProperties & utext_i32_flag(UTEXT_PROVIDER_STABLE_CHUNKS)) &&
  ------------------
  |  Branch (1153:9): [True: 2.19M, False: 0]
  ------------------
 1154|  2.19M|         inText->chunkNativeStart <= rangeStart &&
  ------------------
  |  Branch (1154:10): [True: 2.19M, False: 0]
  ------------------
 1155|  2.19M|         inText->chunkNativeLimit >= rangeEnd   &&
  ------------------
  |  Branch (1155:10): [True: 2.19M, False: 0]
  ------------------
 1156|  2.19M|         inText->nativeIndexingLimit >= rangeEnd - inText->chunkNativeStart) {
  ------------------
  |  Branch (1156:10): [True: 2.19M, False: 0]
  ------------------
 1157|       |
 1158|       |        // Input UText is in one contiguous UTF-16 chunk.
 1159|       |        // Use Read-only aliasing UnicodeString.
 1160|  2.19M|        inString.setTo(false,
 1161|  2.19M|                       inText->chunkContents + rangeStart - inText->chunkNativeStart,
 1162|  2.19M|                       rangeEnd - rangeStart);
 1163|  2.19M|    } else {
 1164|       |        // Copy the text from the original inText (UText) to inString (UnicodeString).
 1165|       |        // Create a map from UnicodeString indices -> UText offsets.
 1166|      0|        utext_setNativeIndex(inText, rangeStart);
  ------------------
  |  | 1915|      0|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1167|      0|        int32_t limit = rangeEnd;
 1168|      0|        U_ASSERT(limit <= utext_nativeLength(inText));
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1169|      0|        if (limit > utext_nativeLength(inText)) {
  ------------------
  |  | 1903|      0|#define utext_nativeLength U_ICU_ENTRY_POINT_RENAME(utext_nativeLength)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_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 (1169:13): [True: 0, False: 0]
  ------------------
 1170|      0|            limit = static_cast<int32_t>(utext_nativeLength(inText));
  ------------------
  |  | 1903|      0|#define utext_nativeLength U_ICU_ENTRY_POINT_RENAME(utext_nativeLength)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1171|      0|        }
 1172|      0|        inputMap.adoptInsteadAndCheckErrorCode(new UVector32(status), status);
 1173|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1173:13): [True: 0, False: 0]
  ------------------
 1174|      0|            return 0;
 1175|      0|        }
 1176|      0|        while (utext_getNativeIndex(inText) < limit) {
  ------------------
  |  | 1897|      0|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_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 (1176:16): [True: 0, False: 0]
  ------------------
 1177|      0|            int32_t nativePosition = static_cast<int32_t>(utext_getNativeIndex(inText));
  ------------------
  |  | 1897|      0|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1178|      0|            UChar32 c = utext_next32(inText);
  ------------------
  |  | 1904|      0|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1179|      0|            U_ASSERT(c != U_SENTINEL);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1180|      0|            inString.append(c);
 1181|      0|            while (inputMap->size() < inString.length()) {
  ------------------
  |  Branch (1181:20): [True: 0, False: 0]
  ------------------
 1182|      0|                inputMap->addElement(nativePosition, status);
 1183|      0|            }
 1184|      0|        }
 1185|      0|        inputMap->addElement(limit, status);
 1186|      0|    }
 1187|       |
 1188|       |
 1189|  2.19M|    if (!nfkcNorm2->isNormalized(inString, status)) {
  ------------------
  |  Branch (1189:9): [True: 205k, False: 1.99M]
  ------------------
 1190|   205k|        UnicodeString normalizedInput;
 1191|       |        //  normalizedMap[normalizedInput position] ==  original UText position.
 1192|   205k|        LocalPointer<UVector32> normalizedMap(new UVector32(status), status);
 1193|   205k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1193:13): [True: 0, False: 205k]
  ------------------
 1194|      0|            return 0;
 1195|      0|        }
 1196|       |        
 1197|   205k|        UnicodeString fragment;
 1198|   205k|        UnicodeString normalizedFragment;
 1199|  23.3M|        for (int32_t srcI = 0; srcI < inString.length();) {  // Once per normalization chunk
  ------------------
  |  Branch (1199:32): [True: 23.1M, False: 205k]
  ------------------
 1200|  23.1M|            fragment.remove();
 1201|  23.1M|            int32_t fragmentStartI = srcI;
 1202|  23.1M|            UChar32 c = inString.char32At(srcI);
 1203|  27.0M|            for (;;) {
 1204|  27.0M|                fragment.append(c);
 1205|  27.0M|                srcI = inString.moveIndex32(srcI, 1);
 1206|  27.0M|                if (srcI == inString.length()) {
  ------------------
  |  Branch (1206:21): [True: 205k, False: 26.8M]
  ------------------
 1207|   205k|                    break;
 1208|   205k|                }
 1209|  26.8M|                c = inString.char32At(srcI);
 1210|  26.8M|                if (nfkcNorm2->hasBoundaryBefore(c)) {
  ------------------
  |  Branch (1210:21): [True: 22.9M, False: 3.84M]
  ------------------
 1211|  22.9M|                    break;
 1212|  22.9M|                }
 1213|  26.8M|            }
 1214|  23.1M|            nfkcNorm2->normalize(fragment, normalizedFragment, status);
 1215|  23.1M|            normalizedInput.append(normalizedFragment);
 1216|       |
 1217|       |            // Map every position in the normalized chunk to the start of the chunk
 1218|       |            //   in the original input.
 1219|  23.1M|            int32_t fragmentOriginalStart = inputMap.isValid() ?
  ------------------
  |  Branch (1219:45): [True: 0, False: 23.1M]
  ------------------
 1220|  23.1M|                    inputMap->elementAti(fragmentStartI) : fragmentStartI+rangeStart;
 1221|   119M|            while (normalizedMap->size() < normalizedInput.length()) {
  ------------------
  |  Branch (1221:20): [True: 96.5M, False: 23.1M]
  ------------------
 1222|  96.5M|                normalizedMap->addElement(fragmentOriginalStart, status);
 1223|  96.5M|                if (U_FAILURE(status)) {
  ------------------
  |  Branch (1223:21): [True: 0, False: 96.5M]
  ------------------
 1224|      0|                    break;
 1225|      0|                }
 1226|  96.5M|            }
 1227|  23.1M|        }
 1228|   205k|        U_ASSERT(normalizedMap->size() == normalizedInput.length());
  ------------------
  |  |   35|   205k|#   define U_ASSERT(exp) (void)0
  ------------------
 1229|   205k|        int32_t nativeEnd = inputMap.isValid() ?
  ------------------
  |  Branch (1229:29): [True: 0, False: 205k]
  ------------------
 1230|   205k|                inputMap->elementAti(inString.length()) : inString.length()+rangeStart;
 1231|   205k|        normalizedMap->addElement(nativeEnd, status);
 1232|       |
 1233|   205k|        inputMap = std::move(normalizedMap);
 1234|   205k|        inString = std::move(normalizedInput);
 1235|   205k|    }
 1236|       |
 1237|  2.19M|    int32_t numCodePts = inString.countChar32();
 1238|  2.19M|    if (numCodePts != inString.length()) {
  ------------------
  |  Branch (1238:9): [True: 21.2k, False: 2.17M]
  ------------------
 1239|       |        // There are supplementary characters in the input.
 1240|       |        // The dictionary will produce boundary positions in terms of code point indexes,
 1241|       |        //   not in terms of code unit string indexes.
 1242|       |        // Use the inputMap mechanism to take care of this in addition to indexing differences
 1243|       |        //    from normalization and/or UTF-8 input.
 1244|  21.2k|        UBool hadExistingMap = inputMap.isValid();
 1245|  21.2k|        if (!hadExistingMap) {
  ------------------
  |  Branch (1245:13): [True: 7.66k, False: 13.5k]
  ------------------
 1246|  7.66k|            inputMap.adoptInsteadAndCheckErrorCode(new UVector32(status), status);
 1247|  7.66k|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (1247:17): [True: 0, False: 7.66k]
  ------------------
 1248|      0|                return 0;
 1249|      0|            }
 1250|  7.66k|        }
 1251|  21.2k|        int32_t cpIdx = 0;
 1252|  41.2M|        for (int32_t cuIdx = 0; ; cuIdx = inString.moveIndex32(cuIdx, 1)) {
 1253|  41.2M|            U_ASSERT(cuIdx >= cpIdx);
  ------------------
  |  |   35|  41.2M|#   define U_ASSERT(exp) (void)0
  ------------------
 1254|  41.2M|            if (hadExistingMap) {
  ------------------
  |  Branch (1254:17): [True: 40.4M, False: 816k]
  ------------------
 1255|  40.4M|                inputMap->setElementAt(inputMap->elementAti(cuIdx), cpIdx);
 1256|  40.4M|            } else {
 1257|   816k|                inputMap->addElement(cuIdx+rangeStart, status);
 1258|   816k|            }
 1259|  41.2M|            cpIdx++;
 1260|  41.2M|            if (cuIdx == inString.length()) {
  ------------------
  |  Branch (1260:17): [True: 21.2k, False: 41.2M]
  ------------------
 1261|  21.2k|               break;
 1262|  21.2k|            }
 1263|  41.2M|        }
 1264|  21.2k|    }
 1265|       |
 1266|       |#if UCONFIG_USE_ML_PHRASE_BREAKING
 1267|       |    // PhraseBreaking is supported in ja and ko; MlBreakEngine only supports ja.
 1268|       |    if (isPhraseBreaking && isCj) {
 1269|       |        return fMlBreakEngine->divideUpRange(inText, rangeStart, rangeEnd, foundBreaks, inString,
 1270|       |                                             inputMap, status);
 1271|       |    }
 1272|       |#endif
 1273|       |
 1274|       |    // bestSnlp[i] is the snlp of the best segmentation of the first i
 1275|       |    // code points in the range to be matched.
 1276|  2.19M|    UVector32 bestSnlp(numCodePts + 1, status);
 1277|  2.19M|    bestSnlp.addElement(0, status);
 1278|   116M|    for(int32_t i = 1; i <= numCodePts; i++) {
  ------------------
  |  Branch (1278:24): [True: 113M, False: 2.19M]
  ------------------
 1279|   113M|        bestSnlp.addElement(kuint32max, status);
 1280|   113M|    }
 1281|       |
 1282|       |
 1283|       |    // prev[i] is the index of the last CJK code point in the previous word in 
 1284|       |    // the best segmentation of the first i characters.
 1285|  2.19M|    UVector32 prev(numCodePts + 1, status);
 1286|   118M|    for(int32_t i = 0; i <= numCodePts; i++){
  ------------------
  |  Branch (1286:24): [True: 116M, False: 2.19M]
  ------------------
 1287|   116M|        prev.addElement(-1, status);
 1288|   116M|    }
 1289|       |
 1290|  2.19M|    const int32_t maxWordSize = 20;
 1291|  2.19M|    UVector32 values(numCodePts, status);
 1292|  2.19M|    values.setSize(numCodePts);
 1293|  2.19M|    UVector32 lengths(numCodePts, status);
 1294|  2.19M|    lengths.setSize(numCodePts);
 1295|       |
 1296|  2.19M|    UText fu = UTEXT_INITIALIZER;
  ------------------
  |  | 1558|  2.19M|#define UTEXT_INITIALIZER {                                        \
  |  | 1559|  2.19M|                  UTEXT_MAGIC,          /* magic                */ \
  |  | 1560|  2.19M|                  0,                    /* flags                */ \
  |  | 1561|  2.19M|                  0,                    /* providerProps        */ \
  |  | 1562|  2.19M|                  sizeof(UText),        /* sizeOfStruct         */ \
  |  | 1563|  2.19M|                  0,                    /* chunkNativeLimit     */ \
  |  | 1564|  2.19M|                  0,                    /* extraSize            */ \
  |  | 1565|  2.19M|                  0,                    /* nativeIndexingLimit  */ \
  |  | 1566|  2.19M|                  0,                    /* chunkNativeStart     */ \
  |  | 1567|  2.19M|                  0,                    /* chunkOffset          */ \
  |  | 1568|  2.19M|                  0,                    /* chunkLength          */ \
  |  | 1569|  2.19M|                  NULL,                 /* chunkContents        */ \
  |  | 1570|  2.19M|                  NULL,                 /* pFuncs               */ \
  |  | 1571|  2.19M|                  NULL,                 /* pExtra               */ \
  |  | 1572|  2.19M|                  NULL,                 /* context              */ \
  |  | 1573|  2.19M|                  NULL, NULL, NULL,     /* p, q, r              */ \
  |  | 1574|  2.19M|                  NULL,                 /* privP                */ \
  |  | 1575|  2.19M|                  0, 0, 0,              /* a, b, c              */ \
  |  | 1576|  2.19M|                  0, 0, 0               /* privA,B,C,           */ \
  |  | 1577|  2.19M|                  }
  ------------------
 1297|  2.19M|    utext_openUnicodeString(&fu, &inString, &status);
  ------------------
  |  | 1911|  2.19M|#define utext_openUnicodeString U_ICU_ENTRY_POINT_RENAME(utext_openUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  2.19M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.19M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.19M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1298|       |
 1299|       |    // Dynamic programming to find the best segmentation.
 1300|       |
 1301|       |    // In outer loop, i  is the code point index,
 1302|       |    //                ix is the corresponding string (code unit) index.
 1303|       |    //    They differ when the string contains supplementary characters.
 1304|  2.19M|    int32_t ix = 0;
 1305|  2.19M|    bool is_prev_katakana = false;
 1306|   116M|    for (int32_t i = 0;  i < numCodePts;  ++i, ix = inString.moveIndex32(ix, 1)) {
  ------------------
  |  Branch (1306:26): [True: 113M, False: 2.19M]
  ------------------
 1307|   113M|        if (static_cast<uint32_t>(bestSnlp.elementAti(i)) == kuint32max) {
  ------------------
  |  Branch (1307:13): [True: 0, False: 113M]
  ------------------
 1308|      0|            continue;
 1309|      0|        }
 1310|       |
 1311|   113M|        int32_t count;
 1312|   113M|        utext_setNativeIndex(&fu, ix);
  ------------------
  |  | 1915|   113M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   113M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   113M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   113M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1313|   113M|        count = fDictionary->matches(&fu, maxWordSize, numCodePts,
 1314|   113M|                             nullptr, lengths.getBuffer(), values.getBuffer(), nullptr);
 1315|       |                             // Note: lengths is filled with code point lengths
 1316|       |                             //       The nullptr parameter is the ignored code unit lengths.
 1317|       |
 1318|       |        // if there are no single character matches found in the dictionary 
 1319|       |        // starting with this character, treat character as a 1-character word 
 1320|       |        // with the highest value possible, i.e. the least likely to occur.
 1321|       |        // Exclude Korean characters from this treatment, as they should be left
 1322|       |        // together by default.
 1323|   113M|        if ((count == 0 || lengths.elementAti(0) != 1) &&
  ------------------
  |  Branch (1323:14): [True: 43.2M, False: 70.6M]
  |  Branch (1323:28): [True: 31.1M, False: 39.5M]
  ------------------
 1324|   113M|                !fHangulWordSet.contains(inString.char32At(ix))) {
  ------------------
  |  Branch (1324:17): [True: 74.4M, False: 0]
  ------------------
 1325|  74.4M|            values.setElementAt(maxSnlp, count);   // 255
 1326|  74.4M|            lengths.setElementAt(1, count++);
 1327|  74.4M|        }
 1328|       |
 1329|   294M|        for (int32_t j = 0; j < count; j++) {
  ------------------
  |  Branch (1329:29): [True: 180M, False: 113M]
  ------------------
 1330|   180M|            uint32_t newSnlp = static_cast<uint32_t>(bestSnlp.elementAti(i)) + static_cast<uint32_t>(values.elementAti(j));
 1331|   180M|            int32_t ln_j_i = lengths.elementAti(j) + i;
 1332|   180M|            if (newSnlp < static_cast<uint32_t>(bestSnlp.elementAti(ln_j_i))) {
  ------------------
  |  Branch (1332:17): [True: 124M, False: 56.2M]
  ------------------
 1333|   124M|                bestSnlp.setElementAt(newSnlp, ln_j_i);
 1334|   124M|                prev.setElementAt(i, ln_j_i);
 1335|   124M|            }
 1336|   180M|        }
 1337|       |
 1338|       |        // In Japanese,
 1339|       |        // Katakana word in single character is pretty rare. So we apply
 1340|       |        // the following heuristic to Katakana: any continuous run of Katakana
 1341|       |        // characters is considered a candidate word with a default cost
 1342|       |        // specified in the katakanaCost table according to its length.
 1343|       |
 1344|   113M|        bool is_katakana = isKatakana(inString.char32At(ix));
 1345|   113M|        int32_t katakanaRunLength = 1;
 1346|   113M|        if (!is_prev_katakana && is_katakana) {
  ------------------
  |  Branch (1346:13): [True: 28.6M, False: 85.3M]
  |  Branch (1346:34): [True: 1.28M, False: 27.3M]
  ------------------
 1347|  1.28M|            int32_t j = inString.moveIndex32(ix, 1);
 1348|       |            // Find the end of the continuous run of Katakana characters
 1349|  2.90M|            while (j < inString.length() && katakanaRunLength < kMaxKatakanaGroupLength &&
  ------------------
  |  Branch (1349:20): [True: 2.88M, False: 25.6k]
  |  Branch (1349:45): [True: 2.81M, False: 71.5k]
  ------------------
 1350|  2.90M|                    isKatakana(inString.char32At(j))) {
  ------------------
  |  Branch (1350:21): [True: 1.62M, False: 1.18M]
  ------------------
 1351|  1.62M|                j = inString.moveIndex32(j, 1);
 1352|  1.62M|                katakanaRunLength++;
 1353|  1.62M|            }
 1354|  1.28M|            if (katakanaRunLength < kMaxKatakanaGroupLength) {
  ------------------
  |  Branch (1354:17): [True: 1.21M, False: 71.6k]
  ------------------
 1355|  1.21M|                uint32_t newSnlp = bestSnlp.elementAti(i) + getKatakanaCost(katakanaRunLength);
 1356|  1.21M|                if (newSnlp < static_cast<uint32_t>(bestSnlp.elementAti(i + katakanaRunLength))) {
  ------------------
  |  Branch (1356:21): [True: 22.5k, False: 1.19M]
  ------------------
 1357|  22.5k|                    bestSnlp.setElementAt(newSnlp, i+katakanaRunLength);
 1358|  22.5k|                    prev.setElementAt(i, i+katakanaRunLength);  // prev[j] = i;
 1359|  22.5k|                }
 1360|  1.21M|            }
 1361|  1.28M|        }
 1362|   113M|        is_prev_katakana = is_katakana;
 1363|   113M|    }
 1364|  2.19M|    utext_close(&fu);
  ------------------
  |  | 1891|  2.19M|#define utext_close U_ICU_ENTRY_POINT_RENAME(utext_close)
  |  |  ------------------
  |  |  |  |  123|  2.19M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.19M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.19M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1365|       |
 1366|       |    // Start pushing the optimal offset index into t_boundary (t for tentative).
 1367|       |    // prev[numCodePts] is guaranteed to be meaningful.
 1368|       |    // We'll first push in the reverse order, i.e.,
 1369|       |    // t_boundary[0] = numCodePts, and afterwards do a swap.
 1370|  2.19M|    UVector32 t_boundary(numCodePts+1, status);
 1371|       |
 1372|  2.19M|    int32_t numBreaks = 0;
 1373|       |    // No segmentation found, set boundary to end of range
 1374|  2.19M|    if (static_cast<uint32_t>(bestSnlp.elementAti(numCodePts)) == kuint32max) {
  ------------------
  |  Branch (1374:9): [True: 0, False: 2.19M]
  ------------------
 1375|      0|        t_boundary.addElement(numCodePts, status);
 1376|      0|        numBreaks++;
 1377|  2.19M|    } else if (isPhraseBreaking) {
  ------------------
  |  Branch (1377:16): [True: 0, False: 2.19M]
  ------------------
 1378|      0|        t_boundary.addElement(numCodePts, status);
 1379|      0|        if(U_SUCCESS(status)) {
  ------------------
  |  Branch (1379:12): [True: 0, False: 0]
  ------------------
 1380|      0|            numBreaks++;
 1381|      0|            int32_t prevIdx = numCodePts;
 1382|       |
 1383|      0|            int32_t codeUnitIdx = -1;
 1384|      0|            int32_t prevCodeUnitIdx = -1;
 1385|      0|            int32_t length = -1;
 1386|      0|            for (int32_t i = prev.elementAti(numCodePts); i > 0; i = prev.elementAti(i)) {
  ------------------
  |  Branch (1386:59): [True: 0, False: 0]
  ------------------
 1387|      0|                codeUnitIdx = inString.moveIndex32(0, i);
 1388|      0|                prevCodeUnitIdx = inString.moveIndex32(0, prevIdx);
 1389|       |                // Calculate the length by using the code unit.
 1390|      0|                length = prevCodeUnitIdx - codeUnitIdx;
 1391|      0|                prevIdx = i;
 1392|       |                // Keep the breakpoint if the pattern is not in the fSkipSet and continuous Katakana
 1393|       |                // characters don't occur.
 1394|      0|                if (!fSkipSet.containsKey(inString.tempSubString(codeUnitIdx, length))
  ------------------
  |  Branch (1394:21): [True: 0, False: 0]
  |  Branch (1394:21): [True: 0, False: 0]
  ------------------
 1395|      0|                    && (!isKatakana(inString.char32At(inString.moveIndex32(codeUnitIdx, -1)))
  ------------------
  |  Branch (1395:25): [True: 0, False: 0]
  ------------------
 1396|      0|                           || !isKatakana(inString.char32At(codeUnitIdx)))) {
  ------------------
  |  Branch (1396:31): [True: 0, False: 0]
  ------------------
 1397|      0|                    t_boundary.addElement(i, status);
 1398|      0|                    numBreaks++;
 1399|      0|                }
 1400|      0|            }
 1401|      0|        }
 1402|  2.19M|    } else {
 1403|  59.7M|        for (int32_t i = numCodePts; i > 0; i = prev.elementAti(i)) {
  ------------------
  |  Branch (1403:38): [True: 57.5M, False: 2.19M]
  ------------------
 1404|  57.5M|            t_boundary.addElement(i, status);
 1405|  57.5M|            numBreaks++;
 1406|  57.5M|        }
 1407|  2.19M|        U_ASSERT(prev.elementAti(t_boundary.elementAti(numBreaks - 1)) == 0);
  ------------------
  |  |   35|  2.19M|#   define U_ASSERT(exp) (void)0
  ------------------
 1408|  2.19M|    }
 1409|       |
 1410|       |    // Add a break for the start of the dictionary range if there is not one
 1411|       |    // there already.
 1412|  2.19M|    if (foundBreaks.size() == 0 || foundBreaks.peeki() < rangeStart) {
  ------------------
  |  Branch (1412:9): [True: 2.19M, False: 1.72k]
  |  Branch (1412:36): [True: 1.72k, False: 0]
  ------------------
 1413|  2.19M|        t_boundary.addElement(0, status);
 1414|  2.19M|        numBreaks++;
 1415|  2.19M|    }
 1416|       |
 1417|       |    // Now that we're done, convert positions in t_boundary[] (indices in 
 1418|       |    // the normalized input string) back to indices in the original input UText
 1419|       |    // while reversing t_boundary and pushing values to foundBreaks.
 1420|  2.19M|    int32_t prevCPPos = -1;
 1421|  2.19M|    int32_t prevUTextPos = -1;
 1422|  2.19M|    int32_t correctedNumBreaks = 0;
 1423|  61.9M|    for (int32_t i = numBreaks - 1; i >= 0; i--) {
  ------------------
  |  Branch (1423:37): [True: 59.7M, False: 2.19M]
  ------------------
 1424|  59.7M|        int32_t cpPos = t_boundary.elementAti(i);
 1425|  59.7M|        U_ASSERT(cpPos > prevCPPos);
  ------------------
  |  |   35|  59.7M|#   define U_ASSERT(exp) (void)0
  ------------------
 1426|  59.7M|        int32_t utextPos =  inputMap.isValid() ? inputMap->elementAti(cpPos) : cpPos + rangeStart;
  ------------------
  |  Branch (1426:29): [True: 41.0M, False: 18.7M]
  ------------------
 1427|  59.7M|        U_ASSERT(utextPos >= prevUTextPos);
  ------------------
  |  |   35|  59.7M|#   define U_ASSERT(exp) (void)0
  ------------------
 1428|  59.7M|        if (utextPos > prevUTextPos) {
  ------------------
  |  Branch (1428:13): [True: 42.9M, False: 16.8M]
  ------------------
 1429|       |            // Boundaries are added to foundBreaks output in ascending order.
 1430|  42.9M|            U_ASSERT(foundBreaks.size() == 0 || foundBreaks.peeki() < utextPos);
  ------------------
  |  |   35|  42.9M|#   define U_ASSERT(exp) (void)0
  ------------------
 1431|       |            // In phrase breaking, there has to be a breakpoint between Cj character and close
 1432|       |            // punctuation.
 1433|       |            // E.g.［携帯電話］正しい選択 -> ［携帯▁電話］▁正しい▁選択 -> breakpoint between ］ and 正
 1434|  42.9M|            if (utextPos != rangeStart
  ------------------
  |  Branch (1434:17): [True: 40.7M, False: 2.19M]
  ------------------
 1435|  42.9M|                || (isPhraseBreaking && utextPos > 0
  ------------------
  |  Branch (1435:21): [True: 0, False: 2.19M]
  |  Branch (1435:41): [True: 0, False: 0]
  ------------------
 1436|  40.7M|                       && fClosePunctuationSet.contains(utext_char32At(inText, utextPos - 1)))) {
  ------------------
  |  | 1889|      0|#define utext_char32At U_ICU_ENTRY_POINT_RENAME(utext_char32At)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_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 (1436:27): [True: 0, False: 0]
  ------------------
 1437|  40.7M|                foundBreaks.push(utextPos, status);
 1438|  40.7M|                correctedNumBreaks++;
 1439|  40.7M|            }
 1440|  42.9M|        } else {
 1441|       |            // Normalization expanded the input text, the dictionary found a boundary
 1442|       |            // within the expansion, giving two boundaries with the same index in the
 1443|       |            // original text. Ignore the second. See ticket #12918.
 1444|  16.8M|            --numBreaks;
 1445|  16.8M|        }
 1446|  59.7M|        prevCPPos = cpPos;
 1447|  59.7M|        prevUTextPos = utextPos;
 1448|  59.7M|    }
 1449|  2.19M|    (void)prevCPPos; // suppress compiler warnings about unused variable
 1450|       |
 1451|  2.19M|    UChar32 nextChar = utext_char32At(inText, rangeEnd);
  ------------------
  |  | 1889|  2.19M|#define utext_char32At U_ICU_ENTRY_POINT_RENAME(utext_char32At)
  |  |  ------------------
  |  |  |  |  123|  2.19M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.19M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.19M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1452|  2.19M|    if (!foundBreaks.isEmpty() && foundBreaks.peeki() == rangeEnd) {
  ------------------
  |  Branch (1452:9): [True: 2.19M, False: 0]
  |  Branch (1452:35): [True: 2.19M, False: 0]
  ------------------
 1453|       |        // In phrase breaking, there has to be a breakpoint between Cj character and
 1454|       |        // the number/open punctuation.
 1455|       |        // E.g. る文字「そうだ、京都」->る▁文字▁「そうだ、▁京都」-> breakpoint between 字 and「
 1456|       |        // E.g. 乗車率９０％程度だろうか -> 乗車▁率▁９０％▁程度だろうか -> breakpoint between 率 and ９
 1457|       |        // E.g. しかもロゴがＵｎｉｃｏｄｅ！ -> しかも▁ロゴが▁Ｕｎｉｃｏｄｅ！-> breakpoint between が and Ｕ
 1458|  2.19M|        if (isPhraseBreaking) {
  ------------------
  |  Branch (1458:13): [True: 0, False: 2.19M]
  ------------------
 1459|      0|            if (!fDigitOrOpenPunctuationOrAlphabetSet.contains(nextChar)) {
  ------------------
  |  Branch (1459:17): [True: 0, False: 0]
  ------------------
 1460|      0|                foundBreaks.popi();
 1461|      0|                correctedNumBreaks--;
 1462|      0|            }
 1463|  2.19M|        } else {
 1464|  2.19M|            foundBreaks.popi();
 1465|  2.19M|            correctedNumBreaks--;
 1466|  2.19M|        }
 1467|  2.19M|    }
 1468|       |
 1469|       |    // inString goes out of scope
 1470|       |    // inputMap goes out of scope
 1471|  2.19M|    return correctedNumBreaks;
 1472|  2.19M|}
_ZN6icu_7814CjkBreakEngine27initJapanesePhraseParameterER10UErrorCode:
 1474|      1|void CjkBreakEngine::initJapanesePhraseParameter(UErrorCode& error) {
 1475|      1|    loadJapaneseExtensions(error);
 1476|      1|    loadHiragana(error);
 1477|      1|}
_ZN6icu_7814CjkBreakEngine22loadJapaneseExtensionsER10UErrorCode:
 1479|      1|void CjkBreakEngine::loadJapaneseExtensions(UErrorCode& error) {
 1480|      1|    const char* tag = "extensions";
 1481|      1|    ResourceBundle ja(U_ICUDATA_BRKITR, "ja", error);
  ------------------
  |  |   13|      1|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|      1|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
 1482|      1|    if (U_SUCCESS(error)) {
  ------------------
  |  Branch (1482:9): [True: 1, False: 0]
  ------------------
 1483|      1|        ResourceBundle bundle = ja.get(tag, error);
 1484|    225|        while (U_SUCCESS(error) && bundle.hasNext()) {
  ------------------
  |  Branch (1484:16): [True: 225, False: 0]
  |  Branch (1484:36): [True: 224, False: 1]
  ------------------
 1485|    224|            fSkipSet.puti(bundle.getNextString(error), 1, error);
 1486|    224|        }
 1487|      1|    }
 1488|      1|}
_ZN6icu_7814CjkBreakEngine12loadHiraganaER10UErrorCode:
 1490|      1|void CjkBreakEngine::loadHiragana(UErrorCode& error) {
 1491|      1|    UnicodeSet hiraganaWordSet(UnicodeString(u"[:Hiragana:]"), error);
 1492|      1|    hiraganaWordSet.compact();
 1493|      1|    UnicodeSetIterator iterator(hiraganaWordSet);
 1494|    382|    while (iterator.next()) {
  ------------------
  |  Branch (1494:12): [True: 381, False: 1]
  ------------------
 1495|    381|        fSkipSet.puti(UnicodeString(iterator.getCodepoint()), 1, error);
 1496|    381|    }
 1497|      1|}
_ZN6icu_7812PossibleWordC2Ev:
  113|  87.5k|    PossibleWord() : count(0), prefix(0), offset(-1), mark(0), current(0) {}
_ZN6icu_7812PossibleWordD2Ev:
  114|  87.5k|    ~PossibleWord() {}
_ZN6icu_7812PossibleWord14markedCPLengthEv:
  134|  7.43M|    int32_t   markedCPLength() { return cpLengths[mark]; }
_ZN6icu_7812PossibleWord11markCurrentEv:
  131|   175k|    void      markCurrent() { mark = current; }
_ZN6icu_7812PossibleWord13longestPrefixEv:
  128|  1.57M|    int32_t   longestPrefix() { return prefix; }
dictbe.cpp:_ZN6icu_78L14utext_i32_flagEi:
 1122|  2.19M|static inline int32_t utext_i32_flag(int32_t bitIndex) {
 1123|  2.19M|    return static_cast<int32_t>(1) << bitIndex;
 1124|  2.19M|}
dictbe.cpp:_ZN6icu_78L10isKatakanaEi:
 1114|   116M|static inline bool isKatakana(UChar32 value) {
 1115|   116M|    return (value >= 0x30A1 && value <= 0x30FE && value != 0x30FB) ||
  ------------------
  |  Branch (1115:13): [True: 113M, False: 3.67M]
  |  Branch (1115:32): [True: 86.9M, False: 26.0M]
  |  Branch (1115:51): [True: 86.9M, False: 0]
  ------------------
 1116|   116M|            (value >= 0xFF66 && value <= 0xFF9f);
  ------------------
  |  Branch (1116:14): [True: 261k, False: 29.5M]
  |  Branch (1116:33): [True: 0, False: 261k]
  ------------------
 1117|   116M|}
dictbe.cpp:_ZN6icu_78L15getKatakanaCostEi:
 1107|  1.21M|static inline uint32_t getKatakanaCost(int32_t wordLength){
 1108|       |    //TODO: fill array with actual values from dictionary!
 1109|  1.21M|    static const uint32_t katakanaCost[kMaxKatakanaLength + 1]
 1110|  1.21M|                                       = {8192, 984, 408, 240, 204, 252, 300, 372, 480};
 1111|  1.21M|    return (wordLength > kMaxKatakanaLength) ? 8192 : katakanaCost[wordLength];
  ------------------
  |  Branch (1111:12): [True: 3.50k, False: 1.21M]
  ------------------
 1112|  1.21M|}

_ZNK6icu_7823UCharsDictionaryMatcher7matchesEP5UTextiiPiS3_S3_S3_:
   47|   113M|                            int32_t *prefix) const {
   48|       |
   49|   113M|    UCharsTrie uct(characters);
   50|   113M|    int32_t startingTextIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|   113M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   113M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   113M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   113M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   51|   113M|    int32_t wordCount = 0;
   52|   113M|    int32_t codePointsMatched = 0;
   53|       |
   54|   312M|    for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) {
  ------------------
  |  | 1904|   113M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|   113M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   113M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   113M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) {
  ------------------
  |  | 1904|   198M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|   198M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   198M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   198M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (54:42): [True: 312M, False: 574k]
  ------------------
   55|   312M|        UStringTrieResult result = (codePointsMatched == 0) ? uct.first(c) : uct.next(c);
  ------------------
  |  Branch (55:36): [True: 113M, False: 198M]
  ------------------
   56|   312M|        int32_t lengthMatched = static_cast<int32_t>(utext_getNativeIndex(text)) - startingTextIndex;
  ------------------
  |  | 1897|   312M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|   312M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   312M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   312M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   57|   312M|        codePointsMatched += 1;
   58|   312M|        if (USTRINGTRIE_HAS_VALUE(result)) {
  ------------------
  |  |   86|   312M|#define USTRINGTRIE_HAS_VALUE(result) ((result)>=USTRINGTRIE_FINAL_VALUE)
  |  |  ------------------
  |  |  |  Branch (86:39): [True: 106M, False: 206M]
  |  |  ------------------
  ------------------
   59|   106M|            if (wordCount < limit) {
  ------------------
  |  Branch (59:17): [True: 106M, False: 0]
  ------------------
   60|   106M|                if (values != nullptr) {
  ------------------
  |  Branch (60:21): [True: 106M, False: 0]
  ------------------
   61|   106M|                    values[wordCount] = uct.getValue();
   62|   106M|                }
   63|   106M|                if (lengths != nullptr) {
  ------------------
  |  Branch (63:21): [True: 0, False: 106M]
  ------------------
   64|      0|                    lengths[wordCount] = lengthMatched;
   65|      0|                }
   66|   106M|                if (cpLengths != nullptr) {
  ------------------
  |  Branch (66:21): [True: 106M, False: 0]
  ------------------
   67|   106M|                    cpLengths[wordCount] = codePointsMatched;
   68|   106M|                }
   69|   106M|                ++wordCount;
   70|   106M|            }
   71|   106M|            if (result == USTRINGTRIE_FINAL_VALUE) {
  ------------------
  |  Branch (71:17): [True: 37.2M, False: 68.9M]
  ------------------
   72|  37.2M|                break;
   73|  37.2M|            }
   74|   106M|        }
   75|   206M|        else if (result == USTRINGTRIE_NO_MATCH) {
  ------------------
  |  Branch (75:18): [True: 76.1M, False: 130M]
  ------------------
   76|  76.1M|            break;
   77|  76.1M|        }
   78|   198M|        if (lengthMatched >= maxLength) {
  ------------------
  |  Branch (78:13): [True: 0, False: 198M]
  ------------------
   79|      0|            break;
   80|      0|        }
   81|   198M|    }
   82|       |
   83|   113M|    if (prefix != nullptr) {
  ------------------
  |  Branch (83:9): [True: 0, False: 113M]
  ------------------
   84|      0|        *prefix = codePointsMatched;
   85|      0|    }
   86|   113M|    return wordCount;
   87|   113M|}
_ZNK6icu_7822BytesDictionaryMatcher9transformEi:
   93|  27.4M|UChar32 BytesDictionaryMatcher::transform(UChar32 c) const {
   94|  27.4M|    if ((transformConstant & DictionaryData::TRANSFORM_TYPE_MASK) == DictionaryData::TRANSFORM_TYPE_OFFSET) {
  ------------------
  |  Branch (94:9): [True: 27.4M, False: 0]
  ------------------
   95|  27.4M|        if (c == 0x200D) {
  ------------------
  |  Branch (95:13): [True: 0, False: 27.4M]
  ------------------
   96|      0|            return 0xFF;
   97|  27.4M|        } else if (c == 0x200C) {
  ------------------
  |  Branch (97:20): [True: 0, False: 27.4M]
  ------------------
   98|      0|            return 0xFE;
   99|      0|        }
  100|  27.4M|        int32_t delta = c - (transformConstant & DictionaryData::TRANSFORM_OFFSET_MASK);
  101|  27.4M|        if (delta < 0 || 0xFD < delta) {
  ------------------
  |  Branch (101:13): [True: 0, False: 27.4M]
  |  Branch (101:26): [True: 3.96k, False: 27.4M]
  ------------------
  102|  3.96k|            return U_SENTINEL;
  ------------------
  |  |  469|  3.96k|#define U_SENTINEL (-1)
  ------------------
  103|  3.96k|        }
  104|  27.4M|        return static_cast<UChar32>(delta);
  105|  27.4M|    }
  106|      0|    return c;
  107|  27.4M|}
_ZNK6icu_7822BytesDictionaryMatcher7matchesEP5UTextiiPiS3_S3_S3_:
  115|  9.52M|                            int32_t *prefix) const {
  116|  9.52M|    BytesTrie bt(characters);
  117|  9.52M|    int32_t startingTextIndex = static_cast<int32_t>(utext_getNativeIndex(text));
  ------------------
  |  | 1897|  9.52M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  9.52M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.52M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.52M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  118|  9.52M|    int32_t wordCount = 0;
  119|  9.52M|    int32_t codePointsMatched = 0;
  120|       |
  121|  27.4M|    for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) {
  ------------------
  |  | 1904|  9.52M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  9.52M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.52M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.52M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) {
  ------------------
  |  | 1904|  17.9M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  17.9M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  17.9M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  17.9M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (121:42): [True: 27.4M, False: 0]
  ------------------
  122|  27.4M|        UStringTrieResult result = (codePointsMatched == 0) ? bt.first(transform(c)) : bt.next(transform(c));
  ------------------
  |  Branch (122:36): [True: 9.52M, False: 17.9M]
  ------------------
  123|  27.4M|        int32_t lengthMatched = static_cast<int32_t>(utext_getNativeIndex(text)) - startingTextIndex;
  ------------------
  |  | 1897|  27.4M|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  27.4M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  27.4M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  27.4M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|  27.4M|        codePointsMatched += 1;
  125|  27.4M|        if (USTRINGTRIE_HAS_VALUE(result)) {
  ------------------
  |  |   86|  27.4M|#define USTRINGTRIE_HAS_VALUE(result) ((result)>=USTRINGTRIE_FINAL_VALUE)
  |  |  ------------------
  |  |  |  Branch (86:39): [True: 7.76M, False: 19.6M]
  |  |  ------------------
  ------------------
  126|  7.76M|            if (wordCount < limit) {
  ------------------
  |  Branch (126:17): [True: 7.76M, False: 0]
  ------------------
  127|  7.76M|                if (values != nullptr) {
  ------------------
  |  Branch (127:21): [True: 0, False: 7.76M]
  ------------------
  128|      0|                    values[wordCount] = bt.getValue();
  129|      0|                }
  130|  7.76M|                if (lengths != nullptr) {
  ------------------
  |  Branch (130:21): [True: 7.76M, False: 0]
  ------------------
  131|  7.76M|                    lengths[wordCount] = lengthMatched;
  132|  7.76M|                }
  133|  7.76M|                if (cpLengths != nullptr) {
  ------------------
  |  Branch (133:21): [True: 7.76M, False: 0]
  ------------------
  134|  7.76M|                    cpLengths[wordCount] = codePointsMatched;
  135|  7.76M|                }
  136|  7.76M|                ++wordCount;
  137|  7.76M|            }
  138|  7.76M|            if (result == USTRINGTRIE_FINAL_VALUE) {
  ------------------
  |  Branch (138:17): [True: 128k, False: 7.63M]
  ------------------
  139|   128k|                break;
  140|   128k|            }
  141|  7.76M|        }
  142|  19.6M|        else if (result == USTRINGTRIE_NO_MATCH) {
  ------------------
  |  Branch (142:18): [True: 9.35M, False: 10.3M]
  ------------------
  143|  9.35M|            break;
  144|  9.35M|        }
  145|  17.9M|        if (lengthMatched >= maxLength) {
  ------------------
  |  Branch (145:13): [True: 42.2k, False: 17.9M]
  ------------------
  146|  42.2k|            break;
  147|  42.2k|        }
  148|  17.9M|    }
  149|       |
  150|  9.52M|    if (prefix != nullptr) {
  ------------------
  |  Branch (150:9): [True: 9.52M, False: 0]
  ------------------
  151|  9.52M|        *prefix = codePointsMatched;
  152|  9.52M|    }
  153|  9.52M|    return wordCount;
  154|  9.52M|}

_ZN6icu_7822BytesDictionaryMatcherC2EPKciP11UDataMemory:
  124|      4|            : characters(c), transformConstant(t), file(f) { }
_ZN6icu_7817DictionaryMatcherC2Ev:
   71|      5|    DictionaryMatcher() {}
_ZN6icu_7823UCharsDictionaryMatcherC2EPKDsP11UDataMemory:
  106|      1|    UCharsDictionaryMatcher(const char16_t *c, UDataMemory *f) : characters(c), file(f) { }

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

_ZN6icu_7810UStringSetD2Ev:
  123|    201|UStringSet::~UStringSet() {}
_ZN6icu_7831SimpleFilteredSentenceBreakDataD2Ev:
  168|    174|SimpleFilteredSentenceBreakData::~SimpleFilteredSentenceBreakData() {}
_ZN6icu_7835SimpleFilteredSentenceBreakIteratorC2EPNS_13BreakIteratorEPNS_10UCharsTrieES4_R10UErrorCode:
  260|    174|  BreakIterator(adopt->getLocale(ULOC_VALID_LOCALE,status),adopt->getLocale(ULOC_ACTUAL_LOCALE,status)),
  261|    174|  fData(new SimpleFilteredSentenceBreakData(forwards, backwards)),
  262|    174|  fDelegate(adopt)
  263|    174|{
  264|    174|    if (fData == nullptr) {
  ------------------
  |  Branch (264:9): [True: 0, False: 174]
  ------------------
  265|      0|        delete forwards;
  266|      0|        delete backwards;
  267|      0|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (267:13): [True: 0, False: 0]
  ------------------
  268|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  269|      0|        }
  270|      0|    }
  271|    174|}
_ZN6icu_7835SimpleFilteredSentenceBreakIteratorD2Ev:
  273|    174|SimpleFilteredSentenceBreakIterator::~SimpleFilteredSentenceBreakIterator() {
  274|    174|    fData = fData->decr();
  275|    174|}
_ZN6icu_7834SimpleFilteredBreakIteratorBuilderD2Ev:
  498|    201|{
  499|    201|}
_ZN6icu_7834SimpleFilteredBreakIteratorBuilderC2ERKNS_6LocaleER10UErrorCode:
  507|    201|  : fSet(status)
  508|    201|{
  509|    201|  if(U_SUCCESS(status)) {
  ------------------
  |  Branch (509:6): [True: 201, False: 0]
  ------------------
  510|    201|    UErrorCode subStatus = U_ZERO_ERROR;
  511|    201|    LocalUResourceBundlePointer b(ures_open(U_ICUDATA_BRKITR, fromLocale.getBaseName(), &subStatus));
  ------------------
  |  | 1691|    201|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|    201|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    201|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    201|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer b(ures_open(U_ICUDATA_BRKITR, fromLocale.getBaseName(), &subStatus));
  ------------------
  |  |   13|    201|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|    201|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  512|    201|    if (U_FAILURE(subStatus) || (subStatus == U_USING_DEFAULT_WARNING) ) {    
  ------------------
  |  Branch (512:9): [True: 2, False: 199]
  |  Branch (512:33): [True: 141, False: 58]
  ------------------
  513|    143|      status = subStatus; // copy the failing status 
  514|       |#if FB_DEBUG
  515|       |      fprintf(stderr, "open BUNDLE %s : %s, %s\n", fromLocale.getBaseName(), "[exit]", u_errorName(status));
  516|       |#endif
  517|    143|      return;  // leaves the builder empty, if you try to use it.
  518|    143|    }
  519|     58|    LocalUResourceBundlePointer exceptions(ures_getByKeyWithFallback(b.getAlias(), "exceptions", nullptr, &subStatus));
  ------------------
  |  | 1662|     58|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|     58|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     58|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     58|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|     58|    if (U_FAILURE(subStatus) || (subStatus == U_USING_DEFAULT_WARNING) ) {    
  ------------------
  |  Branch (520:9): [True: 19, False: 39]
  |  Branch (520:33): [True: 0, False: 39]
  ------------------
  521|     19|      status = subStatus; // copy the failing status 
  522|       |#if FB_DEBUG
  523|       |      fprintf(stderr, "open EXCEPTIONS %s : %s, %s\n", fromLocale.getBaseName(), "[exit]", u_errorName(status));
  524|       |#endif
  525|     19|      return;  // leaves the builder empty, if you try to use it.
  526|     19|    }
  527|     39|    LocalUResourceBundlePointer breaks(ures_getByKeyWithFallback(exceptions.getAlias(), "SentenceBreak", nullptr, &subStatus));
  ------------------
  |  | 1662|     39|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  528|       |
  529|       |#if FB_DEBUG
  530|       |    {
  531|       |      UErrorCode subsub = subStatus;
  532|       |      fprintf(stderr, "open SentenceBreak %s => %s, %s\n", fromLocale.getBaseName(), ures_getLocale(breaks.getAlias(), &subsub), u_errorName(subStatus));
  533|       |    }
  534|       |#endif
  535|       |    
  536|     39|    if (U_FAILURE(subStatus) || (subStatus == U_USING_DEFAULT_WARNING) ) {    
  ------------------
  |  Branch (536:9): [True: 0, False: 39]
  |  Branch (536:33): [True: 0, False: 39]
  ------------------
  537|      0|      status = subStatus; // copy the failing status 
  538|       |#if FB_DEBUG
  539|       |      fprintf(stderr, "open %s : %s, %s\n", fromLocale.getBaseName(), "[exit]", u_errorName(status));
  540|       |#endif
  541|      0|      return;  // leaves the builder empty, if you try to use it.
  542|      0|    }
  543|       |
  544|     39|    LocalUResourceBundlePointer strs;
  545|     39|    subStatus = status; // Pick up inherited warning status now 
  546|  5.43k|    do {
  547|  5.43k|      strs.adoptInstead(ures_getNextResource(breaks.getAlias(), strs.orphan(), &subStatus));
  ------------------
  |  | 1672|  5.43k|#define ures_getNextResource U_ICU_ENTRY_POINT_RENAME(ures_getNextResource)
  |  |  ------------------
  |  |  |  |  123|  5.43k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.43k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.43k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  548|  5.43k|      if(strs.isValid() && U_SUCCESS(subStatus)) {
  ------------------
  |  Branch (548:10): [True: 5.43k, False: 0]
  |  Branch (548:28): [True: 5.39k, False: 39]
  ------------------
  549|  5.39k|        UnicodeString str(ures_getUnicodeString(strs.getAlias(), &status));
  550|  5.39k|        suppressBreakAfter(str, status); // load the string
  551|  5.39k|      }
  552|  5.43k|    } while (strs.isValid() && U_SUCCESS(subStatus));
  ------------------
  |  Branch (552:14): [True: 5.43k, False: 0]
  |  Branch (552:32): [True: 5.39k, False: 39]
  ------------------
  553|     39|    if(U_FAILURE(subStatus)&&subStatus!=U_INDEX_OUTOFBOUNDS_ERROR&&U_SUCCESS(status)) {
  ------------------
  |  Branch (553:8): [True: 39, False: 0]
  |  Branch (553:30): [True: 0, False: 39]
  |  Branch (553:68): [True: 0, False: 0]
  ------------------
  554|      0|      status = subStatus;
  555|      0|    }
  556|     39|  }
  557|    201|}
_ZN6icu_7834SimpleFilteredBreakIteratorBuilder18suppressBreakAfterERKNS_13UnicodeStringER10UErrorCode:
  561|  5.39k|{
  562|  5.39k|  UBool r = fSet.add(exception, status);
  563|  5.39k|  FB_TRACE("suppressBreakAfter",&exception,r,0);
  564|  5.39k|  return r;
  565|  5.39k|}
_ZN6icu_7834SimpleFilteredBreakIteratorBuilder5buildEPNS_13BreakIteratorER10UErrorCode:
  587|    180|SimpleFilteredBreakIteratorBuilder::build(BreakIterator* adoptBreakIterator, UErrorCode& status) {
  588|    180|  LocalPointer<BreakIterator> adopt(adoptBreakIterator);
  589|       |
  590|    180|  LocalPointer<UCharsTrieBuilder> builder(new UCharsTrieBuilder(status), status);
  591|    180|  LocalPointer<UCharsTrieBuilder> builder2(new UCharsTrieBuilder(status), status);
  592|    180|  if(U_FAILURE(status)) {
  ------------------
  |  Branch (592:6): [True: 6, False: 174]
  ------------------
  593|      6|    return nullptr;
  594|      6|  }
  595|       |
  596|    174|  int32_t revCount = 0;
  597|    174|  int32_t fwdCount = 0;
  598|       |
  599|    174|  int32_t subCount = fSet.size();
  600|       |
  601|    174|  UnicodeString *ustrs_ptr = newUnicodeStringArray(subCount);
  602|       |  
  603|    174|  LocalArray<UnicodeString> ustrs(ustrs_ptr);
  604|       |
  605|    174|  LocalMemory<int> partials;
  606|    174|  partials.allocateInsteadAndReset(subCount);
  607|       |
  608|    174|  LocalPointer<UCharsTrie>    backwardsTrie; //  i.e. ".srM" for Mrs.
  609|    174|  LocalPointer<UCharsTrie>    forwardsPartialTrie; //  Has ".a" for "a.M."
  610|       |
  611|    174|  int n=0;
  612|    174|  for ( int32_t i = 0;
  613|  4.85k|        i<fSet.size();
  ------------------
  |  Branch (613:9): [True: 4.68k, False: 174]
  ------------------
  614|  4.68k|        i++) {
  615|  4.68k|    const UnicodeString *abbr = fSet.getStringAt(i);
  616|  4.68k|    if(abbr) {
  ------------------
  |  Branch (616:8): [True: 4.68k, False: 0]
  ------------------
  617|  4.68k|      FB_TRACE("build",abbr,true,i);
  618|  4.68k|      ustrs[n] = *abbr; // copy by value
  619|  4.68k|      FB_TRACE("ustrs[n]",&ustrs[n],true,i);
  620|  4.68k|    } else {
  621|      0|      FB_TRACE("build",abbr,false,i);
  622|      0|      status = U_MEMORY_ALLOCATION_ERROR;
  623|      0|      return nullptr;
  624|      0|    }
  625|  4.68k|    partials[n] = 0; // default: not partial
  626|  4.68k|    n++;
  627|  4.68k|  }
  628|       |  // first pass - find partials.
  629|  4.85k|  for(int i=0;i<subCount;i++) {
  ------------------
  |  Branch (629:15): [True: 4.68k, False: 174]
  ------------------
  630|  4.68k|    int nn = ustrs[i].indexOf(kFULLSTOP); // TODO: non-'.' abbreviations
  631|  4.68k|    if(nn>-1 && (nn+1)!=ustrs[i].length()) {
  ------------------
  |  Branch (631:8): [True: 4.67k, False: 6]
  |  Branch (631:17): [True: 988, False: 3.69k]
  ------------------
  632|    988|      FB_TRACE("partial",&ustrs[i],false,i);
  633|       |      // is partial.
  634|       |      // is it unique?
  635|    988|      int sameAs = -1;
  636|   180k|      for(int j=0;j<subCount;j++) {
  ------------------
  |  Branch (636:19): [True: 179k, False: 988]
  ------------------
  637|   179k|        if(j==i) continue;
  ------------------
  |  Branch (637:12): [True: 988, False: 178k]
  ------------------
  638|   178k|        if(ustrs[i].compare(0,nn+1,ustrs[j],0,nn+1)==0) {
  ------------------
  |  Branch (638:12): [True: 2.36k, False: 176k]
  ------------------
  639|  2.36k|          FB_TRACE("prefix",&ustrs[j],false,nn+1);
  640|       |          //UBool otherIsPartial = ((nn+1)!=ustrs[j].length());  // true if ustrs[j] doesn't end at nn
  641|  2.36k|          if(partials[j]==0) { // hasn't been processed yet
  ------------------
  |  Branch (641:14): [True: 718, False: 1.64k]
  ------------------
  642|    718|            partials[j] = kSuppressInReverse | kAddToForward;
  643|    718|            FB_TRACE("suppressing",&ustrs[j],false,j);
  644|  1.64k|          } else if(partials[j] & kSuppressInReverse) {
  ------------------
  |  Branch (644:21): [True: 1.64k, False: 0]
  ------------------
  645|  1.64k|            sameAs = j; // the other entry is already in the reverse table.
  646|  1.64k|          }
  647|  2.36k|        }
  648|   178k|      }
  649|    988|      FB_TRACE("for partial same-",&ustrs[i],false,sameAs);
  650|    988|      FB_TRACE(" == partial #",&ustrs[i],false,partials[i]);
  651|    988|      UnicodeString prefix(ustrs[i], 0, nn+1);
  652|    988|      if(sameAs == -1 && partials[i] == 0) {
  ------------------
  |  Branch (652:10): [True: 483, False: 505]
  |  Branch (652:26): [True: 483, False: 0]
  ------------------
  653|       |        // first one - add the prefix to the reverse table.
  654|    483|        prefix.reverse();
  655|    483|        builder->add(prefix, kPARTIAL, status);
  656|    483|        revCount++;
  657|    483|        FB_TRACE("Added partial",&prefix,false, i);
  658|    483|        FB_TRACE(u_errorName(status),&ustrs[i],false,i);
  659|    483|        partials[i] = kSuppressInReverse | kAddToForward;
  660|    505|      } else {
  661|    505|        FB_TRACE("NOT adding partial",&prefix,false, i);
  662|    505|        FB_TRACE(u_errorName(status),&ustrs[i],false,i);
  663|    505|      }
  664|    988|    }
  665|  4.68k|  }
  666|  4.85k|  for(int i=0;i<subCount;i++) {
  ------------------
  |  Branch (666:15): [True: 4.68k, False: 174]
  ------------------
  667|  4.68k|    if(partials[i]==0) {
  ------------------
  |  Branch (667:8): [True: 3.48k, False: 1.20k]
  ------------------
  668|  3.48k|      ustrs[i].reverse();
  669|  3.48k|      builder->add(ustrs[i], kMATCH, status);
  670|  3.48k|      revCount++;
  671|  3.48k|      FB_TRACE(u_errorName(status), &ustrs[i], false, i);
  672|  3.48k|    } else {
  673|  1.20k|      FB_TRACE("Adding fwd",&ustrs[i], false, i);
  674|       |
  675|       |      // an optimization would be to only add the portion after the '.'
  676|       |      // for example, for "Ph.D." we store ".hP" in the reverse table. We could just store "D." in the forward,
  677|       |      // instead of "Ph.D." since we already know the "Ph." part is a match.
  678|       |      // would need the trie to be able to hold 0-length strings, though.
  679|  1.20k|      builder2->add(ustrs[i], kMATCH, status); // forward
  680|  1.20k|      fwdCount++;
  681|       |      //ustrs[i].reverse();
  682|       |      ////if(debug2) u_printf("SUPPRESS- not Added(%d):  /%S/ status=%s\n",partials[i], ustrs[i].getTerminatedBuffer(), u_errorName(status));
  683|  1.20k|    }
  684|  4.68k|  }
  685|    174|  FB_TRACE("AbbrCount",nullptr,false, subCount);
  686|       |
  687|    174|  if(revCount>0) {
  ------------------
  |  Branch (687:6): [True: 33, False: 141]
  ------------------
  688|     33|    backwardsTrie.adoptInstead(builder->build(USTRINGTRIE_BUILD_FAST, status));
  689|     33|    if(U_FAILURE(status)) {
  ------------------
  |  Branch (689:8): [True: 0, False: 33]
  ------------------
  690|      0|      FB_TRACE(u_errorName(status),nullptr,false, -1);
  691|      0|      return nullptr;
  692|      0|    }
  693|     33|  }
  694|       |
  695|    174|  if(fwdCount>0) {
  ------------------
  |  Branch (695:6): [True: 33, False: 141]
  ------------------
  696|     33|    forwardsPartialTrie.adoptInstead(builder2->build(USTRINGTRIE_BUILD_FAST, status));
  697|     33|    if(U_FAILURE(status)) {
  ------------------
  |  Branch (697:8): [True: 0, False: 33]
  ------------------
  698|      0|      FB_TRACE(u_errorName(status),nullptr,false, -1);
  699|      0|      return nullptr;
  700|      0|    }
  701|     33|  }
  702|       |
  703|    174|  return new SimpleFilteredSentenceBreakIterator(adopt.orphan(), forwardsPartialTrie.orphan(), backwardsTrie.orphan(), status);
  704|    174|}
_ZN6icu_7828FilteredBreakIteratorBuilderC2Ev:
  709|    201|FilteredBreakIteratorBuilder::FilteredBreakIteratorBuilder() {
  710|    201|}
_ZN6icu_7828FilteredBreakIteratorBuilderD2Ev:
  712|    201|FilteredBreakIteratorBuilder::~FilteredBreakIteratorBuilder() {
  713|    201|}
_ZN6icu_7828FilteredBreakIteratorBuilder14createInstanceERKNS_6LocaleER10UErrorCode:
  716|    201|FilteredBreakIteratorBuilder::createInstance(const Locale& where, UErrorCode& status) {
  717|    201|  if(U_FAILURE(status)) return nullptr;
  ------------------
  |  Branch (717:6): [True: 0, False: 201]
  ------------------
  718|    201|  LocalPointer<FilteredBreakIteratorBuilder> ret(new SimpleFilteredBreakIteratorBuilder(where, status), status);
  719|    201|  return (U_SUCCESS(status))? ret.orphan(): nullptr;
  ------------------
  |  Branch (719:10): [True: 180, False: 21]
  ------------------
  720|    201|}
_ZN6icu_7831SimpleFilteredSentenceBreakDataC2EPNS_10UCharsTrieES2_:
  141|    174|      : fForwardsPartialTrie(forwards), fBackwardsTrie(backwards), refcount(1) { }
_ZN6icu_7831SimpleFilteredSentenceBreakData4decrEv:
  146|    174|    SimpleFilteredSentenceBreakData *decr() {
  147|    174|        if(umtx_atomic_dec(&refcount) <= 0) {
  ------------------
  |  Branch (147:12): [True: 174, False: 0]
  ------------------
  148|    174|            delete this;
  149|    174|        }
  150|    174|        return nullptr;
  151|    174|    }
_ZN6icu_7810UStringSetC2ER10UErrorCode:
   63|    201|  UStringSet(UErrorCode &status) : UVector(uprv_deleteUObject,
  ------------------
  |  | 1489|    201|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|    201|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    201|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    201|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|    201|                                           uhash_compareUnicodeString,
  ------------------
  |  |  999|    201|#define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString)
  |  |  ------------------
  |  |  |  |  123|    201|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    201|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    201|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   65|    201|                                           1,
   66|    201|                                           status) {}
_ZN6icu_7810UStringSet3addERKNS_13UnicodeStringER10UErrorCode:
  102|  5.39k|  inline UBool add(const UnicodeString& str, UErrorCode &status) {
  103|  5.39k|    if(U_FAILURE(status)) return false;
  ------------------
  |  Branch (103:8): [True: 0, False: 5.39k]
  ------------------
  104|  5.39k|    UnicodeString *t = new UnicodeString(str);
  105|  5.39k|    if(t==nullptr) {
  ------------------
  |  Branch (105:8): [True: 0, False: 5.39k]
  ------------------
  106|      0|      status = U_MEMORY_ALLOCATION_ERROR; return false;
  107|      0|    }
  108|  5.39k|    return adopt(t, status);
  109|  5.39k|  }
_ZN6icu_7810UStringSet5adoptEPNS_13UnicodeStringER10UErrorCode:
   86|  5.39k|  inline UBool adopt(UnicodeString *str, UErrorCode &status) {
   87|  5.39k|    if(U_FAILURE(status) || contains(*str)) {
  ------------------
  |  Branch (87:8): [True: 0, False: 5.39k]
  |  Branch (87:29): [True: 0, False: 5.39k]
  ------------------
   88|      0|      delete str;
   89|      0|      return false;
   90|  5.39k|    } else {
   91|  5.39k|      sortedInsert(str, compareUnicodeString, status);
   92|  5.39k|      if(U_FAILURE(status)) {
  ------------------
  |  Branch (92:10): [True: 0, False: 5.39k]
  ------------------
   93|      0|        return false;
   94|      0|      }
   95|  5.39k|      return true;
   96|  5.39k|    }
   97|  5.39k|  }
_ZN6icu_7810UStringSet8containsERKNS_13UnicodeStringE:
   71|  5.39k|  inline UBool contains(const UnicodeString& s) {
   72|  5.39k|    return contains((void*) &s);
   73|  5.39k|  }
filteredbrk.cpp:_ZN6icu_78L20compareUnicodeStringE8UElementS0_:
   52|  32.2k|static int32_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) {
   53|  32.2k|    const UnicodeString& a = *static_cast<const UnicodeString*>(t1.pointer);
   54|  32.2k|    const UnicodeString& b = *static_cast<const UnicodeString*>(t2.pointer);
   55|  32.2k|    return a.compare(b);
   56|  32.2k|}
filteredbrk.cpp:_ZN6icu_78L21newUnicodeStringArrayEm:
  582|    174|static inline UnicodeString* newUnicodeStringArray(size_t count) {
  583|    174|    return new UnicodeString[count ? count : 1];
  ------------------
  |  Branch (583:30): [True: 33, False: 141]
  ------------------
  584|    174|}
_ZNK6icu_7810UStringSet11getStringAtEi:
   78|  4.68k|  inline const UnicodeString* getStringAt(int32_t i) const {
   79|  4.68k|    return static_cast<const UnicodeString*>(elementAt(i));
   80|  4.68k|  }

_ZN6icu_789Hashtable4initEPFi8UElementEPFaS1_S1_ES5_R10UErrorCode:
  127|      1|                            UValueComparator *valueComp, UErrorCode& status) {
  128|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (128:9): [True: 0, False: 1]
  ------------------
  129|      0|        return;
  130|      0|    }
  131|      1|    uhash_init(&hashObj, keyHash, keyComp, valueComp, &status);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|      1|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (132:9): [True: 1, False: 0]
  ------------------
  133|      1|        hash = &hashObj;
  134|      1|        uhash_setKeyDeleter(hash, uprv_deleteUObject);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_setKeyDeleter(hash, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|      1|    }
  136|      1|}
_ZN6icu_789Hashtable4putiERKNS_13UnicodeStringEiR10UErrorCode:
  208|    605|inline int32_t Hashtable::puti(const UnicodeString& key, int32_t value, UErrorCode& status) {
  209|    605|    return uhash_puti(hash, new UnicodeString(key), value, &status);
  ------------------
  |  | 1033|    605|#define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti)
  |  |  ------------------
  |  |  |  |  123|    605|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    605|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    605|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|    605|}
_ZN6icu_789HashtableC2Ev:
  184|      1| : hash(nullptr)
  185|      1|{
  186|      1|    UErrorCode status = U_ZERO_ERROR;
  187|      1|    init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, status);
  ------------------
  |  | 1017|      1|#define uhash_hashUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashUnicodeString)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  188|      1|}

_ZN6icu_7821LoadedNormalizer2Impl12isAcceptableEPvPKcS3_PK9UDataInfo:
   57|      1|                                    const UDataInfo *pInfo) {
   58|      1|    if(
   59|      1|        pInfo->size>=20 &&
  ------------------
  |  Branch (59:9): [True: 1, False: 0]
  ------------------
   60|      1|        pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
  ------------------
  |  |  353|      2|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (60:9): [True: 1, False: 0]
  ------------------
   61|      1|        pInfo->charsetFamily==U_CHARSET_FAMILY &&
  ------------------
  |  |  588|      1|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|      2|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
  |  Branch (61:9): [True: 1, False: 0]
  ------------------
   62|      1|        pInfo->dataFormat[0]==0x4e &&    /* dataFormat="Nrm2" */
  ------------------
  |  Branch (62:9): [True: 1, False: 0]
  ------------------
   63|      1|        pInfo->dataFormat[1]==0x72 &&
  ------------------
  |  Branch (63:9): [True: 1, False: 0]
  ------------------
   64|      1|        pInfo->dataFormat[2]==0x6d &&
  ------------------
  |  Branch (64:9): [True: 1, False: 0]
  ------------------
   65|      1|        pInfo->dataFormat[3]==0x32 &&
  ------------------
  |  Branch (65:9): [True: 1, False: 0]
  ------------------
   66|      1|        pInfo->formatVersion[0]==5
  ------------------
  |  Branch (66:9): [True: 1, False: 0]
  ------------------
   67|      1|    ) {
   68|       |        // Normalizer2Impl *me=(Normalizer2Impl *)context;
   69|       |        // uprv_memcpy(me->dataVersion, pInfo->dataVersion, 4);
   70|      1|        return true;
   71|      1|    } else {
   72|      0|        return false;
   73|      0|    }
   74|      1|}
_ZN6icu_7821LoadedNormalizer2Impl4loadEPKcS2_R10UErrorCode:
   77|      1|LoadedNormalizer2Impl::load(const char *packageName, const char *name, UErrorCode &errorCode) {
   78|      1|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (78:8): [True: 0, False: 1]
  ------------------
   79|      0|        return;
   80|      0|    }
   81|      1|    memory=udata_openChoice(packageName, "nrm", name, isAcceptable, this, &errorCode);
  ------------------
  |  |  894|      1|#define udata_openChoice U_ICU_ENTRY_POINT_RENAME(udata_openChoice)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   82|      1|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (82:8): [True: 0, False: 1]
  ------------------
   83|      0|        return;
   84|      0|    }
   85|      1|    const uint8_t* inBytes = static_cast<const uint8_t*>(udata_getMemory(memory));
  ------------------
  |  |  891|      1|#define udata_getMemory U_ICU_ENTRY_POINT_RENAME(udata_getMemory)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   86|      1|    const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes);
   87|      1|    int32_t indexesLength=inIndexes[IX_NORM_TRIE_OFFSET]/4;
   88|      1|    if(indexesLength<=IX_MIN_LCCC_CP) {
  ------------------
  |  Branch (88:8): [True: 0, False: 1]
  ------------------
   89|      0|        errorCode=U_INVALID_FORMAT_ERROR;  // Not enough indexes.
   90|      0|        return;
   91|      0|    }
   92|       |
   93|      1|    int32_t offset=inIndexes[IX_NORM_TRIE_OFFSET];
   94|      1|    int32_t nextOffset=inIndexes[IX_EXTRA_DATA_OFFSET];
   95|      1|    ownedTrie=ucptrie_openFromBinary(UCPTRIE_TYPE_FAST, UCPTRIE_VALUE_BITS_16,
  ------------------
  |  |  813|      1|#define ucptrie_openFromBinary U_ICU_ENTRY_POINT_RENAME(ucptrie_openFromBinary)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|      1|                                     inBytes+offset, nextOffset-offset, nullptr,
   97|      1|                                     &errorCode);
   98|      1|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (98:8): [True: 0, False: 1]
  ------------------
   99|      0|        return;
  100|      0|    }
  101|       |
  102|      1|    offset=nextOffset;
  103|      1|    nextOffset=inIndexes[IX_SMALL_FCD_OFFSET];
  104|      1|    const uint16_t* inExtraData = reinterpret_cast<const uint16_t*>(inBytes + offset);
  105|       |
  106|       |    // smallFCD: new in formatVersion 2
  107|      1|    offset=nextOffset;
  108|      1|    const uint8_t *inSmallFCD=inBytes+offset;
  109|       |
  110|      1|    init(inIndexes, ownedTrie, inExtraData, inSmallFCD);
  111|      1|}
_ZN6icu_7813Norm2AllModes14createInstanceEPKcS2_R10UErrorCode:
  118|      1|                              UErrorCode &errorCode) {
  119|      1|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (119:8): [True: 0, False: 1]
  ------------------
  120|      0|        return nullptr;
  121|      0|    }
  122|      1|    LoadedNormalizer2Impl *impl=new LoadedNormalizer2Impl;
  123|      1|    if(impl==nullptr) {
  ------------------
  |  Branch (123:8): [True: 0, False: 1]
  ------------------
  124|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  125|      0|        return nullptr;
  126|      0|    }
  127|      1|    impl->load(packageName, name, errorCode);
  128|      1|    return createInstance(impl, errorCode);
  129|      1|}
_ZN6icu_7813Norm2AllModes15getNFKCInstanceER10UErrorCode:
  212|      1|Norm2AllModes::getNFKCInstance(UErrorCode &errorCode) {
  213|      1|    if(U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (213:8): [True: 0, False: 1]
  ------------------
  214|      1|    umtx_initOnce(nfkcInitOnce, &initSingletons, "nfkc", errorCode);
  215|      1|    return nfkcSingleton;
  216|      1|}
_ZN6icu_7811Normalizer215getNFKCInstanceER10UErrorCode:
  263|      1|Normalizer2::getNFKCInstance(UErrorCode &errorCode) {
  264|      1|    const Norm2AllModes *allModes=Norm2AllModes::getNFKCInstance(errorCode);
  265|      1|    return allModes!=nullptr ? &allModes->comp : nullptr;
  ------------------
  |  Branch (265:12): [True: 1, False: 0]
  ------------------
  266|      1|}
_ZN6icu_7821LoadedNormalizer2ImplC2Ev:
   36|      1|    LoadedNormalizer2Impl() : memory(nullptr), ownedTrie(nullptr) {}
loadednormalizer2impl.cpp:_ZN6icu_78L14initSingletonsEPKcR10UErrorCode:
  152|      1|static void U_CALLCONV initSingletons(const char *what, UErrorCode &errorCode) {
  153|       |#if !NORM2_HARDCODE_NFC_DATA
  154|       |    if (uprv_strcmp(what, "nfc") == 0) {
  155|       |        nfcSingleton    = Norm2AllModes::createInstance(nullptr, "nfc", errorCode);
  156|       |    } else
  157|       |#endif
  158|      1|    if (uprv_strcmp(what, "nfkc") == 0) {
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (158:9): [True: 1, False: 0]
  ------------------
  159|      1|        nfkcSingleton    = Norm2AllModes::createInstance(nullptr, "nfkc", errorCode);
  160|      1|    } else if (uprv_strcmp(what, "nfkc_cf") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (160:16): [True: 0, False: 0]
  ------------------
  161|      0|        nfkc_cfSingleton = Norm2AllModes::createInstance(nullptr, "nfkc_cf", errorCode);
  162|      0|    } else if (uprv_strcmp(what, "nfkc_scf") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (162:16): [True: 0, False: 0]
  ------------------
  163|      0|        nfkc_scfSingleton = Norm2AllModes::createInstance(nullptr, "nfkc_scf", errorCode);
  164|      0|    } else {
  165|      0|        UPRV_UNREACHABLE_EXIT;   // Unknown singleton
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  166|      0|    }
  167|      1|    ucln_common_registerCleanup(UCLN_COMMON_LOADED_NORMALIZER2, uprv_loaded_normalizer2_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      1|}

_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|  7.39k|{
   80|  7.39k|    umtx_initOnce(gInitOnceLocale, &locale_available_init);
   81|  7.39k|    count = availableLocaleListCount;
   82|  7.39k|    return availableLocaleList;
   83|  7.39k|}
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_7811LocaleBased9getLocaleEPKNS_10CharStringES3_18ULocDataLocaleTypeR10UErrorCode:
   20|    348|                              ULocDataLocaleType type, UErrorCode& status) {
   21|    348|    const char* id = getLocaleID(valid, actual, type, status);
   22|    348|    return Locale(id != nullptr ? id : "");
  ------------------
  |  Branch (22:19): [True: 348, False: 0]
  ------------------
   23|    348|}
_ZN6icu_7811LocaleBased11getLocaleIDEPKNS_10CharStringES3_18ULocDataLocaleTypeR10UErrorCode:
   26|    348|                                     ULocDataLocaleType type, UErrorCode& status) {
   27|    348|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (27:9): [True: 0, False: 348]
  ------------------
   28|      0|        return nullptr;
   29|      0|    }
   30|       |
   31|    348|    switch(type) {
   32|    174|    case ULOC_VALID_LOCALE:
  ------------------
  |  Branch (32:5): [True: 174, False: 174]
  ------------------
   33|    174|        return valid == nullptr ? "" : valid->data();
  ------------------
  |  Branch (33:16): [True: 0, False: 174]
  ------------------
   34|    174|    case ULOC_ACTUAL_LOCALE:
  ------------------
  |  Branch (34:5): [True: 174, False: 174]
  ------------------
   35|    174|        return actual == nullptr ? "" : actual->data();
  ------------------
  |  Branch (35:16): [True: 0, False: 174]
  ------------------
   36|      0|    default:
  ------------------
  |  Branch (36:5): [True: 0, False: 348]
  ------------------
   37|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
   38|      0|        return nullptr;
   39|    348|    }
   40|    348|}
_ZN6icu_7811LocaleBased12setLocaleIDsEPKcS2_R10UErrorCode:
   46|  14.9k|void LocaleBased::setLocaleIDs(const char* validID, const char* actualID, UErrorCode& status) {
   47|  14.9k|    setValidLocaleID(validID, status);
   48|  14.9k|    setActualLocaleID(actualID,status);
   49|  14.9k|}
_ZN6icu_7811LocaleBased11setLocaleIDEPKcRPNS_10CharStringER10UErrorCode:
   51|  44.6k|void LocaleBased::setLocaleID(const char* id, CharString*& dest, UErrorCode& status) {
   52|  44.6k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (52:9): [True: 0, False: 44.6k]
  ------------------
   53|  44.6k|    if (id == nullptr || *id == 0) {
  ------------------
  |  Branch (53:9): [True: 0, False: 44.6k]
  |  Branch (53:26): [True: 2.78k, False: 41.8k]
  ------------------
   54|  2.78k|        delete dest;
   55|  2.78k|        dest = nullptr;
   56|  41.8k|    } else {
   57|  41.8k|        if (dest == nullptr) {
  ------------------
  |  Branch (57:13): [True: 41.8k, False: 0]
  ------------------
   58|  41.8k|            dest = new CharString(id, status);
   59|  41.8k|            if (dest == nullptr) {
  ------------------
  |  Branch (59:17): [True: 0, False: 41.8k]
  ------------------
   60|      0|                status = U_MEMORY_ALLOCATION_ERROR;
   61|      0|                return;
   62|      0|            }
   63|  41.8k|        } else {
   64|      0|            dest->copyFrom(id, status);
   65|      0|        }
   66|  41.8k|    }
   67|  44.6k|}

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

_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|  57.9k|{
  231|  57.9k|    U_NAMESPACE_USE
  ------------------
  |  |  112|  57.9k|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
  232|  57.9k|    return Locale::getDefault().getName();
  233|  57.9k|}
_ZN6icu_786LocaleD2Ev:
  247|  7.74k|{
  248|  7.74k|    if ((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (248:9): [True: 4.17k, False: 3.56k]
  |  Branch (248:35): [True: 4.17k, False: 0]
  ------------------
  249|  4.17k|        uprv_free(baseName);
  ------------------
  |  | 1503|  4.17k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  4.17k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.17k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.17k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|  4.17k|    }
  251|  7.74k|    baseName = nullptr;
  252|       |    /*if fullName is on the heap, we free it*/
  253|  7.74k|    if (fullName != fullNameBuffer)
  ------------------
  |  Branch (253:9): [True: 660, False: 7.08k]
  ------------------
  254|    660|    {
  255|    660|        uprv_free(fullName);
  ------------------
  |  | 1503|    660|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    660|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    660|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    660|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|    660|        fullName = nullptr;
  257|    660|    }
  258|  7.74k|}
_ZN6icu_786LocaleC2Ev:
  261|    885|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  262|    885|{
  263|    885|    init(nullptr, false);
  264|    885|}
_ZN6icu_786LocaleC2ENS0_11ELocaleTypeE:
  272|      1|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  273|      1|{
  274|      1|    setToBogus();
  275|      1|}
_ZN6icu_786LocaleC2EPKcS2_S2_S2_:
  282|  7.74k|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  283|  7.74k|{
  284|  7.74k|    if( (newLanguage==nullptr) && (newCountry == nullptr) && (newVariant == nullptr) )
  ------------------
  |  Branch (284:9): [True: 0, False: 7.74k]
  |  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|  7.74k|    else
  289|  7.74k|    {
  290|  7.74k|        UErrorCode status = U_ZERO_ERROR;
  291|  7.74k|        int32_t lsize = 0;
  292|  7.74k|        int32_t csize = 0;
  293|  7.74k|        int32_t vsize = 0;
  294|  7.74k|        int32_t ksize = 0;
  295|       |
  296|       |        // Check the sizes of the input strings.
  297|       |
  298|       |        // Language
  299|  7.74k|        if ( newLanguage != nullptr )
  ------------------
  |  Branch (299:14): [True: 7.74k, False: 0]
  ------------------
  300|  7.74k|        {
  301|  7.74k|            lsize = static_cast<int32_t>(uprv_strlen(newLanguage));
  ------------------
  |  |   37|  7.74k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  7.74k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  302|  7.74k|            if ( lsize < 0 || lsize > ULOC_STRING_LIMIT ) { // int32 wrap
  ------------------
  |  |   76|  7.74k|#define ULOC_STRING_LIMIT 357913941
  ------------------
  |  Branch (302:18): [True: 0, False: 7.74k]
  |  Branch (302:31): [True: 0, False: 7.74k]
  ------------------
  303|      0|                setToBogus();
  304|      0|                return;
  305|      0|            }
  306|  7.74k|        }
  307|       |
  308|  7.74k|        CharString togo(newLanguage, lsize, status); // start with newLanguage
  309|       |
  310|       |        // _Country
  311|  7.74k|        if ( newCountry != nullptr )
  ------------------
  |  Branch (311:14): [True: 0, False: 7.74k]
  ------------------
  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|  7.74k|        if ( newVariant != nullptr )
  ------------------
  |  Branch (321:14): [True: 0, False: 7.74k]
  ------------------
  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|  7.74k|        if ( newKeywords != nullptr)
  ------------------
  |  Branch (341:14): [True: 0, False: 7.74k]
  ------------------
  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|  7.74k|        if ( ( vsize != 0 ) || (csize != 0) )  // at least:  __v
  ------------------
  |  Branch (354:14): [True: 0, False: 7.74k]
  |  Branch (354:32): [True: 0, False: 7.74k]
  ------------------
  355|      0|        {                                      //            ^
  356|      0|            togo.append(SEP_CHAR, status);
  ------------------
  |  |  243|      0|#define SEP_CHAR '_'
  ------------------
  357|      0|        }
  358|       |
  359|  7.74k|        if ( csize != 0 )
  ------------------
  |  Branch (359:14): [True: 0, False: 7.74k]
  ------------------
  360|      0|        {
  361|      0|            togo.append(newCountry, status);
  362|      0|        }
  363|       |
  364|  7.74k|        if ( vsize != 0)
  ------------------
  |  Branch (364:14): [True: 0, False: 7.74k]
  ------------------
  365|      0|        {
  366|      0|            togo.append(SEP_CHAR, status)
  ------------------
  |  |  243|      0|#define SEP_CHAR '_'
  ------------------
  367|      0|                .append(newVariant, vsize, status);
  368|      0|        }
  369|       |
  370|  7.74k|        if ( ksize != 0)
  ------------------
  |  Branch (370:14): [True: 0, False: 7.74k]
  ------------------
  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|  7.74k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (384:13): [True: 0, False: 7.74k]
  ------------------
  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|  7.74k|        init(togo.data(), false);
  392|  7.74k|    }
  393|  7.74k|}
_ZN6icu_786LocaleaSERKS0_:
  406|    885|Locale& Locale::operator=(const Locale& other) {
  407|    885|    if (this == &other) {
  ------------------
  |  Branch (407:9): [True: 0, False: 885]
  ------------------
  408|      0|        return *this;
  409|      0|    }
  410|       |
  411|    885|    setToBogus();
  412|       |
  413|    885|    if (other.fullName == other.fullNameBuffer) {
  ------------------
  |  Branch (413:9): [True: 885, False: 0]
  ------------------
  414|    885|        uprv_strcpy(fullNameBuffer, other.fullNameBuffer);
  ------------------
  |  |   36|    885|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|    885|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  415|    885|    } 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|    885|    if (other.baseName == other.fullName) {
  ------------------
  |  Branch (422:9): [True: 885, False: 0]
  ------------------
  423|    885|        baseName = fullName;
  424|    885|    } 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|    885|    uprv_strcpy(language, other.language);
  ------------------
  |  |   36|    885|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|    885|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  430|    885|    uprv_strcpy(script, other.script);
  ------------------
  |  |   36|    885|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|    885|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  431|    885|    uprv_strcpy(country, other.country);
  ------------------
  |  |   36|    885|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|    885|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  432|       |
  433|    885|    variantBegin = other.variantBegin;
  434|    885|    fIsBogus = other.fIsBogus;
  435|       |
  436|    885|    return *this;
  437|    885|}
_ZN6icu_786Locale4initEPKca:
 1832|  9.51k|{
 1833|  9.51k|    return localeID == nullptr ? *this = getDefault() : init(StringPiece{localeID}, canonicalize);
  ------------------
  |  Branch (1833:12): [True: 885, False: 8.63k]
  ------------------
 1834|  9.51k|}
_ZN6icu_786Locale4initENS_11StringPieceEa:
 1838|  8.63k|{
 1839|  8.63k|    fIsBogus = false;
 1840|       |    /* Free our current storage */
 1841|  8.63k|    if ((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (1841:9): [True: 7.74k, False: 885]
  |  Branch (1841:35): [True: 7.74k, False: 0]
  ------------------
 1842|  7.74k|        uprv_free(baseName);
  ------------------
  |  | 1503|  7.74k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  7.74k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.74k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.74k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1843|  7.74k|    }
 1844|  8.63k|    baseName = nullptr;
 1845|  8.63k|    if(fullName != fullNameBuffer) {
  ------------------
  |  Branch (1845:8): [True: 0, False: 8.63k]
  ------------------
 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|  8.63k|    do {
 1854|  8.63k|        char *separator;
 1855|  8.63k|        char *field[5] = {nullptr};
 1856|  8.63k|        int32_t fieldLen[5] = {0};
 1857|  8.63k|        int32_t fieldIdx;
 1858|  8.63k|        int32_t variantField;
 1859|  8.63k|        int32_t length;
 1860|  8.63k|        UErrorCode err;
 1861|       |
 1862|       |        /* preset all fields to empty */
 1863|  8.63k|        language[0] = script[0] = country[0] = 0;
 1864|       |
 1865|  8.63k|        const auto parse = [canonicalize](std::string_view localeID,
 1866|  8.63k|                                          char* name,
 1867|  8.63k|                                          int32_t nameCapacity,
 1868|  8.63k|                                          UErrorCode& status) {
 1869|  8.63k|            return ByteSinkUtil::viaByteSinkToTerminatedChars(
 1870|  8.63k|                name, nameCapacity,
 1871|  8.63k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  8.63k|                    if (canonicalize) {
 1873|  8.63k|                        ulocimp_canonicalize(localeID, sink, status);
 1874|  8.63k|                    } else {
 1875|  8.63k|                        ulocimp_getName(localeID, sink, status);
 1876|  8.63k|                    }
 1877|  8.63k|                },
 1878|  8.63k|                status);
 1879|  8.63k|        };
 1880|       |
 1881|       |        // "canonicalize" the locale ID to ICU/Java format
 1882|  8.63k|        err = U_ZERO_ERROR;
 1883|  8.63k|        length = parse(localeID, fullName, sizeof fullNameBuffer, err);
 1884|       |
 1885|  8.63k|        if (err == U_BUFFER_OVERFLOW_ERROR || length >= static_cast<int32_t>(sizeof(fullNameBuffer))) {
  ------------------
  |  Branch (1885:13): [True: 495, False: 8.13k]
  |  Branch (1885:47): [True: 167, False: 7.97k]
  ------------------
 1886|    662|            U_ASSERT(baseName == nullptr);
  ------------------
  |  |   35|    662|#   define U_ASSERT(exp) (void)0
  ------------------
 1887|       |            /*Go to heap for the fullName if necessary*/
 1888|    662|            char* newFullName = static_cast<char*>(uprv_malloc(sizeof(char) * (length + 1)));
  ------------------
  |  | 1524|    662|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    662|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    662|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    662|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1889|    662|            if (newFullName == nullptr) {
  ------------------
  |  Branch (1889:17): [True: 0, False: 662]
  ------------------
 1890|      0|                break; // error: out of memory
 1891|      0|            }
 1892|    662|            fullName = newFullName;
 1893|    662|            err = U_ZERO_ERROR;
 1894|    662|            length = parse(localeID, fullName, length + 1, err);
 1895|    662|        }
 1896|  8.63k|        if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) {
  ------------------
  |  Branch (1896:12): [True: 2.20k, False: 6.42k]
  |  Branch (1896:30): [True: 0, False: 6.42k]
  ------------------
 1897|       |            /* should never occur */
 1898|  2.20k|            break;
 1899|  2.20k|        }
 1900|       |
 1901|  6.42k|        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|  6.42k|        separator = field[0] = fullName;
 1906|  6.42k|        fieldIdx = 1;
 1907|  6.42k|        char* at = uprv_strchr(fullName, '@');
  ------------------
  |  |   40|  6.42k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  6.42k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1908|  10.5k|        while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != nullptr &&
  ------------------
  |  |   40|  10.5k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  10.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1908:16): [True: 4.78k, False: 5.72k]
  ------------------
 1909|  10.5k|               fieldIdx < UPRV_LENGTHOF(field)-1 &&
  ------------------
  |  |   99|  4.78k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1909:16): [True: 4.21k, False: 570]
  ------------------
 1910|  10.5k|               (at == nullptr || separator < at)) {
  ------------------
  |  Branch (1910:17): [True: 3.19k, False: 1.01k]
  |  Branch (1910:34): [True: 886, False: 130]
  ------------------
 1911|  4.08k|            field[fieldIdx] = separator + 1;
 1912|  4.08k|            fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]);
 1913|  4.08k|            fieldIdx++;
 1914|  4.08k|        }
 1915|       |        // variant may contain @foo or .foo POSIX cruft; remove it
 1916|  6.42k|        separator = uprv_strchr(field[fieldIdx-1], '@');
  ------------------
  |  |   40|  6.42k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  6.42k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1917|  6.42k|        char* sep2 = uprv_strchr(field[fieldIdx-1], '.');
  ------------------
  |  |   40|  6.42k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  6.42k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1918|  6.42k|        if (separator!=nullptr || sep2!=nullptr) {
  ------------------
  |  Branch (1918:13): [True: 2.17k, False: 4.24k]
  |  Branch (1918:35): [True: 165, False: 4.08k]
  ------------------
 1919|  2.34k|            if (separator==nullptr || (sep2!=nullptr && separator > sep2)) {
  ------------------
  |  Branch (1919:17): [True: 165, False: 2.17k]
  |  Branch (1919:40): [True: 97, False: 2.08k]
  |  Branch (1919:57): [True: 29, False: 68]
  ------------------
 1920|    194|                separator = sep2;
 1921|    194|            }
 1922|  2.34k|            fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]);
 1923|  4.08k|        } else {
 1924|  4.08k|            fieldLen[fieldIdx - 1] = length - static_cast<int32_t>(field[fieldIdx - 1] - fullName);
 1925|  4.08k|        }
 1926|       |
 1927|  6.42k|        if (fieldLen[0] >= static_cast<int32_t>(sizeof(language)))
  ------------------
  |  Branch (1927:13): [True: 3, False: 6.42k]
  ------------------
 1928|      3|        {
 1929|      3|            break; // error: the language field is too long
 1930|      3|        }
 1931|       |
 1932|  6.42k|        variantField = 1; /* Usually the 2nd one, except when a script or country is also used. */
 1933|  6.42k|        if (fieldLen[0] > 0) {
  ------------------
  |  Branch (1933:13): [True: 4.48k, False: 1.93k]
  ------------------
 1934|       |            /* We have a language */
 1935|  4.48k|            uprv_memcpy(language, fullName, fieldLen[0]);
  ------------------
  |  |   42|  4.48k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  4.48k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  4.48k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  4.48k|    _Pragma("clang diagnostic push") \
  |  |   45|  4.48k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  4.48k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.48k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  4.48k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.48k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  4.48k|    _Pragma("clang diagnostic pop") \
  |  |   49|  4.48k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  4.48k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  4.48k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  4.48k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1936|  4.48k|            language[fieldLen[0]] = 0;
 1937|  4.48k|        }
 1938|  6.42k|        if (fieldLen[1] == 4 && uprv_isASCIILetter(field[1][0]) &&
  ------------------
  |  | 1514|    224|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    224|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    224|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    224|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1938:13): [True: 224, False: 6.19k]
  |  Branch (1938:33): [True: 223, False: 1]
  ------------------
 1939|  6.42k|                uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) &&
  ------------------
  |  | 1514|    223|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    223|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    223|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    223|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                              uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) &&
  ------------------
  |  | 1514|    222|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    222|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    222|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    222|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1939:17): [True: 222, False: 1]
  |  Branch (1939:52): [True: 221, False: 1]
  ------------------
 1940|  6.42k|                uprv_isASCIILetter(field[1][3])) {
  ------------------
  |  | 1514|    221|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    221|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    221|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    221|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1940:17): [True: 219, False: 2]
  ------------------
 1941|       |            /* We have at least a script */
 1942|    219|            uprv_memcpy(script, field[1], fieldLen[1]);
  ------------------
  |  |   42|    219|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    219|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    219|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    219|    _Pragma("clang diagnostic push") \
  |  |   45|    219|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    219|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    219|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    219|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    219|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    219|    _Pragma("clang diagnostic pop") \
  |  |   49|    219|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    219|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    219|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    219|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1943|    219|            script[fieldLen[1]] = 0;
 1944|    219|            variantField++;
 1945|    219|        }
 1946|       |
 1947|  6.42k|        if (fieldLen[variantField] == 2 || fieldLen[variantField] == 3) {
  ------------------
  |  Branch (1947:13): [True: 901, False: 5.52k]
  |  Branch (1947:44): [True: 105, False: 5.41k]
  ------------------
 1948|       |            /* We have a country */
 1949|  1.00k|            uprv_memcpy(country, field[variantField], fieldLen[variantField]);
  ------------------
  |  |   42|  1.00k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.00k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.00k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.00k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.00k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.00k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.00k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.00k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.00k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.00k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.00k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.00k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.00k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.00k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1950|  1.00k|            country[fieldLen[variantField]] = 0;
 1951|  1.00k|            variantField++;
 1952|  5.41k|        } else if (fieldLen[variantField] == 0) {
  ------------------
  |  Branch (1952:20): [True: 5.40k, False: 14]
  ------------------
 1953|  5.40k|            variantField++; /* script or country empty but variant in next field (i.e. en__POSIX) */
 1954|  5.40k|        }
 1955|       |
 1956|  6.42k|        if (fieldLen[variantField] > 0) {
  ------------------
  |  Branch (1956:13): [True: 992, False: 5.42k]
  ------------------
 1957|       |            /* We have a variant */
 1958|    992|            variantBegin = static_cast<int32_t>(field[variantField] - fullName);
 1959|    992|        }
 1960|       |
 1961|  6.42k|        err = U_ZERO_ERROR;
 1962|  6.42k|        initBaseName(err);
 1963|  6.42k|        if (U_FAILURE(err)) {
  ------------------
  |  Branch (1963:13): [True: 0, False: 6.42k]
  ------------------
 1964|      0|            break;
 1965|      0|        }
 1966|       |
 1967|  6.42k|        if (canonicalize) {
  ------------------
  |  Branch (1967:13): [True: 885, False: 5.53k]
  ------------------
 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|  6.42k|        return *this;
 1984|  6.42k|    } 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|  2.21k|    setToBogus();
 1988|       |
 1989|  2.21k|    return *this;
 1990|  8.63k|}
_ZN6icu_786Locale12initBaseNameER10UErrorCode:
 1999|  6.42k|Locale::initBaseName(UErrorCode &status) {
 2000|  6.42k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2000:9): [True: 0, False: 6.42k]
  ------------------
 2001|      0|        return;
 2002|      0|    }
 2003|  6.42k|    U_ASSERT(baseName==nullptr || baseName==fullName);
  ------------------
  |  |   35|  6.42k|#   define U_ASSERT(exp) (void)0
  ------------------
 2004|  6.42k|    const char *atPtr = uprv_strchr(fullName, '@');
  ------------------
  |  |   40|  6.42k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  6.42k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2005|  6.42k|    const char *eqPtr = uprv_strchr(fullName, '=');
  ------------------
  |  |   40|  6.42k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  6.42k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2006|  6.42k|    if (atPtr && eqPtr && atPtr < eqPtr) {
  ------------------
  |  Branch (2006:9): [True: 2.17k, False: 4.24k]
  |  Branch (2006:18): [True: 1.99k, False: 186]
  |  Branch (2006:27): [True: 1.96k, False: 24]
  ------------------
 2007|       |        // Key words exist.
 2008|  1.96k|        int32_t baseNameLength = static_cast<int32_t>(atPtr - fullName);
 2009|  1.96k|        char* newBaseName = static_cast<char*>(uprv_malloc(baseNameLength + 1));
  ------------------
  |  | 1524|  1.96k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.96k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.96k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.96k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2010|  1.96k|        if (newBaseName == nullptr) {
  ------------------
  |  Branch (2010:13): [True: 0, False: 1.96k]
  ------------------
 2011|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 2012|      0|            return;
 2013|      0|        }
 2014|  1.96k|        baseName = newBaseName;
 2015|  1.96k|        uprv_strncpy(baseName, fullName, baseNameLength);
  ------------------
  |  |   43|  1.96k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|  1.96k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2016|  1.96k|        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|  1.96k|        if (variantBegin > baseNameLength) {
  ------------------
  |  Branch (2021:13): [True: 1.79k, False: 168]
  ------------------
 2022|  1.79k|            variantBegin = baseNameLength;
 2023|  1.79k|        }
 2024|  4.45k|    } else {
 2025|  4.45k|        baseName = fullName;
 2026|  4.45k|    }
 2027|  6.42k|}
_ZN6icu_786Locale10setToBogusEv:
 2037|  3.09k|Locale::setToBogus() {
 2038|       |    /* Free our current storage */
 2039|  3.09k|    if((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (2039:8): [True: 3.09k, False: 0]
  |  Branch (2039:34): [True: 3.09k, False: 0]
  ------------------
 2040|  3.09k|        uprv_free(baseName);
  ------------------
  |  | 1503|  3.09k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  3.09k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.09k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.09k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|  3.09k|    }
 2042|  3.09k|    baseName = nullptr;
 2043|  3.09k|    if(fullName != fullNameBuffer) {
  ------------------
  |  Branch (2043:8): [True: 2, False: 3.09k]
  ------------------
 2044|      2|        uprv_free(fullName);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2045|      2|        fullName = fullNameBuffer;
 2046|      2|    }
 2047|  3.09k|    *fullNameBuffer = 0;
 2048|  3.09k|    *language = 0;
 2049|  3.09k|    *script = 0;
 2050|  3.09k|    *country = 0;
 2051|  3.09k|    fIsBogus = true;
 2052|  3.09k|    variantBegin = 0;
 2053|  3.09k|}
_ZN6icu_786Locale10getDefaultEv:
 2057|  58.7k|{
 2058|  58.7k|    {
 2059|  58.7k|        Mutex lock(&gDefaultLocaleMutex);
 2060|  58.7k|        if (gDefaultLocale != nullptr) {
  ------------------
  |  Branch (2060:13): [True: 58.7k, False: 1]
  ------------------
 2061|  58.7k|            return *gDefaultLocale;
 2062|  58.7k|        }
 2063|  58.7k|    }
 2064|      1|    UErrorCode status = U_ZERO_ERROR;
 2065|      1|    return *locale_set_default_internal(nullptr, status);
 2066|  58.7k|}
_ZN6icu_786Locale14setFromPOSIXIDEPKc:
 2267|    885|{
 2268|    885|    init(posixID, true);
 2269|    885|}
_ZNK6icu_786Locale15getKeywordValueEPKcPciR10UErrorCode:
 2606|  2.00k|{
 2607|  2.00k|    return uloc_getKeywordValue(fullName, keywordName, buffer, bufLen, &status);
  ------------------
  |  | 1130|  2.00k|#define uloc_getKeywordValue U_ICU_ENTRY_POINT_RENAME(uloc_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  2.00k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.00k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.00k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2608|  2.00k|}
_ZNK6icu_786Locale15getKeywordValueENS_11StringPieceERNS_8ByteSinkER10UErrorCode:
 2611|  3.99k|Locale::getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const {
 2612|  3.99k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2612:9): [True: 0, False: 3.99k]
  ------------------
 2613|      0|        return;
 2614|      0|    }
 2615|       |
 2616|  3.99k|    if (fIsBogus) {
  ------------------
  |  Branch (2616:9): [True: 456, False: 3.53k]
  ------------------
 2617|    456|        status = U_ILLEGAL_ARGUMENT_ERROR;
 2618|    456|        return;
 2619|    456|    }
 2620|       |
 2621|  3.53k|    ulocimp_getKeywordValue(fullName, keywordName, sink, status);
  ------------------
  |  | 1200|  3.53k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  3.53k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.53k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.53k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2622|  3.53k|}
_ZNK6icu_786Locale11getBaseNameEv:
 2748|    201|Locale::getBaseName() const {
 2749|    201|    return baseName;
 2750|    201|}
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|  9.29k|                                          UErrorCode& status) {
 1869|  9.29k|            return ByteSinkUtil::viaByteSinkToTerminatedChars(
 1870|  9.29k|                name, nameCapacity,
 1871|  9.29k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  9.29k|                    if (canonicalize) {
 1873|  9.29k|                        ulocimp_canonicalize(localeID, sink, status);
 1874|  9.29k|                    } else {
 1875|  9.29k|                        ulocimp_getName(localeID, sink, status);
 1876|  9.29k|                    }
 1877|  9.29k|                },
 1878|  9.29k|                status);
 1879|  9.29k|        };
locid.cpp:_ZZZN6icu_786Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS3_11char_traitsIcEEEEPciR10UErrorCodeENKUlRNS_8ByteSinkESA_E_clESC_SA_:
 1871|  9.29k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  9.29k|                    if (canonicalize) {
  ------------------
  |  Branch (1872:25): [True: 885, False: 8.40k]
  ------------------
 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|  8.40k|                    } else {
 1875|  8.40k|                        ulocimp_getName(localeID, sink, status);
  ------------------
  |  | 1204|  8.40k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|  8.40k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.40k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.40k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1876|  8.40k|                    }
 1877|  9.29k|                },
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|}

_ZN6icu_7811defaultLSTME11UScriptCodeR10UErrorCode:
  784|      4|UnicodeString defaultLSTM(UScriptCode script, UErrorCode& status) {
  785|       |    // open root from brkitr tree.
  786|      4|    UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, "", &status);
  ------------------
  |  | 1691|      4|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, "", &status);
  ------------------
  |  |   13|      4|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|      4|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  787|      4|    b = ures_getByKeyWithFallback(b, "lstm", b, &status);
  ------------------
  |  | 1662|      4|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  788|      4|    UnicodeString result = ures_getUnicodeStringByKey(b, uscript_getShortName(script), &status);
  ------------------
  |  | 1708|      4|#define uscript_getShortName U_ICU_ENTRY_POINT_RENAME(uscript_getShortName)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  789|      4|    ures_close(b);
  ------------------
  |  | 1652|      4|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  790|      4|    return result;
  791|      4|}
CreateLSTMDataForScript_78:
  794|  40.5k|{
  795|  40.5k|    if (script != USCRIPT_KHMER && script != USCRIPT_LAO && script != USCRIPT_MYANMAR && script != USCRIPT_THAI) {
  ------------------
  |  Branch (795:9): [True: 40.5k, False: 1]
  |  Branch (795:36): [True: 40.5k, False: 1]
  |  Branch (795:61): [True: 40.5k, False: 1]
  |  Branch (795:90): [True: 40.5k, False: 1]
  ------------------
  796|  40.5k|        return nullptr;
  797|  40.5k|    }
  798|      4|    UnicodeString name = defaultLSTM(script, status);
  799|      4|    if (U_FAILURE(status)) return nullptr;
  ------------------
  |  Branch (799:9): [True: 2, False: 2]
  ------------------
  800|      2|    CharString namebuf;
  801|      2|    namebuf.appendInvariantChars(name, status).truncate(namebuf.lastIndexOf('.'));
  802|       |
  803|      2|    LocalUResourceBundlePointer rb(
  804|      2|        ures_openDirect(U_ICUDATA_BRKITR, namebuf.data(), &status));
  ------------------
  |  | 1693|      2|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      ures_openDirect(U_ICUDATA_BRKITR, namebuf.data(), &status));
  ------------------
  |  |   13|      2|#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
  |  |  ------------------
  |  |  |  |  154|      2|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  805|      2|    if (U_FAILURE(status)) return nullptr;
  ------------------
  |  Branch (805:9): [True: 2, False: 0]
  ------------------
  806|       |
  807|      0|    return CreateLSTMData(rb.orphan(), status);
  ------------------
  |  |   62|      0|#define CreateLSTMData U_ICU_ENTRY_POINT_RENAME(CreateLSTMData)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|      2|}

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

_ZN6icu_7819Normalizer2WithImplC2ERKNS_15Normalizer2ImplE:
   34|      4|    Normalizer2WithImpl(const Normalizer2Impl &ni) : impl(ni) {}
_ZNK6icu_7819Normalizer2WithImpl9normalizeERKNS_13UnicodeStringERS1_R10UErrorCode:
   41|  23.1M|              UErrorCode &errorCode) const override {
   42|  23.1M|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (42:12): [True: 0, False: 23.1M]
  ------------------
   43|      0|            dest.setToBogus();
   44|      0|            return dest;
   45|      0|        }
   46|  23.1M|        const char16_t *sArray=src.getBuffer();
   47|  23.1M|        if(&dest==&src || sArray==nullptr) {
  ------------------
  |  Branch (47:12): [True: 0, False: 23.1M]
  |  Branch (47:27): [True: 0, False: 23.1M]
  ------------------
   48|      0|            errorCode=U_ILLEGAL_ARGUMENT_ERROR;
   49|      0|            dest.setToBogus();
   50|      0|            return dest;
   51|      0|        }
   52|  23.1M|        dest.remove();
   53|  23.1M|        ReorderingBuffer buffer(impl, dest);
   54|  23.1M|        if(buffer.init(src.length(), errorCode)) {
  ------------------
  |  Branch (54:12): [True: 23.1M, False: 0]
  ------------------
   55|  23.1M|            normalize(sArray, sArray+src.length(), buffer, errorCode);
   56|  23.1M|        }
   57|  23.1M|        return dest;
   58|  23.1M|    }
_ZN6icu_7820DecomposeNormalizer2C2ERKNS_15Normalizer2ImplE:
  191|      1|    DecomposeNormalizer2(const Normalizer2Impl &ni) : Normalizer2WithImpl(ni) {}
_ZN6icu_7818ComposeNormalizer2C2ERKNS_15Normalizer2ImplEa:
  253|      2|        Normalizer2WithImpl(ni), onlyContiguous(fcc) {}
_ZNK6icu_7818ComposeNormalizer29normalizeEPKDsS2_RNS_16ReorderingBufferER10UErrorCode:
  259|  23.1M|              ReorderingBuffer &buffer, UErrorCode &errorCode) const override {
  260|  23.1M|        impl.compose(src, limit, onlyContiguous, true, buffer, errorCode);
  261|  23.1M|    }
_ZNK6icu_7818ComposeNormalizer212isNormalizedERKNS_13UnicodeStringER10UErrorCode:
  287|  2.19M|    isNormalized(const UnicodeString &s, UErrorCode &errorCode) const override {
  288|  2.19M|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (288:12): [True: 0, False: 2.19M]
  ------------------
  289|      0|            return false;
  290|      0|        }
  291|  2.19M|        const char16_t *sArray=s.getBuffer();
  292|  2.19M|        if(sArray==nullptr) {
  ------------------
  |  Branch (292:12): [True: 0, False: 2.19M]
  ------------------
  293|      0|            errorCode=U_ILLEGAL_ARGUMENT_ERROR;
  294|      0|            return false;
  295|      0|        }
  296|  2.19M|        UnicodeString temp;
  297|  2.19M|        ReorderingBuffer buffer(impl, temp);
  298|  2.19M|        if(!buffer.init(5, errorCode)) {  // small destCapacity for substring normalization
  ------------------
  |  Branch (298:12): [True: 0, False: 2.19M]
  ------------------
  299|      0|            return false;
  300|      0|        }
  301|  2.19M|        return impl.compose(sArray, sArray+s.length(), onlyContiguous, false, buffer, errorCode);
  302|  2.19M|    }
_ZNK6icu_7818ComposeNormalizer217hasBoundaryBeforeEi:
  333|  26.8M|    virtual UBool hasBoundaryBefore(UChar32 c) const override {
  334|  26.8M|        return impl.hasCompBoundaryBefore(c);
  335|  26.8M|    }
_ZN6icu_7814FCDNormalizer2C2ERKNS_15Normalizer2ImplE:
  348|      1|    FCDNormalizer2(const Normalizer2Impl &ni) : Normalizer2WithImpl(ni) {}
_ZN6icu_7813Norm2AllModesC2EPNS_15Normalizer2ImplE:
  382|      1|            : impl(i), comp(*i, false), decomp(*i), fcd(*i), fcc(*i, true) {}

_ZN6icu_7813Norm2AllModes14createInstanceEPNS_15Normalizer2ImplER10UErrorCode:
  216|      1|Norm2AllModes::createInstance(Normalizer2Impl *impl, UErrorCode &errorCode) {
  217|      1|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (217:8): [True: 0, False: 1]
  ------------------
  218|      0|        delete impl;
  219|      0|        return nullptr;
  220|      0|    }
  221|      1|    Norm2AllModes *allModes=new Norm2AllModes(impl);
  222|      1|    if(allModes==nullptr) {
  ------------------
  |  Branch (222:8): [True: 0, False: 1]
  ------------------
  223|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  224|      0|        delete impl;
  225|      0|        return nullptr;
  226|      0|    }
  227|      1|    return allModes;
  228|      1|}

_ZN6icu_7816ReorderingBuffer4initEiR10UErrorCode:
  182|  25.3M|UBool ReorderingBuffer::init(int32_t destCapacity, UErrorCode &errorCode) {
  183|  25.3M|    int32_t length=str.length();
  184|  25.3M|    start=str.getBuffer(destCapacity);
  185|  25.3M|    if(start==nullptr) {
  ------------------
  |  Branch (185:8): [True: 0, False: 25.3M]
  ------------------
  186|       |        // getBuffer() already did str.setToBogus()
  187|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  188|      0|        return false;
  189|      0|    }
  190|  25.3M|    limit=start+length;
  191|  25.3M|    remainingCapacity=str.getCapacity()-length;
  192|  25.3M|    reorderStart=start;
  193|  25.3M|    if(start==limit) {
  ------------------
  |  Branch (193:8): [True: 25.3M, False: 0]
  ------------------
  194|  25.3M|        lastCC=0;
  195|  25.3M|    } else {
  196|      0|        setIterator();
  197|      0|        lastCC=previousCC();
  198|       |        // Set reorderStart after the last code point with cc<=1 if there is one.
  199|      0|        if(lastCC>1) {
  ------------------
  |  Branch (199:12): [True: 0, False: 0]
  ------------------
  200|      0|            while(previousCC()>1) {}
  ------------------
  |  Branch (200:19): [True: 0, False: 0]
  ------------------
  201|      0|        }
  202|      0|        reorderStart=codePointLimit;
  203|      0|    }
  204|  25.3M|    return true;
  205|  25.3M|}
_ZNK6icu_7816ReorderingBuffer6equalsEPKDsS2_:
  207|  1.78k|UBool ReorderingBuffer::equals(const char16_t *otherStart, const char16_t *otherLimit) const {
  208|  1.78k|    int32_t length = static_cast<int32_t>(limit - start);
  209|  1.78k|    return
  210|  1.78k|        length == static_cast<int32_t>(otherLimit - otherStart) &&
  ------------------
  |  Branch (210:9): [True: 1.51k, False: 276]
  ------------------
  211|  1.78k|        0==u_memcmp(start, otherStart, length);
  ------------------
  |  |  332|  1.51k|#define u_memcmp U_ICU_ENTRY_POINT_RENAME(u_memcmp)
  |  |  ------------------
  |  |  |  |  123|  1.51k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.51k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.51k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (211:9): [True: 0, False: 1.51k]
  ------------------
  212|  1.78k|}
_ZN6icu_7816ReorderingBuffer19appendSupplementaryEihR10UErrorCode:
  240|   118k|UBool ReorderingBuffer::appendSupplementary(UChar32 c, uint8_t cc, UErrorCode &errorCode) {
  241|   118k|    if(remainingCapacity<2 && !resize(2, errorCode)) {
  ------------------
  |  Branch (241:8): [True: 2.70k, False: 115k]
  |  Branch (241:31): [True: 0, False: 2.70k]
  ------------------
  242|      0|        return false;
  243|      0|    }
  244|   118k|    if(lastCC<=cc || cc==0) {
  ------------------
  |  Branch (244:8): [True: 43.2k, False: 75.2k]
  |  Branch (244:22): [True: 0, False: 75.2k]
  ------------------
  245|  43.2k|        limit[0]=U16_LEAD(c);
  ------------------
  |  |  123|  43.2k|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  246|  43.2k|        limit[1]=U16_TRAIL(c);
  ------------------
  |  |  132|  43.2k|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  247|  43.2k|        limit+=2;
  248|  43.2k|        lastCC=cc;
  249|  43.2k|        if(cc<=1) {
  ------------------
  |  Branch (249:12): [True: 0, False: 43.2k]
  ------------------
  250|      0|            reorderStart=limit;
  251|      0|        }
  252|  75.2k|    } else {
  253|  75.2k|        insert(c, cc);
  254|  75.2k|    }
  255|   118k|    remainingCapacity-=2;
  256|   118k|    return true;
  257|   118k|}
_ZN6icu_7816ReorderingBuffer6appendEPKDsiahhR10UErrorCode:
  261|  8.49M|                               UErrorCode &errorCode) {
  262|  8.49M|    if(length==0) {
  ------------------
  |  Branch (262:8): [True: 0, False: 8.49M]
  ------------------
  263|      0|        return true;
  264|      0|    }
  265|  8.49M|    if(remainingCapacity<length && !resize(length, errorCode)) {
  ------------------
  |  Branch (265:8): [True: 7.05k, False: 8.48M]
  |  Branch (265:36): [True: 0, False: 7.05k]
  ------------------
  266|      0|        return false;
  267|      0|    }
  268|  8.49M|    remainingCapacity-=length;
  269|  8.49M|    if(lastCC<=leadCC || leadCC==0) {
  ------------------
  |  Branch (269:8): [True: 8.49M, False: 0]
  |  Branch (269:26): [True: 0, False: 0]
  ------------------
  270|  8.49M|        if(trailCC<=1) {
  ------------------
  |  Branch (270:12): [True: 4.48M, False: 4.00M]
  ------------------
  271|  4.48M|            reorderStart=limit+length;
  272|  4.48M|        } else if(leadCC<=1) {
  ------------------
  |  Branch (272:19): [True: 15.1k, False: 3.99M]
  ------------------
  273|  15.1k|            reorderStart=limit+1;  // Ok if not a code point boundary.
  274|  15.1k|        }
  275|  8.49M|        const char16_t *sLimit=s+length;
  276|  30.7M|        do { *limit++=*s++; } while(s!=sLimit);
  ------------------
  |  Branch (276:37): [True: 22.2M, False: 8.49M]
  ------------------
  277|  8.49M|        lastCC=trailCC;
  278|  8.49M|    } else {
  279|      0|        int32_t i=0;
  280|      0|        UChar32 c;
  281|      0|        U16_NEXT(s, i, length, c);
  ------------------
  |  |  309|      0|#define U16_NEXT(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  310|      0|    (c)=(s)[(i)++]; \
  |  |  311|      0|    if(U16_IS_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  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|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  282|      0|        insert(c, leadCC);  // insert first code point
  283|      0|        while(i<length) {
  ------------------
  |  Branch (283:15): [True: 0, False: 0]
  ------------------
  284|      0|            U16_NEXT(s, i, length, c);
  ------------------
  |  |  309|      0|#define U16_NEXT(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  310|      0|    (c)=(s)[(i)++]; \
  |  |  311|      0|    if(U16_IS_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  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|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  285|      0|            if(i<length) {
  ------------------
  |  Branch (285:16): [True: 0, False: 0]
  ------------------
  286|      0|                if (isNFD) {
  ------------------
  |  Branch (286:21): [True: 0, False: 0]
  ------------------
  287|      0|                    leadCC = Normalizer2Impl::getCCFromYesOrMaybeYes(impl.getRawNorm16(c));
  288|      0|                } else {
  289|      0|                    leadCC = impl.getCC(impl.getNorm16(c));
  290|      0|                }
  291|      0|            } else {
  292|      0|                leadCC=trailCC;
  293|      0|            }
  294|      0|            append(c, leadCC, errorCode);
  295|      0|        }
  296|      0|    }
  297|  8.49M|    return true;
  298|  8.49M|}
_ZN6icu_7816ReorderingBuffer12appendZeroCCEPKDsS2_R10UErrorCode:
  318|  18.6M|UBool ReorderingBuffer::appendZeroCC(const char16_t *s, const char16_t *sLimit, UErrorCode &errorCode) {
  319|  18.6M|    if(s==sLimit) {
  ------------------
  |  Branch (319:8): [True: 0, False: 18.6M]
  ------------------
  320|      0|        return true;
  321|      0|    }
  322|  18.6M|    int32_t length = static_cast<int32_t>(sLimit - s);
  323|  18.6M|    if(remainingCapacity<length && !resize(length, errorCode)) {
  ------------------
  |  Branch (323:8): [True: 1.06k, False: 18.6M]
  |  Branch (323:36): [True: 0, False: 1.06k]
  ------------------
  324|      0|        return false;
  325|      0|    }
  326|  18.6M|    u_memcpy(limit, s, length);
  ------------------
  |  |  334|  18.6M|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|  18.6M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  18.6M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  18.6M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|  18.6M|    limit+=length;
  328|  18.6M|    remainingCapacity-=length;
  329|  18.6M|    lastCC=0;
  330|  18.6M|    reorderStart=limit;
  331|  18.6M|    return true;
  332|  18.6M|}
_ZN6icu_7816ReorderingBuffer6resizeEiR10UErrorCode:
  352|  10.8k|UBool ReorderingBuffer::resize(int32_t appendLength, UErrorCode &errorCode) {
  353|  10.8k|    int32_t reorderStartIndex = static_cast<int32_t>(reorderStart - start);
  354|  10.8k|    int32_t length = static_cast<int32_t>(limit - start);
  355|  10.8k|    str.releaseBuffer(length);
  356|  10.8k|    int32_t newCapacity=length+appendLength;
  357|  10.8k|    int32_t doubleCapacity=2*str.getCapacity();
  358|  10.8k|    if(newCapacity<doubleCapacity) {
  ------------------
  |  Branch (358:8): [True: 10.8k, False: 0]
  ------------------
  359|  10.8k|        newCapacity=doubleCapacity;
  360|  10.8k|    }
  361|  10.8k|    if(newCapacity<256) {
  ------------------
  |  Branch (361:8): [True: 8.08k, False: 2.73k]
  ------------------
  362|  8.08k|        newCapacity=256;
  363|  8.08k|    }
  364|  10.8k|    start=str.getBuffer(newCapacity);
  365|  10.8k|    if(start==nullptr) {
  ------------------
  |  Branch (365:8): [True: 0, False: 10.8k]
  ------------------
  366|       |        // getBuffer() already did str.setToBogus()
  367|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  368|      0|        return false;
  369|      0|    }
  370|  10.8k|    reorderStart=start+reorderStartIndex;
  371|  10.8k|    limit=start+length;
  372|  10.8k|    remainingCapacity=str.getCapacity()-length;
  373|  10.8k|    return true;
  374|  10.8k|}
_ZN6icu_7816ReorderingBuffer12skipPreviousEv:
  376|  75.2k|void ReorderingBuffer::skipPrevious() {
  377|  75.2k|    codePointLimit=codePointStart;
  378|  75.2k|    char16_t c=*--codePointStart;
  379|  75.2k|    if(U16_IS_TRAIL(c) && start<codePointStart && U16_IS_LEAD(*(codePointStart-1))) {
  ------------------
  |  |   67|   150k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 75.2k]
  |  |  ------------------
  ------------------
                  if(U16_IS_TRAIL(c) && start<codePointStart && U16_IS_LEAD(*(codePointStart-1))) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (379:27): [True: 0, False: 0]
  ------------------
  380|      0|        --codePointStart;
  381|      0|    }
  382|  75.2k|}
_ZN6icu_7816ReorderingBuffer10previousCCEv:
  384|  75.2k|uint8_t ReorderingBuffer::previousCC() {
  385|  75.2k|    codePointLimit=codePointStart;
  386|  75.2k|    if(reorderStart>=codePointStart) {
  ------------------
  |  Branch (386:8): [True: 0, False: 75.2k]
  ------------------
  387|      0|        return 0;
  388|      0|    }
  389|  75.2k|    UChar32 c=*--codePointStart;
  390|  75.2k|    char16_t c2;
  391|  75.2k|    if(U16_IS_TRAIL(c) && start<codePointStart && U16_IS_LEAD(c2=*(codePointStart-1))) {
  ------------------
  |  |   67|   150k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 73.5k, False: 1.73k]
  |  |  ------------------
  ------------------
                  if(U16_IS_TRAIL(c) && start<codePointStart && U16_IS_LEAD(c2=*(codePointStart-1))) {
  ------------------
  |  |   59|  73.5k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 73.5k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (391:27): [True: 73.5k, False: 0]
  ------------------
  392|  73.5k|        --codePointStart;
  393|  73.5k|        c=U16_GET_SUPPLEMENTARY(c2, c);
  ------------------
  |  |  113|  73.5k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|  73.5k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  394|  73.5k|    }
  395|  75.2k|    return impl.getCCFromYesOrMaybeYesCP(c);
  396|  75.2k|}
_ZN6icu_7816ReorderingBuffer6insertEih:
  400|  75.2k|void ReorderingBuffer::insert(UChar32 c, uint8_t cc) {
  401|  75.2k|    for(setIterator(), skipPrevious(); previousCC()>cc;) {}
  ------------------
  |  Branch (401:40): [True: 0, False: 75.2k]
  ------------------
  402|       |    // insert c at codePointLimit, after the character with prevCC<=cc
  403|  75.2k|    char16_t *q=limit;
  404|  75.2k|    char16_t *r=limit+=U16_LENGTH(c);
  ------------------
  |  |  141|  75.2k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 0, False: 75.2k]
  |  |  ------------------
  ------------------
  405|  75.2k|    do {
  406|  75.2k|        *--r=*--q;
  407|  75.2k|    } while(codePointLimit!=q);
  ------------------
  |  Branch (407:13): [True: 0, False: 75.2k]
  ------------------
  408|  75.2k|    writeCodePoint(q, c);
  409|  75.2k|    if(cc<=1) {
  ------------------
  |  Branch (409:8): [True: 0, False: 75.2k]
  ------------------
  410|      0|        reorderStart=r;
  411|      0|    }
  412|  75.2k|}
_ZN6icu_7815Normalizer2Impl4initEPKiPK7UCPTriePKtPKh:
  431|      1|                      const uint16_t *inExtraData, const uint8_t *inSmallFCD) {
  432|      1|    minDecompNoCP = static_cast<char16_t>(inIndexes[IX_MIN_DECOMP_NO_CP]);
  433|      1|    minCompNoMaybeCP = static_cast<char16_t>(inIndexes[IX_MIN_COMP_NO_MAYBE_CP]);
  434|      1|    minLcccCP = static_cast<char16_t>(inIndexes[IX_MIN_LCCC_CP]);
  435|       |
  436|      1|    minYesNo = static_cast<uint16_t>(inIndexes[IX_MIN_YES_NO]);
  437|      1|    minYesNoMappingsOnly = static_cast<uint16_t>(inIndexes[IX_MIN_YES_NO_MAPPINGS_ONLY]);
  438|      1|    minNoNo = static_cast<uint16_t>(inIndexes[IX_MIN_NO_NO]);
  439|      1|    minNoNoCompBoundaryBefore = static_cast<uint16_t>(inIndexes[IX_MIN_NO_NO_COMP_BOUNDARY_BEFORE]);
  440|      1|    minNoNoCompNoMaybeCC = static_cast<uint16_t>(inIndexes[IX_MIN_NO_NO_COMP_NO_MAYBE_CC]);
  441|      1|    minNoNoEmpty = static_cast<uint16_t>(inIndexes[IX_MIN_NO_NO_EMPTY]);
  442|      1|    limitNoNo = static_cast<uint16_t>(inIndexes[IX_LIMIT_NO_NO]);
  443|      1|    minMaybeNo = static_cast<uint16_t>(inIndexes[IX_MIN_MAYBE_NO]);
  444|      1|    minMaybeNoCombinesFwd = static_cast<uint16_t>(inIndexes[IX_MIN_MAYBE_NO_COMBINES_FWD]);
  445|      1|    minMaybeYes = static_cast<uint16_t>(inIndexes[IX_MIN_MAYBE_YES]);
  446|      1|    U_ASSERT((minMaybeNo & 7) == 0);  // 8-aligned for noNoDelta bit fields
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  447|      1|    centerNoNoDelta = (minMaybeNo >> DELTA_SHIFT) - MAX_DELTA - 1;
  448|       |
  449|      1|    normTrie=inTrie;
  450|      1|    extraData=inExtraData;
  451|      1|    smallFCD=inSmallFCD;
  452|      1|}
_ZNK6icu_7815Normalizer2Impl14decomposeShortEPKDsS2_aaRNS_16ReorderingBufferER10UErrorCode:
  674|  9.03M|                                ReorderingBuffer &buffer, UErrorCode &errorCode) const {
  675|  9.03M|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (675:9): [True: 0, False: 9.03M]
  ------------------
  676|      0|        return nullptr;
  677|      0|    }
  678|  17.6M|    while(src<limit) {
  ------------------
  |  Branch (678:11): [True: 8.61M, False: 9.03M]
  ------------------
  679|  8.61M|        if (stopAtCompBoundary && *src < minCompNoMaybeCP) {
  ------------------
  |  Branch (679:13): [True: 4.08M, False: 4.52M]
  |  Branch (679:35): [True: 0, False: 4.08M]
  ------------------
  680|      0|            return src;
  681|      0|        }
  682|  8.61M|        const char16_t *prevSrc = src;
  683|  8.61M|        UChar32 c;
  684|  8.61M|        uint16_t norm16;
  685|  8.61M|        UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, src, limit, c, norm16);
  ------------------
  |  |  386|  8.61M|#define UCPTRIE_FAST_U16_NEXT(trie, dataAccess, src, limit, c, result) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  8.61M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  387|  8.61M|    (c) = *(src)++; \
  |  |  388|  8.61M|    int32_t __index; \
  |  |  389|  8.61M|    if (!U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|  8.61M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  8.61M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (389:9): [True: 8.49M, False: 118k]
  |  |  ------------------
  |  |  390|  8.49M|        __index = _UCPTRIE_FAST_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  602|  8.49M|    ((int32_t)(trie)->index[(c) >> UCPTRIE_FAST_SHIFT] + ((c) & UCPTRIE_FAST_DATA_MASK))
  |  |  ------------------
  |  |  391|  8.49M|    } else { \
  |  |  392|   118k|        uint16_t __c2; \
  |  |  393|   118k|        if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   84|   236k|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 118k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                       if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   67|   118k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 118k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (393:41): [True: 118k, False: 0]
  |  |  ------------------
  |  |  394|   118k|            ++(src); \
  |  |  395|   118k|            (c) = U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|   118k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|   118k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  396|   118k|            __index = _UCPTRIE_SMALL_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  606|   118k|    ((c) >= (trie)->highStart ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (606:6): [True: 0, False: 118k]
  |  |  |  |  ------------------
  |  |  |  |  607|   118k|        (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
  |  |  |  |  608|   118k|        ucptrie_internalSmallIndex(trie, c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  810|   118k|#define ucptrie_internalSmallIndex U_ICU_ENTRY_POINT_RENAME(ucptrie_internalSmallIndex)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  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
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  397|   118k|        } else { \
  |  |  398|      0|            __index = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; \
  |  |  399|      0|        } \
  |  |  400|   118k|    } \
  |  |  401|  8.61M|    (result) = dataAccess(trie, __index); \
  |  |  ------------------
  |  |  |  |  685|  8.61M|        UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, src, limit, c, norm16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|  8.61M|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  402|  8.61M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  8.61M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  686|  8.61M|        if (stopAtCompBoundary && norm16HasCompBoundaryBefore(norm16)) {
  ------------------
  |  Branch (686:13): [True: 4.08M, False: 4.52M]
  |  Branch (686:35): [True: 0, False: 4.08M]
  ------------------
  687|      0|            return prevSrc;
  688|      0|        }
  689|  8.61M|        if(!decompose(c, norm16, buffer, errorCode)) {
  ------------------
  |  Branch (689:12): [True: 0, False: 8.61M]
  ------------------
  690|      0|            return nullptr;
  691|      0|        }
  692|  8.61M|        if (stopAtCompBoundary && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) {
  ------------------
  |  Branch (692:13): [True: 4.08M, False: 4.52M]
  |  Branch (692:35): [True: 0, False: 4.08M]
  ------------------
  693|      0|            return src;
  694|      0|        }
  695|  8.61M|    }
  696|  9.03M|    return src;
  697|  9.03M|}
_ZNK6icu_7815Normalizer2Impl9decomposeEitRNS_16ReorderingBufferER10UErrorCode:
  701|  8.61M|                                 UErrorCode &errorCode) const {
  702|       |    // get the decomposition and the lead and trail cc's
  703|  8.61M|    if (norm16 >= limitNoNo) {
  ------------------
  |  Branch (703:9): [True: 118k, False: 8.49M]
  ------------------
  704|   118k|        if (isMaybeYesOrNonZeroCC(norm16)) {
  ------------------
  |  Branch (704:13): [True: 118k, False: 0]
  ------------------
  705|   118k|            return buffer.append(c, getCCFromYesOrMaybeYes(norm16), errorCode);
  706|   118k|        } else if (norm16 < minMaybeNo) {
  ------------------
  |  Branch (706:20): [True: 0, False: 0]
  ------------------
  707|       |            // Maps to an isCompYesAndZeroCC.
  708|      0|            c=mapAlgorithmic(c, norm16);
  709|      0|            norm16=getRawNorm16(c);
  710|      0|        }
  711|   118k|    }
  712|  8.49M|    if (norm16 < minYesNo) {
  ------------------
  |  Branch (712:9): [True: 801, False: 8.49M]
  ------------------
  713|       |        // c does not decompose
  714|    801|        return buffer.append(c, 0, errorCode);
  715|  8.49M|    } else if(isHangulLV(norm16) || isHangulLVT(norm16)) {
  ------------------
  |  Branch (715:15): [True: 0, False: 8.49M]
  |  Branch (715:37): [True: 0, False: 8.49M]
  ------------------
  716|       |        // Hangul syllable: decompose algorithmically
  717|      0|        char16_t jamos[3];
  718|      0|        return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode);
  719|      0|    }
  720|       |    // c decomposes, get everything from the variable-length extra data
  721|  8.49M|    const uint16_t *mapping=getData(norm16);
  722|  8.49M|    uint16_t firstUnit=*mapping;
  723|  8.49M|    int32_t length=firstUnit&MAPPING_LENGTH_MASK;
  724|  8.49M|    uint8_t leadCC, trailCC;
  725|  8.49M|    trailCC = static_cast<uint8_t>(firstUnit >> 8);
  726|  8.49M|    if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) {
  ------------------
  |  Branch (726:8): [True: 3.99M, False: 4.50M]
  ------------------
  727|  3.99M|        leadCC = static_cast<uint8_t>(*(mapping - 1) >> 8);
  728|  4.50M|    } else {
  729|  4.50M|        leadCC=0;
  730|  4.50M|    }
  731|  8.49M|    return buffer.append(reinterpret_cast<const char16_t*>(mapping) + 1, length, true, leadCC, trailCC, errorCode);
  732|  8.49M|}
_ZN6icu_7815Normalizer2Impl7combineEPKti:
 1140|  4.51M|int32_t Normalizer2Impl::combine(const uint16_t *list, UChar32 trail) {
 1141|  4.51M|    uint16_t key1, firstUnit;
 1142|  4.51M|    if(trail<COMP_1_TRAIL_LIMIT) {
  ------------------
  |  Branch (1142:8): [True: 4.51M, False: 0]
  ------------------
 1143|       |        // trail character is 0..33FF
 1144|       |        // result entry may have 2 or 3 units
 1145|  4.51M|        key1 = static_cast<uint16_t>(trail << 1);
 1146|  4.54M|        while(key1>(firstUnit=*list)) {
  ------------------
  |  Branch (1146:15): [True: 28.8k, False: 4.51M]
  ------------------
 1147|  28.8k|            list+=2+(firstUnit&COMP_1_TRIPLE);
 1148|  28.8k|        }
 1149|  4.51M|        if(key1==(firstUnit&COMP_1_TRAIL_MASK)) {
  ------------------
  |  Branch (1149:12): [True: 4.51M, False: 2.08k]
  ------------------
 1150|  4.51M|            if(firstUnit&COMP_1_TRIPLE) {
  ------------------
  |  Branch (1150:16): [True: 0, False: 4.51M]
  ------------------
 1151|      0|                return (static_cast<int32_t>(list[1]) << 16) | list[2];
 1152|  4.51M|            } else {
 1153|  4.51M|                return list[1];
 1154|  4.51M|            }
 1155|  4.51M|        }
 1156|  4.51M|    } else {
 1157|       |        // trail character is 3400..10FFFF
 1158|       |        // result entry has 3 units
 1159|      0|        key1 = static_cast<uint16_t>(COMP_1_TRAIL_LIMIT +
 1160|      0|                        (((trail>>COMP_1_TRAIL_SHIFT))&
 1161|      0|                          ~COMP_1_TRIPLE));
 1162|      0|        uint16_t key2 = static_cast<uint16_t>(trail << COMP_2_TRAIL_SHIFT);
 1163|      0|        uint16_t secondUnit;
 1164|      0|        for(;;) {
 1165|      0|            if(key1>(firstUnit=*list)) {
  ------------------
  |  Branch (1165:16): [True: 0, False: 0]
  ------------------
 1166|      0|                list+=2+(firstUnit&COMP_1_TRIPLE);
 1167|      0|            } else if(key1==(firstUnit&COMP_1_TRAIL_MASK)) {
  ------------------
  |  Branch (1167:23): [True: 0, False: 0]
  ------------------
 1168|      0|                if(key2>(secondUnit=list[1])) {
  ------------------
  |  Branch (1168:20): [True: 0, False: 0]
  ------------------
 1169|      0|                    if(firstUnit&COMP_1_LAST_TUPLE) {
  ------------------
  |  Branch (1169:24): [True: 0, False: 0]
  ------------------
 1170|      0|                        break;
 1171|      0|                    } else {
 1172|      0|                        list+=3;
 1173|      0|                    }
 1174|      0|                } else if(key2==(secondUnit&COMP_2_TRAIL_MASK)) {
  ------------------
  |  Branch (1174:27): [True: 0, False: 0]
  ------------------
 1175|      0|                    return (static_cast<int32_t>(secondUnit & ~COMP_2_TRAIL_MASK) << 16) | list[2];
 1176|      0|                } else {
 1177|      0|                    break;
 1178|      0|                }
 1179|      0|            } else {
 1180|      0|                break;
 1181|      0|            }
 1182|      0|        }
 1183|      0|    }
 1184|  2.08k|    return -1;
 1185|  4.51M|}
_ZNK6icu_7815Normalizer2Impl9recomposeERNS_16ReorderingBufferEia:
 1222|  4.51M|                                UBool onlyContiguous) const {
 1223|  4.51M|    char16_t *p=buffer.getStart()+recomposeStartIndex;
 1224|  4.51M|    char16_t *limit=buffer.getLimit();
 1225|  4.51M|    if(p==limit) {
  ------------------
  |  Branch (1225:8): [True: 0, False: 4.51M]
  ------------------
 1226|      0|        return;
 1227|      0|    }
 1228|       |
 1229|  4.51M|    char16_t *starter, *pRemove, *q, *r;
 1230|  4.51M|    const uint16_t *compositionsList;
 1231|  4.51M|    UChar32 c, compositeAndFwd;
 1232|  4.51M|    uint16_t norm16;
 1233|  4.51M|    uint8_t cc, prevCC;
 1234|  4.51M|    UBool starterIsSupplementary;
 1235|       |
 1236|       |    // Some of the following variables are not used until we have a forward-combining starter
 1237|       |    // and are only initialized now to avoid compiler warnings.
 1238|  4.51M|    compositionsList=nullptr;  // used as indicator for whether we have a forward-combining starter
 1239|  4.51M|    starter=nullptr;
 1240|  4.51M|    starterIsSupplementary=false;
 1241|  4.51M|    prevCC=0;
 1242|       |
 1243|  30.8M|    for(;;) {
 1244|  30.8M|        UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, p, limit, c, norm16);
  ------------------
  |  |  386|  30.8M|#define UCPTRIE_FAST_U16_NEXT(trie, dataAccess, src, limit, c, result) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  30.8M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  387|  30.8M|    (c) = *(src)++; \
  |  |  388|  30.8M|    int32_t __index; \
  |  |  389|  30.8M|    if (!U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|  30.8M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  30.8M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (389:9): [True: 30.7M, False: 118k]
  |  |  ------------------
  |  |  390|  30.7M|        __index = _UCPTRIE_FAST_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  602|  30.7M|    ((int32_t)(trie)->index[(c) >> UCPTRIE_FAST_SHIFT] + ((c) & UCPTRIE_FAST_DATA_MASK))
  |  |  ------------------
  |  |  391|  30.7M|    } else { \
  |  |  392|   118k|        uint16_t __c2; \
  |  |  393|   118k|        if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   84|   236k|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 118k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                       if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   67|   118k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 118k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (393:41): [True: 118k, False: 0]
  |  |  ------------------
  |  |  394|   118k|            ++(src); \
  |  |  395|   118k|            (c) = U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|   118k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|   118k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  396|   118k|            __index = _UCPTRIE_SMALL_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  606|   118k|    ((c) >= (trie)->highStart ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (606:6): [True: 0, False: 118k]
  |  |  |  |  ------------------
  |  |  |  |  607|   118k|        (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
  |  |  |  |  608|   118k|        ucptrie_internalSmallIndex(trie, c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  810|   118k|#define ucptrie_internalSmallIndex U_ICU_ENTRY_POINT_RENAME(ucptrie_internalSmallIndex)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  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
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  397|   118k|        } else { \
  |  |  398|      0|            __index = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; \
  |  |  399|      0|        } \
  |  |  400|   118k|    } \
  |  |  401|  30.8M|    (result) = dataAccess(trie, __index); \
  |  |  ------------------
  |  |  |  | 1244|  30.8M|        UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, p, limit, c, norm16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|  30.8M|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  402|  30.8M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  30.8M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1245|  30.8M|        cc=getCCFromYesOrMaybeYes(norm16);
 1246|  30.8M|        if( // this character combines backward and
 1247|  30.8M|            isMaybe(norm16) &&
  ------------------
  |  Branch (1247:13): [True: 8.49M, False: 22.3M]
  ------------------
 1248|       |            // we have seen a starter that combines forward and
 1249|  30.8M|            compositionsList!=nullptr &&
  ------------------
  |  Branch (1249:13): [True: 4.51M, False: 3.97M]
  ------------------
 1250|       |            // the backward-combining character is not blocked
 1251|  30.8M|            (prevCC<cc || prevCC==0)
  ------------------
  |  Branch (1251:14): [True: 4.51M, False: 403]
  |  Branch (1251:27): [True: 0, False: 403]
  ------------------
 1252|  30.8M|        ) {
 1253|  4.51M|            if(isJamoVT(norm16)) {
  ------------------
  |  Branch (1253:16): [True: 0, False: 4.51M]
  ------------------
 1254|       |                // c is a Jamo V/T, see if we can compose it with the previous character.
 1255|      0|                if(c<Hangul::JAMO_T_BASE) {
  ------------------
  |  Branch (1255:20): [True: 0, False: 0]
  ------------------
 1256|       |                    // c is a Jamo Vowel, compose with previous Jamo L and following Jamo T.
 1257|      0|                    char16_t prev = static_cast<char16_t>(*starter - Hangul::JAMO_L_BASE);
 1258|      0|                    if(prev<Hangul::JAMO_L_COUNT) {
  ------------------
  |  Branch (1258:24): [True: 0, False: 0]
  ------------------
 1259|      0|                        pRemove=p-1;
 1260|      0|                        char16_t syllable = static_cast<char16_t>(
 1261|      0|                            Hangul::HANGUL_BASE +
 1262|      0|                             (prev*Hangul::JAMO_V_COUNT+(c-Hangul::JAMO_V_BASE))*
 1263|      0|                             Hangul::JAMO_T_COUNT);
 1264|      0|                        char16_t t;
 1265|      0|                        if (p != limit && (t = static_cast<char16_t>(*p - Hangul::JAMO_T_BASE)) < Hangul::JAMO_T_COUNT) {
  ------------------
  |  Branch (1265:29): [True: 0, False: 0]
  |  Branch (1265:43): [True: 0, False: 0]
  ------------------
 1266|      0|                            ++p;
 1267|      0|                            syllable+=t;  // The next character was a Jamo T.
 1268|      0|                        }
 1269|      0|                        *starter=syllable;
 1270|       |                        // remove the Jamo V/T
 1271|      0|                        q=pRemove;
 1272|      0|                        r=p;
 1273|      0|                        while(r<limit) {
  ------------------
  |  Branch (1273:31): [True: 0, False: 0]
  ------------------
 1274|      0|                            *q++=*r++;
 1275|      0|                        }
 1276|      0|                        limit=q;
 1277|      0|                        p=pRemove;
 1278|      0|                    }
 1279|      0|                }
 1280|       |                /*
 1281|       |                 * No "else" for Jamo T:
 1282|       |                 * Since the input is in NFD, there are no Hangul LV syllables that
 1283|       |                 * a Jamo T could combine with.
 1284|       |                 * All Jamo Ts are combined above when handling Jamo Vs.
 1285|       |                 */
 1286|      0|                if(p==limit) {
  ------------------
  |  Branch (1286:20): [True: 0, False: 0]
  ------------------
 1287|      0|                    break;
 1288|      0|                }
 1289|      0|                compositionsList=nullptr;
 1290|      0|                continue;
 1291|  4.51M|            } else if((compositeAndFwd=combine(compositionsList, c))>=0) {
  ------------------
  |  Branch (1291:23): [True: 4.51M, False: 2.08k]
  ------------------
 1292|       |                // The starter and the combining mark (c) do combine.
 1293|  4.51M|                UChar32 composite=compositeAndFwd>>1;
 1294|       |
 1295|       |                // Replace the starter with the composite, remove the combining mark.
 1296|  4.51M|                pRemove=p-U16_LENGTH(c);  // pRemove & p: start & limit of the combining mark
  ------------------
  |  |  141|  4.51M|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 4.51M, False: 0]
  |  |  ------------------
  ------------------
 1297|  4.51M|                if(starterIsSupplementary) {
  ------------------
  |  Branch (1297:20): [True: 0, False: 4.51M]
  ------------------
 1298|      0|                    if(U_IS_SUPPLEMENTARY(composite)) {
  ------------------
  |  |  169|      0|#define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c)-0x10000)<=0xfffff)
  |  |  ------------------
  |  |  |  Branch (169:31): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1299|       |                        // both are supplementary
 1300|      0|                        starter[0]=U16_LEAD(composite);
  ------------------
  |  |  123|      0|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
 1301|      0|                        starter[1]=U16_TRAIL(composite);
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
 1302|      0|                    } else {
 1303|      0|                        *starter = static_cast<char16_t>(composite);
 1304|       |                        // The composite is shorter than the starter,
 1305|       |                        // move the intermediate characters forward one.
 1306|      0|                        starterIsSupplementary=false;
 1307|      0|                        q=starter+1;
 1308|      0|                        r=q+1;
 1309|      0|                        while(r<pRemove) {
  ------------------
  |  Branch (1309:31): [True: 0, False: 0]
  ------------------
 1310|      0|                            *q++=*r++;
 1311|      0|                        }
 1312|      0|                        --pRemove;
 1313|      0|                    }
 1314|  4.51M|                } else if(U_IS_SUPPLEMENTARY(composite)) {
  ------------------
  |  |  169|  4.51M|#define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c)-0x10000)<=0xfffff)
  |  |  ------------------
  |  |  |  Branch (169:31): [True: 0, False: 4.51M]
  |  |  ------------------
  ------------------
 1315|       |                    // The composite is longer than the starter,
 1316|       |                    // move the intermediate characters back one.
 1317|      0|                    starterIsSupplementary=true;
 1318|      0|                    ++starter;  // temporarily increment for the loop boundary
 1319|      0|                    q=pRemove;
 1320|      0|                    r=++pRemove;
 1321|      0|                    while(starter<q) {
  ------------------
  |  Branch (1321:27): [True: 0, False: 0]
  ------------------
 1322|      0|                        *--r=*--q;
 1323|      0|                    }
 1324|      0|                    *starter=U16_TRAIL(composite);
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
 1325|      0|                    *--starter=U16_LEAD(composite);  // undo the temporary increment
  ------------------
  |  |  123|      0|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
 1326|  4.51M|                } else {
 1327|       |                    // both are on the BMP
 1328|  4.51M|                    *starter = static_cast<char16_t>(composite);
 1329|  4.51M|                }
 1330|       |
 1331|       |                /* remove the combining mark by moving the following text over it */
 1332|  4.51M|                if(pRemove<p) {
  ------------------
  |  Branch (1332:20): [True: 4.51M, False: 0]
  ------------------
 1333|  4.51M|                    q=pRemove;
 1334|  4.51M|                    r=p;
 1335|  18.7M|                    while(r<limit) {
  ------------------
  |  Branch (1335:27): [True: 14.2M, False: 4.51M]
  ------------------
 1336|  14.2M|                        *q++=*r++;
 1337|  14.2M|                    }
 1338|  4.51M|                    limit=q;
 1339|  4.51M|                    p=pRemove;
 1340|  4.51M|                }
 1341|       |                // Keep prevCC because we removed the combining mark.
 1342|       |
 1343|  4.51M|                if(p==limit) {
  ------------------
  |  Branch (1343:20): [True: 15.6k, False: 4.49M]
  ------------------
 1344|  15.6k|                    break;
 1345|  15.6k|                }
 1346|       |                // Is the composite a starter that combines forward?
 1347|  4.49M|                if(compositeAndFwd&1) {
  ------------------
  |  Branch (1347:20): [True: 0, False: 4.49M]
  ------------------
 1348|      0|                    compositionsList=
 1349|      0|                        getCompositionsListForComposite(getRawNorm16(composite));
 1350|  4.49M|                } else {
 1351|  4.49M|                    compositionsList=nullptr;
 1352|  4.49M|                }
 1353|       |
 1354|       |                // We combined; continue with looking for compositions.
 1355|  4.49M|                continue;
 1356|  4.51M|            }
 1357|  4.51M|        }
 1358|       |
 1359|       |        // no combination this time
 1360|  26.3M|        prevCC=cc;
 1361|  26.3M|        if(p==limit) {
  ------------------
  |  Branch (1361:12): [True: 4.50M, False: 21.8M]
  ------------------
 1362|  4.50M|            break;
 1363|  4.50M|        }
 1364|       |
 1365|       |        // If c did not combine, then check if it is a starter.
 1366|  21.8M|        if(cc==0) {
  ------------------
  |  Branch (1366:12): [True: 17.8M, False: 4.07M]
  ------------------
 1367|       |            // Found a new starter.
 1368|  17.8M|            if((compositionsList=getCompositionsListForDecompYes(norm16))!=nullptr) {
  ------------------
  |  Branch (1368:16): [True: 8.84M, False: 8.95M]
  ------------------
 1369|       |                // It may combine with something, prepare for it.
 1370|  8.84M|                if(U_IS_BMP(c)) {
  ------------------
  |  |  161|  8.84M|#define U_IS_BMP(c) ((uint32_t)(c)<=0xffff)
  |  |  ------------------
  |  |  |  Branch (161:21): [True: 8.84M, False: 0]
  |  |  ------------------
  ------------------
 1371|  8.84M|                    starterIsSupplementary=false;
 1372|  8.84M|                    starter=p-1;
 1373|  8.84M|                } else {
 1374|      0|                    starterIsSupplementary=true;
 1375|      0|                    starter=p-2;
 1376|      0|                }
 1377|  8.84M|            }
 1378|  17.8M|        } else if(onlyContiguous) {
  ------------------
  |  Branch (1378:19): [True: 0, False: 4.07M]
  ------------------
 1379|       |            // FCC: no discontiguous compositions; any intervening character blocks.
 1380|      0|            compositionsList=nullptr;
 1381|      0|        }
 1382|  21.8M|    }
 1383|  4.51M|    buffer.setReorderingLimit(limit);
 1384|  4.51M|}
_ZNK6icu_7815Normalizer2Impl7composeEPKDsS2_aaRNS_16ReorderingBufferER10UErrorCode:
 1455|  25.3M|                         UErrorCode &errorCode) const {
 1456|  25.3M|    const char16_t *prevBoundary=src;
 1457|  25.3M|    UChar32 minNoMaybeCP=minCompNoMaybeCP;
 1458|  25.3M|    if(limit==nullptr) {
  ------------------
  |  Branch (1458:8): [True: 0, False: 25.3M]
  ------------------
 1459|      0|        src=copyLowPrefixFromNulTerminated(src, minNoMaybeCP,
 1460|      0|                                           doCompose ? &buffer : nullptr,
  ------------------
  |  Branch (1460:44): [True: 0, False: 0]
  ------------------
 1461|      0|                                           errorCode);
 1462|      0|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (1462:12): [True: 0, False: 0]
  ------------------
 1463|      0|            return false;
 1464|      0|        }
 1465|      0|        limit=u_strchr(src, 0);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1466|      0|        if (prevBoundary != src) {
  ------------------
  |  Branch (1466:13): [True: 0, False: 0]
  ------------------
 1467|      0|            if (hasCompBoundaryAfter(*(src-1), onlyContiguous)) {
  ------------------
  |  Branch (1467:17): [True: 0, False: 0]
  ------------------
 1468|      0|                prevBoundary = src;
 1469|      0|            } else {
 1470|      0|                buffer.removeSuffix(1);
 1471|      0|                prevBoundary = --src;
 1472|      0|            }
 1473|      0|        }
 1474|      0|    }
 1475|       |
 1476|  41.4M|    for (;;) {
 1477|       |        // Fast path: Scan over a sequence of characters below the minimum "no or maybe" code point,
 1478|       |        // or with (compYes && ccc==0) properties.
 1479|  41.4M|        const char16_t *prevSrc;
 1480|  41.4M|        UChar32 c = 0;
 1481|  41.4M|        uint16_t norm16 = 0;
 1482|  68.7M|        for (;;) {
 1483|  68.7M|            if (src == limit) {
  ------------------
  |  Branch (1483:17): [True: 25.1M, False: 43.6M]
  ------------------
 1484|  25.1M|                if (prevBoundary != limit && doCompose) {
  ------------------
  |  Branch (1484:21): [True: 9.03M, False: 16.1M]
  |  Branch (1484:46): [True: 7.04M, False: 1.98M]
  ------------------
 1485|  7.04M|                    buffer.appendZeroCC(prevBoundary, limit, errorCode);
 1486|  7.04M|                }
 1487|  25.1M|                return true;
 1488|  25.1M|            }
 1489|  43.6M|            if( (c=*src)<minNoMaybeCP ||
  ------------------
  |  Branch (1489:17): [True: 0, False: 43.6M]
  ------------------
 1490|  43.6M|                isCompYesAndZeroCC(norm16=UCPTRIE_FAST_BMP_GET(normTrie, UCPTRIE_16, c))
  ------------------
  |  |  530|  43.6M|#define UCPTRIE_FAST_BMP_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_FAST_INDEX(trie, c))
  |  |  ------------------
  |  |  |  | 1490|  43.6M|                isCompYesAndZeroCC(norm16=UCPTRIE_FAST_BMP_GET(normTrie, UCPTRIE_16, c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|  43.6M|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1490:17): [True: 27.2M, False: 16.3M]
  ------------------
 1491|  43.6M|            ) {
 1492|  27.2M|                ++src;
 1493|  27.2M|            } else {
 1494|  16.3M|                prevSrc = src++;
 1495|  16.3M|                if(!U16_IS_LEAD(c)) {
  ------------------
  |  |   59|  16.3M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  ------------------
  |  Branch (1495:20): [True: 16.3M, False: 15.8k]
  ------------------
 1496|  16.3M|                    break;
 1497|  16.3M|                } else {
 1498|  15.8k|                    char16_t c2;
 1499|  15.8k|                    if(src!=limit && U16_IS_TRAIL(c2=*src)) {
  ------------------
  |  |   67|  15.8k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 15.8k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1499:24): [True: 15.8k, False: 0]
  ------------------
 1500|  15.8k|                        ++src;
 1501|  15.8k|                        c=U16_GET_SUPPLEMENTARY(c, c2);
  ------------------
  |  |  113|  15.8k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|  15.8k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
 1502|  15.8k|                        norm16=UCPTRIE_FAST_SUPP_GET(normTrie, UCPTRIE_16, c);
  ------------------
  |  |  542|  15.8k|#define UCPTRIE_FAST_SUPP_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_SMALL_INDEX(trie, c))
  |  |  ------------------
  |  |  |  | 1502|  15.8k|                        norm16=UCPTRIE_FAST_SUPP_GET(normTrie, UCPTRIE_16, c);
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|  31.7k|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (326:49): [True: 0, False: 15.8k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1503|  15.8k|                        if(!isCompYesAndZeroCC(norm16)) {
  ------------------
  |  Branch (1503:28): [True: 15.6k, False: 196]
  ------------------
 1504|  15.6k|                            break;
 1505|  15.6k|                        }
 1506|  15.8k|                    }
 1507|  15.8k|                }
 1508|  16.3M|            }
 1509|  43.6M|        }
 1510|       |        // isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo.
 1511|       |        // The current character is either a "noNo" (has a mapping)
 1512|       |        // or a "maybeYes" / "maybeNo" (combines backward)
 1513|       |        // or a "yesYes" with ccc!=0.
 1514|       |        // It is not a Hangul syllable or Jamo L because those have "yes" properties.
 1515|       |
 1516|       |        // Medium-fast path: Handle cases that do not require full decomposition and recomposition.
 1517|  16.3M|        if (norm16 < minMaybeNo) {  // minNoNo <= norm16 < minMaybeNo
  ------------------
  |  Branch (1517:13): [True: 16.3M, False: 15.5k]
  ------------------
 1518|  16.3M|            if (!doCompose) {
  ------------------
  |  Branch (1518:17): [True: 203k, False: 16.1M]
  ------------------
 1519|   203k|                return false;
 1520|   203k|            }
 1521|       |            // Fast path for mapping a character that is immediately surrounded by boundaries.
 1522|       |            // In this case, we need not decompose around the current character.
 1523|  16.1M|            if (isDecompNoAlgorithmic(norm16)) {
  ------------------
  |  Branch (1523:17): [True: 0, False: 16.1M]
  ------------------
 1524|       |                // Maps to a single isCompYesAndZeroCC character
 1525|       |                // which also implies hasCompBoundaryBefore.
 1526|      0|                if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) ||
  ------------------
  |  Branch (1526:21): [True: 0, False: 0]
  ------------------
 1527|      0|                        hasCompBoundaryBefore(src, limit)) {
  ------------------
  |  Branch (1527:25): [True: 0, False: 0]
  ------------------
 1528|      0|                    if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) {
  ------------------
  |  Branch (1528:25): [True: 0, False: 0]
  |  Branch (1528:52): [True: 0, False: 0]
  ------------------
 1529|      0|                        break;
 1530|      0|                    }
 1531|      0|                    if(!buffer.append(mapAlgorithmic(c, norm16), 0, errorCode)) {
  ------------------
  |  Branch (1531:24): [True: 0, False: 0]
  ------------------
 1532|      0|                        break;
 1533|      0|                    }
 1534|      0|                    prevBoundary = src;
 1535|      0|                    continue;
 1536|      0|                }
 1537|  16.1M|            } else if (norm16 < minNoNoCompBoundaryBefore) {
  ------------------
  |  Branch (1537:24): [True: 11.6M, False: 4.51M]
  ------------------
 1538|       |                // The mapping is comp-normalized which also implies hasCompBoundaryBefore.
 1539|  11.6M|                if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) ||
  ------------------
  |  Branch (1539:21): [True: 10.4M, False: 1.14M]
  ------------------
 1540|  11.6M|                        hasCompBoundaryBefore(src, limit)) {
  ------------------
  |  Branch (1540:25): [True: 1.13M, False: 4.98k]
  ------------------
 1541|  11.6M|                    if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) {
  ------------------
  |  Branch (1541:25): [True: 0, False: 11.6M]
  |  Branch (1541:52): [True: 0, False: 0]
  ------------------
 1542|      0|                        break;
 1543|      0|                    }
 1544|  11.6M|                    const char16_t *mapping = reinterpret_cast<const char16_t *>(getDataForYesOrNo(norm16));
 1545|  11.6M|                    int32_t length = *mapping++ & MAPPING_LENGTH_MASK;
 1546|  11.6M|                    if(!buffer.appendZeroCC(mapping, mapping + length, errorCode)) {
  ------------------
  |  Branch (1546:24): [True: 0, False: 11.6M]
  ------------------
 1547|      0|                        break;
 1548|      0|                    }
 1549|  11.6M|                    prevBoundary = src;
 1550|  11.6M|                    continue;
 1551|  11.6M|                }
 1552|  11.6M|            } else if (norm16 >= minNoNoEmpty) {
  ------------------
  |  Branch (1552:24): [True: 0, False: 4.51M]
  ------------------
 1553|       |                // The current character maps to nothing.
 1554|       |                // Simply omit it from the output if there is a boundary before _or_ after it.
 1555|       |                // The character itself implies no boundaries.
 1556|      0|                if (hasCompBoundaryBefore(src, limit) ||
  ------------------
  |  Branch (1556:21): [True: 0, False: 0]
  ------------------
 1557|      0|                        hasCompBoundaryAfter(prevBoundary, prevSrc, onlyContiguous)) {
  ------------------
  |  Branch (1557:25): [True: 0, False: 0]
  ------------------
 1558|      0|                    if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) {
  ------------------
  |  Branch (1558:25): [True: 0, False: 0]
  |  Branch (1558:52): [True: 0, False: 0]
  ------------------
 1559|      0|                        break;
 1560|      0|                    }
 1561|      0|                    prevBoundary = src;
 1562|      0|                    continue;
 1563|      0|                }
 1564|      0|            }
 1565|       |            // Other "noNo" type, or need to examine more text around this character:
 1566|       |            // Fall through to the slow path.
 1567|  16.1M|        } else if (isJamoVT(norm16) && prevBoundary != prevSrc) {
  ------------------
  |  Branch (1567:20): [True: 0, False: 15.5k]
  |  Branch (1567:40): [True: 0, False: 0]
  ------------------
 1568|      0|            char16_t prev=*(prevSrc-1);
 1569|      0|            if(c<Hangul::JAMO_T_BASE) {
  ------------------
  |  Branch (1569:16): [True: 0, False: 0]
  ------------------
 1570|       |                // The current character is a Jamo Vowel,
 1571|       |                // compose with previous Jamo L and following Jamo T.
 1572|      0|                char16_t l = static_cast<char16_t>(prev - Hangul::JAMO_L_BASE);
 1573|      0|                if(l<Hangul::JAMO_L_COUNT) {
  ------------------
  |  Branch (1573:20): [True: 0, False: 0]
  ------------------
 1574|      0|                    if (!doCompose) {
  ------------------
  |  Branch (1574:25): [True: 0, False: 0]
  ------------------
 1575|      0|                        return false;
 1576|      0|                    }
 1577|      0|                    int32_t t;
 1578|      0|                    if (src != limit &&
  ------------------
  |  Branch (1578:25): [True: 0, False: 0]
  ------------------
 1579|      0|                            0 < (t = (static_cast<int32_t>(*src) - Hangul::JAMO_T_BASE)) &&
  ------------------
  |  Branch (1579:29): [True: 0, False: 0]
  ------------------
 1580|      0|                            t < Hangul::JAMO_T_COUNT) {
  ------------------
  |  Branch (1580:29): [True: 0, False: 0]
  ------------------
 1581|       |                        // The next character is a Jamo T.
 1582|      0|                        ++src;
 1583|      0|                    } else if (hasCompBoundaryBefore(src, limit)) {
  ------------------
  |  Branch (1583:32): [True: 0, False: 0]
  ------------------
 1584|       |                        // No Jamo T follows, not even via decomposition.
 1585|      0|                        t = 0;
 1586|      0|                    } else {
 1587|      0|                        t = -1;
 1588|      0|                    }
 1589|      0|                    if (t >= 0) {
  ------------------
  |  Branch (1589:25): [True: 0, False: 0]
  ------------------
 1590|      0|                        UChar32 syllable = Hangul::HANGUL_BASE +
 1591|      0|                            (l*Hangul::JAMO_V_COUNT + (c-Hangul::JAMO_V_BASE)) *
 1592|      0|                            Hangul::JAMO_T_COUNT + t;
 1593|      0|                        --prevSrc;  // Replace the Jamo L as well.
 1594|      0|                        if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) {
  ------------------
  |  Branch (1594:29): [True: 0, False: 0]
  |  Branch (1594:56): [True: 0, False: 0]
  ------------------
 1595|      0|                            break;
 1596|      0|                        }
 1597|      0|                        if (!buffer.appendBMP(static_cast<char16_t>(syllable), 0, errorCode)) {
  ------------------
  |  Branch (1597:29): [True: 0, False: 0]
  ------------------
 1598|      0|                            break;
 1599|      0|                        }
 1600|      0|                        prevBoundary = src;
 1601|      0|                        continue;
 1602|      0|                    }
 1603|       |                    // If we see L+V+x where x!=T then we drop to the slow path,
 1604|       |                    // decompose and recompose.
 1605|       |                    // This is to deal with NFKC finding normal L and V but a
 1606|       |                    // compatibility variant of a T.
 1607|       |                    // We need to either fully compose that combination here
 1608|       |                    // (which would complicate the code and may not work with strange custom data)
 1609|       |                    // or use the slow path.
 1610|      0|                }
 1611|      0|            } else if (Hangul::isHangulLV(prev)) {
  ------------------
  |  Branch (1611:24): [True: 0, False: 0]
  ------------------
 1612|       |                // The current character is a Jamo Trailing consonant,
 1613|       |                // compose with previous Hangul LV that does not contain a Jamo T.
 1614|      0|                if (!doCompose) {
  ------------------
  |  Branch (1614:21): [True: 0, False: 0]
  ------------------
 1615|      0|                    return false;
 1616|      0|                }
 1617|      0|                UChar32 syllable = prev + c - Hangul::JAMO_T_BASE;
 1618|      0|                --prevSrc;  // Replace the Hangul LV as well.
 1619|      0|                if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) {
  ------------------
  |  Branch (1619:21): [True: 0, False: 0]
  |  Branch (1619:48): [True: 0, False: 0]
  ------------------
 1620|      0|                    break;
 1621|      0|                }
 1622|      0|                if (!buffer.appendBMP(static_cast<char16_t>(syllable), 0, errorCode)) {
  ------------------
  |  Branch (1622:21): [True: 0, False: 0]
  ------------------
 1623|      0|                    break;
 1624|      0|                }
 1625|      0|                prevBoundary = src;
 1626|      0|                continue;
 1627|      0|            }
 1628|       |            // No matching context, or may need to decompose surrounding text first:
 1629|       |            // Fall through to the slow path.
 1630|  15.5k|        } else if (norm16 > JAMO_VT) {  // norm16 >= MIN_YES_YES_WITH_CC
  ------------------
  |  Branch (1630:20): [True: 15.5k, False: 0]
  ------------------
 1631|       |            // One or more combining marks that do not combine-back:
 1632|       |            // Check for canonical order, copy unchanged if ok and
 1633|       |            // if followed by a character with a boundary-before.
 1634|  15.5k|            uint8_t cc = getCCFromNormalYesOrMaybe(norm16);  // cc!=0
 1635|  15.5k|            if (onlyContiguous /* FCC */ && getPreviousTrailCC(prevBoundary, prevSrc) > cc) {
  ------------------
  |  Branch (1635:17): [True: 0, False: 15.5k]
  |  Branch (1635:45): [True: 0, False: 0]
  ------------------
 1636|       |                // Fails FCD test, need to decompose and contiguously recompose.
 1637|      0|                if (!doCompose) {
  ------------------
  |  Branch (1637:21): [True: 0, False: 0]
  ------------------
 1638|      0|                    return false;
 1639|      0|                }
 1640|  15.5k|            } else {
 1641|       |                // If !onlyContiguous (not FCC), then we ignore the tccc of
 1642|       |                // the previous character which passed the quick check "yes && ccc==0" test.
 1643|  15.5k|                const char16_t *nextSrc;
 1644|  15.5k|                uint16_t n16;
 1645|   144k|                for (;;) {
 1646|   144k|                    if (src == limit) {
  ------------------
  |  Branch (1646:25): [True: 9.92k, False: 134k]
  ------------------
 1647|  9.92k|                        if (doCompose) {
  ------------------
  |  Branch (1647:29): [True: 3.98k, False: 5.93k]
  ------------------
 1648|  3.98k|                            buffer.appendZeroCC(prevBoundary, limit, errorCode);
 1649|  3.98k|                        }
 1650|  9.92k|                        return true;
 1651|  9.92k|                    }
 1652|   134k|                    uint8_t prevCC = cc;
 1653|   134k|                    nextSrc = src;
 1654|   134k|                    UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, nextSrc, limit, c, n16);
  ------------------
  |  |  386|   134k|#define UCPTRIE_FAST_U16_NEXT(trie, dataAccess, src, limit, c, result) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   134k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  387|   134k|    (c) = *(src)++; \
  |  |  388|   134k|    int32_t __index; \
  |  |  389|   134k|    if (!U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|   134k|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   134k|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (389:9): [True: 5.41k, False: 129k]
  |  |  ------------------
  |  |  390|  5.41k|        __index = _UCPTRIE_FAST_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  602|  5.41k|    ((int32_t)(trie)->index[(c) >> UCPTRIE_FAST_SHIFT] + ((c) & UCPTRIE_FAST_DATA_MASK))
  |  |  ------------------
  |  |  391|   129k|    } else { \
  |  |  392|   129k|        uint16_t __c2; \
  |  |  393|   129k|        if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   84|   258k|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 129k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                       if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   67|   129k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 129k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (393:41): [True: 129k, False: 0]
  |  |  ------------------
  |  |  394|   129k|            ++(src); \
  |  |  395|   129k|            (c) = U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|   129k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|   129k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  396|   129k|            __index = _UCPTRIE_SMALL_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  606|   129k|    ((c) >= (trie)->highStart ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (606:6): [True: 227, False: 129k]
  |  |  |  |  ------------------
  |  |  |  |  607|   129k|        (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
  |  |  |  |  608|   129k|        ucptrie_internalSmallIndex(trie, c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  810|   129k|#define ucptrie_internalSmallIndex U_ICU_ENTRY_POINT_RENAME(ucptrie_internalSmallIndex)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  123|   129k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  122|   129k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  121|   129k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  397|   129k|        } else { \
  |  |  398|      0|            __index = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; \
  |  |  399|      0|        } \
  |  |  400|   129k|    } \
  |  |  401|   134k|    (result) = dataAccess(trie, __index); \
  |  |  ------------------
  |  |  |  | 1654|   134k|                    UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, nextSrc, limit, c, n16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|   134k|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  402|   134k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   134k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1655|   134k|                    if (n16 >= MIN_YES_YES_WITH_CC) {
  ------------------
  |  Branch (1655:25): [True: 129k, False: 5.67k]
  ------------------
 1656|   129k|                        cc = getCCFromNormalYesOrMaybe(n16);
 1657|   129k|                        if (prevCC > cc) {
  ------------------
  |  Branch (1657:29): [True: 0, False: 129k]
  ------------------
 1658|      0|                            if (!doCompose) {
  ------------------
  |  Branch (1658:33): [True: 0, False: 0]
  ------------------
 1659|      0|                                return false;
 1660|      0|                            }
 1661|      0|                            break;
 1662|      0|                        }
 1663|   129k|                    } else {
 1664|  5.67k|                        break;
 1665|  5.67k|                    }
 1666|   129k|                    src = nextSrc;
 1667|   129k|                }
 1668|       |                // src is after the last in-order combining mark.
 1669|       |                // If there is a boundary here, then we continue with no change.
 1670|  5.67k|                if (norm16HasCompBoundaryBefore(n16)) {
  ------------------
  |  Branch (1670:21): [True: 2.03k, False: 3.63k]
  ------------------
 1671|  2.03k|                    if (isCompYesAndZeroCC(n16)) {
  ------------------
  |  Branch (1671:25): [True: 1.55k, False: 478]
  ------------------
 1672|  1.55k|                        src = nextSrc;
 1673|  1.55k|                    }
 1674|  2.03k|                    continue;
 1675|  2.03k|                }
 1676|       |                // Use the slow path. There is no boundary in [prevSrc, src[.
 1677|  5.67k|            }
 1678|  15.5k|        }
 1679|       |
 1680|       |        // Slow path: Find the nearest boundaries around the current character,
 1681|       |        // decompose and recompose.
 1682|  4.51M|        if (prevBoundary != prevSrc && !norm16HasCompBoundaryBefore(norm16)) {
  ------------------
  |  Branch (1682:13): [True: 12.3k, False: 4.50M]
  |  Branch (1682:40): [True: 12.3k, False: 0]
  ------------------
 1683|  12.3k|            const char16_t *p = prevSrc;
 1684|  12.3k|            UCPTRIE_FAST_U16_PREV(normTrie, UCPTRIE_16, prevBoundary, p, c, norm16);
  ------------------
  |  |  417|  12.3k|#define UCPTRIE_FAST_U16_PREV(trie, dataAccess, start, src, c, result) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  12.3k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  418|  12.3k|    (c) = *--(src); \
  |  |  419|  12.3k|    int32_t __index; \
  |  |  420|  12.3k|    if (!U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|  12.3k|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  12.3k|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (420:9): [True: 11.5k, False: 810]
  |  |  ------------------
  |  |  421|  11.5k|        __index = _UCPTRIE_FAST_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  602|  11.5k|    ((int32_t)(trie)->index[(c) >> UCPTRIE_FAST_SHIFT] + ((c) & UCPTRIE_FAST_DATA_MASK))
  |  |  ------------------
  |  |  422|  11.5k|    } else { \
  |  |  423|    810|        uint16_t __c2; \
  |  |  424|    810|        if (U16_IS_SURROGATE_TRAIL(c) && (src) != (start) && U16_IS_LEAD(__c2 = *((src) - 1))) { \
  |  |  ------------------
  |  |  |  |   93|  1.62k|#define U16_IS_SURROGATE_TRAIL(c) (((c)&0x400)!=0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (93:35): [True: 810, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                       if (U16_IS_SURROGATE_TRAIL(c) && (src) != (start) && U16_IS_LEAD(__c2 = *((src) - 1))) { \
  |  |  ------------------
  |  |  |  |   59|    810|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 810, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (424:42): [True: 810, False: 0]
  |  |  ------------------
  |  |  425|    810|            --(src); \
  |  |  426|    810|            (c) = U16_GET_SUPPLEMENTARY(__c2, (c)); \
  |  |  ------------------
  |  |  |  |  113|    810|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|    810|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  427|    810|            __index = _UCPTRIE_SMALL_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  606|    810|    ((c) >= (trie)->highStart ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (606:6): [True: 494, False: 316]
  |  |  |  |  ------------------
  |  |  |  |  607|    810|        (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
  |  |  |  |  608|    810|        ucptrie_internalSmallIndex(trie, c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  810|    316|#define ucptrie_internalSmallIndex U_ICU_ENTRY_POINT_RENAME(ucptrie_internalSmallIndex)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  123|    316|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  122|    316|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  121|    316|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  428|    810|        } else { \
  |  |  429|      0|            __index = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; \
  |  |  430|      0|        } \
  |  |  431|    810|    } \
  |  |  432|  12.3k|    (result) = dataAccess(trie, __index); \
  |  |  ------------------
  |  |  |  | 1684|  12.3k|            UCPTRIE_FAST_U16_PREV(normTrie, UCPTRIE_16, prevBoundary, p, c, norm16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|  12.3k|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  433|  12.3k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  12.3k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1685|  12.3k|            if (!norm16HasCompBoundaryAfter(norm16, onlyContiguous)) {
  ------------------
  |  Branch (1685:17): [True: 801, False: 11.5k]
  ------------------
 1686|    801|                prevSrc = p;
 1687|    801|            }
 1688|  12.3k|        }
 1689|  4.51M|        if (doCompose && prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) {
  ------------------
  |  Branch (1689:13): [True: 4.51M, False: 1.78k]
  |  Branch (1689:26): [True: 11.1k, False: 4.50M]
  |  Branch (1689:53): [True: 0, False: 11.1k]
  ------------------
 1690|      0|            break;
 1691|      0|        }
 1692|  4.51M|        int32_t recomposeStartIndex=buffer.length();
 1693|       |        // We know there is not a boundary here.
 1694|  4.51M|        decomposeShort(prevSrc, src, false /* !stopAtCompBoundary */, onlyContiguous,
 1695|  4.51M|                       buffer, errorCode);
 1696|       |        // Decompose until the next boundary.
 1697|  4.51M|        src = decomposeShort(src, limit, true /* stopAtCompBoundary */, onlyContiguous,
 1698|  4.51M|                             buffer, errorCode);
 1699|  4.51M|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (1699:13): [True: 0, False: 4.51M]
  ------------------
 1700|      0|            break;
 1701|      0|        }
 1702|  4.51M|        if ((src - prevSrc) > INT32_MAX) {  // guard before buffer.equals()
  ------------------
  |  Branch (1702:13): [True: 0, False: 4.51M]
  ------------------
 1703|      0|            errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
 1704|      0|            return true;
 1705|      0|        }
 1706|  4.51M|        recompose(buffer, recomposeStartIndex, onlyContiguous);
 1707|  4.51M|        if(!doCompose) {
  ------------------
  |  Branch (1707:12): [True: 1.78k, False: 4.51M]
  ------------------
 1708|  1.78k|            if(!buffer.equals(prevSrc, src)) {
  ------------------
  |  Branch (1708:16): [True: 1.78k, False: 0]
  ------------------
 1709|  1.78k|                return false;
 1710|  1.78k|            }
 1711|      0|            buffer.remove();
 1712|      0|        }
 1713|  4.51M|        prevBoundary=src;
 1714|  4.51M|    }
 1715|      0|    return true;
 1716|  25.3M|}
_ZNK6icu_7815Normalizer2Impl21hasCompBoundaryBeforeEPKDsS2_:
 2138|  1.14M|UBool Normalizer2Impl::hasCompBoundaryBefore(const char16_t *src, const char16_t *limit) const {
 2139|  1.14M|    if (src == limit || *src < minCompNoMaybeCP) {
  ------------------
  |  Branch (2139:9): [True: 1.13M, False: 4.98k]
  |  Branch (2139:25): [True: 0, False: 4.98k]
  ------------------
 2140|  1.13M|        return true;
 2141|  1.13M|    }
 2142|  4.98k|    UChar32 c;
 2143|  4.98k|    uint16_t norm16;
 2144|  4.98k|    UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, src, limit, c, norm16);
  ------------------
  |  |  386|  4.98k|#define UCPTRIE_FAST_U16_NEXT(trie, dataAccess, src, limit, c, result) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  4.98k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  387|  4.98k|    (c) = *(src)++; \
  |  |  388|  4.98k|    int32_t __index; \
  |  |  389|  4.98k|    if (!U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|  4.98k|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  4.98k|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (389:9): [True: 2.45k, False: 2.53k]
  |  |  ------------------
  |  |  390|  2.45k|        __index = _UCPTRIE_FAST_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  602|  2.45k|    ((int32_t)(trie)->index[(c) >> UCPTRIE_FAST_SHIFT] + ((c) & UCPTRIE_FAST_DATA_MASK))
  |  |  ------------------
  |  |  391|  2.53k|    } else { \
  |  |  392|  2.53k|        uint16_t __c2; \
  |  |  393|  2.53k|        if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   84|  5.07k|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 2.53k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                       if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
  |  |  ------------------
  |  |  |  |   67|  2.53k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 2.53k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (393:41): [True: 2.53k, False: 0]
  |  |  ------------------
  |  |  394|  2.53k|            ++(src); \
  |  |  395|  2.53k|            (c) = U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|  2.53k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|  2.53k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  396|  2.53k|            __index = _UCPTRIE_SMALL_INDEX(trie, c); \
  |  |  ------------------
  |  |  |  |  606|  2.53k|    ((c) >= (trie)->highStart ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (606:6): [True: 0, False: 2.53k]
  |  |  |  |  ------------------
  |  |  |  |  607|  2.53k|        (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
  |  |  |  |  608|  2.53k|        ucptrie_internalSmallIndex(trie, c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  810|  2.53k|#define ucptrie_internalSmallIndex U_ICU_ENTRY_POINT_RENAME(ucptrie_internalSmallIndex)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  123|  2.53k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  122|  2.53k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  121|  2.53k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  397|  2.53k|        } else { \
  |  |  398|      0|            __index = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; \
  |  |  399|      0|        } \
  |  |  400|  2.53k|    } \
  |  |  401|  4.98k|    (result) = dataAccess(trie, __index); \
  |  |  ------------------
  |  |  |  | 2144|  4.98k|    UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, src, limit, c, norm16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|  4.98k|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  402|  4.98k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  4.98k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2145|  4.98k|    return norm16HasCompBoundaryBefore(norm16);
 2146|  1.14M|}

_ZN6icu_7816ReorderingBufferC2ERKNS_15Normalizer2ImplERNS_13UnicodeStringE:
  143|  25.3M|        impl(ni), str(dest),
  144|  25.3M|        start(nullptr), reorderStart(nullptr), limit(nullptr),
  145|  25.3M|        remainingCapacity(0), lastCC(0) {}
_ZN6icu_7816ReorderingBufferD2Ev:
  148|  25.3M|    ~ReorderingBuffer() {
  149|  25.3M|        if (start != nullptr) {
  ------------------
  |  Branch (149:13): [True: 25.3M, False: 0]
  ------------------
  150|  25.3M|            str.releaseBuffer(static_cast<int32_t>(limit - start));
  151|  25.3M|        }
  152|  25.3M|    }
_ZNK6icu_7816ReorderingBuffer6lengthEv:
  156|  4.51M|    int32_t length() const { return static_cast<int32_t>(limit - start); }
_ZN6icu_7816ReorderingBuffer8getStartEv:
  157|  4.51M|    char16_t *getStart() { return start; }
_ZN6icu_7816ReorderingBuffer8getLimitEv:
  158|  4.51M|    char16_t *getLimit() { return limit; }
_ZN6icu_7816ReorderingBuffer6appendEihR10UErrorCode:
  164|   119k|    UBool append(UChar32 c, uint8_t cc, UErrorCode &errorCode) {
  165|   119k|        return (c<=0xffff) ?
  ------------------
  |  Branch (165:16): [True: 801, False: 118k]
  ------------------
  166|    801|            appendBMP(static_cast<char16_t>(c), cc, errorCode) :
  167|   119k|            appendSupplementary(c, cc, errorCode);
  168|   119k|    }
_ZN6icu_7816ReorderingBuffer9appendBMPEDshR10UErrorCode:
  172|    801|    UBool appendBMP(char16_t c, uint8_t cc, UErrorCode &errorCode) {
  173|    801|        if(remainingCapacity==0 && !resize(1, errorCode)) {
  ------------------
  |  Branch (173:12): [True: 0, False: 801]
  |  Branch (173:36): [True: 0, False: 0]
  ------------------
  174|      0|            return false;
  175|      0|        }
  176|    801|        if(lastCC<=cc || cc==0) {
  ------------------
  |  Branch (176:12): [True: 801, False: 0]
  |  Branch (176:26): [True: 0, False: 0]
  ------------------
  177|    801|            *limit++=c;
  178|    801|            lastCC=cc;
  179|    801|            if(cc<=1) {
  ------------------
  |  Branch (179:16): [True: 801, False: 0]
  ------------------
  180|    801|                reorderStart=limit;
  181|    801|            }
  182|    801|        } else {
  183|      0|            insert(c, cc);
  184|      0|        }
  185|    801|        --remainingCapacity;
  186|    801|        return true;
  187|    801|    }
_ZN6icu_7816ReorderingBuffer18setReorderingLimitEPDs:
  192|  4.51M|    void setReorderingLimit(char16_t *newLimit) {
  193|  4.51M|        remainingCapacity += static_cast<int32_t>(limit - newLimit);
  194|  4.51M|        reorderStart=limit=newLimit;
  195|  4.51M|        lastCC=0;
  196|  4.51M|    }
_ZN6icu_7816ReorderingBuffer14writeCodePointEPDsi:
  216|  75.2k|    static void writeCodePoint(char16_t *p, UChar32 c) {
  217|  75.2k|        if(c<=0xffff) {
  ------------------
  |  Branch (217:12): [True: 0, False: 75.2k]
  ------------------
  218|      0|            *p = static_cast<char16_t>(c);
  219|  75.2k|        } else {
  220|  75.2k|            p[0]=U16_LEAD(c);
  ------------------
  |  |  123|  75.2k|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  221|  75.2k|            p[1]=U16_TRAIL(c);
  ------------------
  |  |  132|  75.2k|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  222|  75.2k|        }
  223|  75.2k|    }
_ZN6icu_7816ReorderingBuffer11setIteratorEv:
  233|  75.2k|    void setIterator() { codePointStart=limit; }
_ZN6icu_7815Normalizer2ImplC2Ev:
  248|      1|    Normalizer2Impl() : normTrie(nullptr), fCanonIterData(nullptr) {}
_ZNK6icu_7815Normalizer2Impl9getNorm16Ei:
  264|  26.8M|    uint16_t getNorm16(UChar32 c) const {
  265|  26.8M|        return U_IS_LEAD(c) ?
  ------------------
  |  |  177|  26.8M|#define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (177:22): [True: 0, False: 26.8M]
  |  |  ------------------
  ------------------
  266|      0|            static_cast<uint16_t>(INERT) :
  267|  26.8M|            UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c);
  ------------------
  |  |  358|  26.8M|#define UCPTRIE_FAST_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_CP_INDEX(trie, 0xffff, c))
  |  |  ------------------
  |  |  |  |  267|  26.8M|            UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c);
  |  |  |  |  ------------------
  |  |  |  |  |  |  326|  54.8M|#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (326:49): [True: 1.28k, False: 265k]
  |  |  |  |  |  |  |  Branch (326:49): [True: 267k, False: 0]
  |  |  |  |  |  |  |  Branch (326:49): [True: 26.6M, False: 267k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|  26.8M|    }
_ZNK6icu_7815Normalizer2Impl17isAlgorithmicNoNoEt:
  280|  7.95M|    UBool isAlgorithmicNoNo(uint16_t norm16) const { return limitNoNo<=norm16 && norm16<minMaybeNo; }
  ------------------
  |  Branch (280:61): [True: 301k, False: 7.65M]
  |  Branch (280:82): [True: 0, False: 301k]
  ------------------
_ZN6icu_7815Normalizer2Impl25getCCFromNormalYesOrMaybeEt:
  293|  8.94M|    static uint8_t getCCFromNormalYesOrMaybe(uint16_t norm16) {
  294|  8.94M|        return static_cast<uint8_t>(norm16 >> OFFSET_SHIFT);
  295|  8.94M|    }
_ZN6icu_7815Normalizer2Impl22getCCFromYesOrMaybeYesEt:
  296|  31.0M|    static uint8_t getCCFromYesOrMaybeYes(uint16_t norm16) {
  297|  31.0M|        return norm16>=MIN_NORMAL_MAYBE_YES ? getCCFromNormalYesOrMaybe(norm16) : 0;
  ------------------
  |  Branch (297:16): [True: 8.80M, False: 22.2M]
  ------------------
  298|  31.0M|    }
_ZNK6icu_7815Normalizer2Impl24getCCFromYesOrMaybeYesCPEi:
  299|  75.2k|    uint8_t getCCFromYesOrMaybeYesCP(UChar32 c) const {
  300|  75.2k|        if (c < minCompNoMaybeCP) { return 0; }
  ------------------
  |  Branch (300:13): [True: 0, False: 75.2k]
  ------------------
  301|  75.2k|        return getCCFromYesOrMaybeYes(getNorm16(c));
  302|  75.2k|    }
_ZNK6icu_7815Normalizer2Impl21hasCompBoundaryBeforeEi:
  542|  26.8M|    UBool hasCompBoundaryBefore(UChar32 c) const {
  543|  26.8M|        return c<minCompNoMaybeCP || norm16HasCompBoundaryBefore(getNorm16(c));
  ------------------
  |  Branch (543:16): [True: 0, False: 26.8M]
  |  Branch (543:38): [True: 22.9M, False: 3.84M]
  ------------------
  544|  26.8M|    }
_ZNK6icu_7815Normalizer2Impl7isMaybeEt:
  563|  30.8M|    UBool isMaybe(uint16_t norm16) const { return minMaybeNo<=norm16 && norm16<=JAMO_VT; }
  ------------------
  |  Branch (563:51): [True: 8.61M, False: 22.2M]
  |  Branch (563:73): [True: 8.49M, False: 118k]
  ------------------
_ZNK6icu_7815Normalizer2Impl21isMaybeYesOrNonZeroCCEt:
  564|   118k|    UBool isMaybeYesOrNonZeroCC(uint16_t norm16) const { return norm16>=minMaybeYes; }
_ZN6icu_7815Normalizer2Impl8isJamoVTEt:
  567|  4.52M|    static UBool isJamoVT(uint16_t norm16) { return norm16==JAMO_VT; }
_ZNK6icu_7815Normalizer2Impl9hangulLVTEv:
  568|  8.49M|    uint16_t hangulLVT() const { return minYesNoMappingsOnly|HAS_COMP_BOUNDARY_AFTER; }
_ZNK6icu_7815Normalizer2Impl10isHangulLVEt:
  569|  8.49M|    UBool isHangulLV(uint16_t norm16) const { return norm16==minYesNo; }
_ZNK6icu_7815Normalizer2Impl11isHangulLVTEt:
  570|  8.49M|    UBool isHangulLVT(uint16_t norm16) const {
  571|  8.49M|        return norm16==hangulLVT();
  572|  8.49M|    }
_ZNK6icu_7815Normalizer2Impl18isCompYesAndZeroCCEt:
  573|  43.6M|    UBool isCompYesAndZeroCC(uint16_t norm16) const { return norm16<minNoNo; }
_ZNK6icu_7815Normalizer2Impl21isDecompNoAlgorithmicEt:
  596|  16.1M|    UBool isDecompNoAlgorithmic(uint16_t norm16) const { return limitNoNo<=norm16 && norm16<minMaybeNo; }
  ------------------
  |  Branch (596:65): [True: 0, False: 16.1M]
  |  Branch (596:86): [True: 0, False: 0]
  ------------------
_ZNK6icu_7815Normalizer2Impl17getDataForYesOrNoEt:
  631|  11.6M|    const uint16_t *getDataForYesOrNo(uint16_t norm16) const {
  632|  11.6M|        return extraData+(norm16>>OFFSET_SHIFT);
  633|  11.6M|    }
_ZNK6icu_7815Normalizer2Impl7getDataEt:
  637|  17.3M|    const uint16_t *getData(uint16_t norm16) const {
  638|  17.3M|        if(norm16>=minMaybeNo) {
  ------------------
  |  Branch (638:12): [True: 0, False: 17.3M]
  ------------------
  639|      0|            norm16=norm16-minMaybeNo+limitNoNo;
  640|      0|        }
  641|  17.3M|        return extraData+(norm16>>OFFSET_SHIFT);
  642|  17.3M|    }
_ZNK6icu_7815Normalizer2Impl31getCompositionsListForDecompYesEt:
  643|  17.8M|    const uint16_t *getCompositionsListForDecompYes(uint16_t norm16) const {
  644|  17.8M|        if(norm16<JAMO_L || MIN_NORMAL_MAYBE_YES<=norm16) {
  ------------------
  |  Branch (644:12): [True: 8.95M, False: 8.84M]
  |  Branch (644:29): [True: 0, False: 8.84M]
  ------------------
  645|  8.95M|            return nullptr;
  646|  8.95M|        } else {
  647|       |            // if yesYes: if Jamo L: harmless empty list
  648|  8.84M|            return getData(norm16);
  649|  8.84M|        }
  650|  17.8M|    }
_ZNK6icu_7815Normalizer2Impl27norm16HasCompBoundaryBeforeEt:
  693|  30.9M|    UBool norm16HasCompBoundaryBefore(uint16_t norm16) const  {
  694|  30.9M|        return norm16 < minNoNoCompNoMaybeCC || isAlgorithmicNoNo(norm16);
  ------------------
  |  Branch (694:16): [True: 22.9M, False: 7.95M]
  |  Branch (694:49): [True: 0, False: 7.95M]
  ------------------
  695|  30.9M|    }
_ZNK6icu_7815Normalizer2Impl26norm16HasCompBoundaryAfterEta:
  702|  15.7M|    UBool norm16HasCompBoundaryAfter(uint16_t norm16, UBool onlyContiguous) const {
  703|  15.7M|        return (norm16 & HAS_COMP_BOUNDARY_AFTER) != 0 &&
  ------------------
  |  Branch (703:16): [True: 10.4M, False: 5.22M]
  ------------------
  704|  15.7M|            (!onlyContiguous || isTrailCC01ForCompBoundaryAfter(norm16));
  ------------------
  |  Branch (704:14): [True: 10.4M, False: 0]
  |  Branch (704:33): [True: 0, False: 0]
  ------------------
  705|  15.7M|    }

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

_ZN6icu_7812PatternProps12isWhiteSpaceEi:
  155|    218|PatternProps::isWhiteSpace(UChar32 c) {
  156|    218|    if(c<0) {
  ------------------
  |  Branch (156:8): [True: 13, False: 205]
  ------------------
  157|     13|        return false;
  158|    205|    } else if(c<=0xff) {
  ------------------
  |  Branch (158:15): [True: 197, False: 8]
  ------------------
  159|    197|        return (latin1[c] >> 2) & 1;
  160|    197|    } else if(0x200e<=c && c<=0x2029) {
  ------------------
  |  Branch (160:15): [True: 8, False: 0]
  |  Branch (160:28): [True: 0, False: 8]
  ------------------
  161|      0|        return c<=0x200f || 0x2028<=c;
  ------------------
  |  Branch (161:16): [True: 0, False: 0]
  |  Branch (161:29): [True: 0, False: 0]
  ------------------
  162|      8|    } else {
  163|      8|        return false;
  164|      8|    }
  165|    218|}
_ZN6icu_7812PatternProps14skipWhiteSpaceEPKDsi:
  168|     46|PatternProps::skipWhiteSpace(const char16_t *s, int32_t length) {
  169|     46|    while(length>0 && isWhiteSpace(*s)) {
  ------------------
  |  Branch (169:11): [True: 33, False: 13]
  |  Branch (169:23): [True: 0, False: 33]
  ------------------
  170|      0|        ++s;
  171|      0|        --length;
  172|      0|    }
  173|     46|    return s;
  174|     46|}

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

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

_ZN6icu_7822RuleBasedBreakIteratorC2EP11UDataMemoryaR10UErrorCode:
   92|  14.7k|        UErrorCode &status) : RuleBasedBreakIterator(udm, status)
   93|  14.7k|{
   94|  14.7k|    fIsPhraseBreaking = isPhraseBreaking;
   95|  14.7k|}
_ZN6icu_7822RuleBasedBreakIteratorC2EP11UDataMemoryR10UErrorCode:
  142|  14.7k| : RuleBasedBreakIterator(&status)
  143|  14.7k|{
  144|  14.7k|    fData = new RBBIDataWrapper(udm, status); // status checked in constructor
  145|  14.7k|    if (U_FAILURE(status)) {return;}
  ------------------
  |  Branch (145:9): [True: 0, False: 14.7k]
  ------------------
  146|  14.7k|    if(fData == nullptr) {
  ------------------
  |  Branch (146:8): [True: 0, False: 14.7k]
  ------------------
  147|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  148|      0|        return;
  149|      0|    }
  150|  14.7k|    if (fData->fForwardTable->fLookAheadResultsSize > 0) {
  ------------------
  |  Branch (150:9): [True: 4.45k, False: 10.3k]
  ------------------
  151|  4.45k|        fLookAheadMatches = static_cast<int32_t *>(
  152|  4.45k|            uprv_malloc(fData->fForwardTable->fLookAheadResultsSize * sizeof(int32_t)));
  ------------------
  |  | 1524|  4.45k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  4.45k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.45k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.45k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|  4.45k|        if (fLookAheadMatches == nullptr) {
  ------------------
  |  Branch (153:13): [True: 0, False: 4.45k]
  ------------------
  154|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  155|      0|            return;
  156|      0|        }
  157|  4.45k|    }
  158|  14.7k|}
_ZN6icu_7822RuleBasedBreakIteratorC2EP10UErrorCode:
  201|  14.7k|RuleBasedBreakIterator::RuleBasedBreakIterator(UErrorCode *status) {
  202|  14.7k|    UErrorCode ec = U_ZERO_ERROR;
  203|  14.7k|    if (status == nullptr) {
  ------------------
  |  Branch (203:9): [True: 0, False: 14.7k]
  ------------------
  204|      0|        status = &ec;
  205|      0|    }
  206|  14.7k|    utext_openUChars(&fText, nullptr, 0, status);
  ------------------
  |  | 1909|  14.7k|#define utext_openUChars U_ICU_ENTRY_POINT_RENAME(utext_openUChars)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|  14.7k|    LocalPointer<DictionaryCache> lpDictionaryCache(new DictionaryCache(this, *status), *status);
  208|  14.7k|    LocalPointer<BreakCache> lpBreakCache(new BreakCache(this, *status), *status);
  209|  14.7k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (209:9): [True: 0, False: 14.7k]
  ------------------
  210|      0|        fErrorCode = *status;
  211|      0|        return;
  212|      0|    }
  213|  14.7k|    fDictionaryCache = lpDictionaryCache.orphan();
  214|  14.7k|    fBreakCache = lpBreakCache.orphan();
  215|       |
  216|       |#ifdef RBBI_DEBUG
  217|       |    static UBool debugInitDone = false;
  218|       |    if (debugInitDone == false) {
  219|       |        char *debugEnv = getenv("U_RBBIDEBUG");
  220|       |        if (debugEnv && uprv_strstr(debugEnv, "trace")) {
  221|       |            gTrace = true;
  222|       |        }
  223|       |        debugInitDone = true;
  224|       |    }
  225|       |#endif
  226|  14.7k|}
_ZN6icu_7822RuleBasedBreakIteratorD2Ev:
  245|  14.7k|RuleBasedBreakIterator::~RuleBasedBreakIterator() {
  246|  14.7k|    if (fCharIter != &fSCharIter) {
  ------------------
  |  Branch (246:9): [True: 0, False: 14.7k]
  ------------------
  247|       |        // fCharIter was adopted from the outside.
  248|      0|        delete fCharIter;
  249|      0|    }
  250|  14.7k|    fCharIter = nullptr;
  251|       |
  252|  14.7k|    utext_close(&fText);
  ------------------
  |  | 1891|  14.7k|#define utext_close U_ICU_ENTRY_POINT_RENAME(utext_close)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|       |
  254|  14.7k|    if (fData != nullptr) {
  ------------------
  |  Branch (254:9): [True: 14.7k, False: 0]
  ------------------
  255|  14.7k|        fData->removeReference();
  256|  14.7k|        fData = nullptr;
  257|  14.7k|    }
  258|  14.7k|    delete fBreakCache;
  259|  14.7k|    fBreakCache = nullptr;
  260|       |
  261|  14.7k|    delete fDictionaryCache;
  262|  14.7k|    fDictionaryCache = nullptr;
  263|       |
  264|  14.7k|    delete fLanguageBreakEngines;
  265|  14.7k|    fLanguageBreakEngines = nullptr;
  266|       |
  267|  14.7k|    delete fUnhandledBreakEngine;
  268|  14.7k|    fUnhandledBreakEngine = nullptr;
  269|       |
  270|  14.7k|    uprv_free(fLookAheadMatches);
  ------------------
  |  | 1503|  14.7k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  271|  14.7k|    fLookAheadMatches = nullptr;
  272|  14.7k|}
_ZN6icu_7822RuleBasedBreakIterator7setTextEP5UTextR10UErrorCode:
  406|  7.39k|void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) {
  407|  7.39k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (407:9): [True: 0, False: 7.39k]
  ------------------
  408|      0|        return;
  409|      0|    }
  410|  7.39k|    fBreakCache->reset();
  411|  7.39k|    fDictionaryCache->reset();
  412|  7.39k|    utext_clone(&fText, ut, false, true, &status);
  ------------------
  |  | 1890|  7.39k|#define utext_clone U_ICU_ENTRY_POINT_RENAME(utext_clone)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  413|       |
  414|       |    // Set up a dummy CharacterIterator to be returned if anyone
  415|       |    //   calls getText().  With input from UText, there is no reasonable
  416|       |    //   way to return a characterIterator over the actual input text.
  417|       |    //   Return one over an empty string instead - this is the closest
  418|       |    //   we can come to signaling a failure.
  419|       |    //   (GetText() is obsolete, this failure is sort of OK)
  420|  7.39k|    fSCharIter.setText(u"", 0);
  421|       |
  422|  7.39k|    if (fCharIter != &fSCharIter) {
  ------------------
  |  Branch (422:9): [True: 0, False: 7.39k]
  ------------------
  423|       |        // existing fCharIter was adopted from the outside.  Delete it now.
  424|      0|        delete fCharIter;
  425|      0|    }
  426|  7.39k|    fCharIter = &fSCharIter;
  427|       |
  428|  7.39k|    this->first();
  429|  7.39k|}
_ZN6icu_7822RuleBasedBreakIterator5firstEv:
  541|  14.7k|int32_t RuleBasedBreakIterator::first() {
  542|  14.7k|    UErrorCode status = U_ZERO_ERROR;
  543|  14.7k|    if (!fBreakCache->seek(0)) {
  ------------------
  |  Branch (543:9): [True: 0, False: 14.7k]
  ------------------
  544|      0|        fBreakCache->populateNear(0, status);
  545|      0|    }
  546|  14.7k|    fBreakCache->current();
  547|  14.7k|    U_ASSERT(fPosition == 0);
  ------------------
  |  |   35|  14.7k|#   define U_ASSERT(exp) (void)0
  ------------------
  548|  14.7k|    return 0;
  549|  14.7k|}
_ZN6icu_7822RuleBasedBreakIterator4nextEv:
  593|  88.8M|int32_t RuleBasedBreakIterator::next() {
  594|  88.8M|    fBreakCache->next();
  595|  88.8M|    return fDone ? UBRK_DONE : fPosition;
  ------------------
  |  |  133|  7.39k|#define UBRK_DONE ((int32_t) -1)
  ------------------
  |  Branch (595:12): [True: 7.39k, False: 88.8M]
  ------------------
  596|  88.8M|}
_ZN6icu_7822RuleBasedBreakIterator10handleNextEv:
  736|  47.7M|int32_t RuleBasedBreakIterator::handleNext() {
  737|  47.7M|    const RBBIStateTable *statetable = fData->fForwardTable;
  738|  47.7M|    bool use8BitsTrie = ucptrie_getValueWidth(fData->fTrie) == UCPTRIE_VALUE_BITS_8;
  ------------------
  |  |  808|  47.7M|#define ucptrie_getValueWidth U_ICU_ENTRY_POINT_RENAME(ucptrie_getValueWidth)
  |  |  ------------------
  |  |  |  |  123|  47.7M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  47.7M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  47.7M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  739|  47.7M|    if (statetable->fFlags & RBBI_8BITS_ROWS) {
  ------------------
  |  Branch (739:9): [True: 24.4M, False: 23.3M]
  ------------------
  740|  24.4M|        if (use8BitsTrie) {
  ------------------
  |  Branch (740:13): [True: 24.4M, False: 0]
  ------------------
  741|  24.4M|            return handleNext<RBBIStateTableRow8, TrieFunc8>();
  742|  24.4M|        } else {
  743|      0|            return handleNext<RBBIStateTableRow8, TrieFunc16>();
  744|      0|        }
  745|  24.4M|    } else {
  746|  23.3M|        if (use8BitsTrie) {
  ------------------
  |  Branch (746:13): [True: 23.3M, False: 0]
  ------------------
  747|  23.3M|            return handleNext<RBBIStateTableRow16, TrieFunc8>();
  748|  23.3M|        } else {
  749|      0|            return handleNext<RBBIStateTableRow16, TrieFunc16>();
  750|      0|        }
  751|  23.3M|    }
  752|  47.7M|}
_ZN6icu_7823ensureLanguageFactoriesER10UErrorCode:
 1176|  45.3k|void ensureLanguageFactories(UErrorCode& status) {
 1177|  45.3k|    umtx_initOnce(gLanguageBreakFactoriesInitOnce, &initLanguageFactories, status);
 1178|  45.3k|}
_ZN6icu_7822RuleBasedBreakIterator22getLanguageBreakEngineEiPKc:
 1207|  2.56M|RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c, const char* locale) {
 1208|  2.56M|    const LanguageBreakEngine *lbe = nullptr;
 1209|  2.56M|    UErrorCode status = U_ZERO_ERROR;
 1210|       |
 1211|  2.56M|    if (fLanguageBreakEngines == nullptr) {
  ------------------
  |  Branch (1211:9): [True: 4.02k, False: 2.56M]
  ------------------
 1212|  4.02k|        fLanguageBreakEngines = new UStack(status);
 1213|  4.02k|        if (fLanguageBreakEngines == nullptr || U_FAILURE(status)) {
  ------------------
  |  Branch (1213:13): [True: 0, False: 4.02k]
  |  Branch (1213:49): [True: 0, False: 4.02k]
  ------------------
 1214|      0|            delete fLanguageBreakEngines;
 1215|      0|            fLanguageBreakEngines = nullptr;
 1216|      0|            return nullptr;
 1217|      0|        }
 1218|  4.02k|    }
 1219|       |
 1220|  2.56M|    int32_t i = fLanguageBreakEngines->size();
 1221|  6.96M|    while (--i >= 0) {
  ------------------
  |  Branch (1221:12): [True: 6.92M, False: 45.3k]
  ------------------
 1222|  6.92M|        lbe = static_cast<const LanguageBreakEngine*>(fLanguageBreakEngines->elementAt(i));
 1223|  6.92M|        if (lbe->handles(c, locale)) {
  ------------------
  |  Branch (1223:13): [True: 2.51M, False: 4.40M]
  ------------------
 1224|  2.51M|            return lbe;
 1225|  2.51M|        }
 1226|  6.92M|    }
 1227|       |
 1228|       |    // No existing dictionary took the character. See if a factory wants to
 1229|       |    // give us a new LanguageBreakEngine for this character.
 1230|  45.3k|    lbe = getLanguageBreakEngineFromFactory(c, locale);
 1231|       |
 1232|       |    // If we got one, use it and push it on our stack.
 1233|  45.3k|    if (lbe != nullptr) {
  ------------------
  |  Branch (1233:9): [True: 4.82k, False: 40.5k]
  ------------------
 1234|  4.82k|        fLanguageBreakEngines->push((void *)lbe, status);
 1235|       |        // Even if we can't remember it, we can keep looking it up, so
 1236|       |        // return it even if the push fails.
 1237|  4.82k|        return lbe;
 1238|  4.82k|    }
 1239|       |
 1240|       |    // No engine is forthcoming for this character. Add it to the
 1241|       |    // reject set. Create the reject break engine if needed.
 1242|  40.5k|    if (fUnhandledBreakEngine == nullptr) {
  ------------------
  |  Branch (1242:9): [True: 684, False: 39.8k]
  ------------------
 1243|    684|        fUnhandledBreakEngine = new UnhandledEngine(status);
 1244|    684|        if (U_SUCCESS(status) && fUnhandledBreakEngine == nullptr) {
  ------------------
  |  Branch (1244:13): [True: 684, False: 0]
  |  Branch (1244:34): [True: 0, False: 684]
  ------------------
 1245|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1246|      0|            return nullptr;
 1247|      0|        }
 1248|       |        // Put it last so that scripts for which we have an engine get tried
 1249|       |        // first.
 1250|    684|        fLanguageBreakEngines->insertElementAt(fUnhandledBreakEngine, 0, status);
 1251|       |        // If we can't insert it, or creation failed, get rid of it
 1252|    684|        U_ASSERT(!fLanguageBreakEngines->hasDeleter());
  ------------------
  |  |   35|    684|#   define U_ASSERT(exp) (void)0
  ------------------
 1253|    684|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1253:13): [True: 0, False: 684]
  ------------------
 1254|      0|            delete fUnhandledBreakEngine;
 1255|      0|            fUnhandledBreakEngine = nullptr;
 1256|      0|            return nullptr;
 1257|      0|        }
 1258|    684|    }
 1259|       |
 1260|       |    // Tell the reject engine about the character; at its discretion, it may
 1261|       |    // add more than just the one character.
 1262|  40.5k|    fUnhandledBreakEngine->handleCharacter(c);
 1263|       |
 1264|  40.5k|    return fUnhandledBreakEngine;
 1265|  40.5k|}
rbbi.cpp:_ZN6icu_78L21initLanguageFactoriesER10UErrorCode:
 1157|      1|static void U_CALLCONV initLanguageFactories(UErrorCode& status) {
 1158|      1|    U_ASSERT(gLanguageBreakFactories == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
 1159|      1|    gLanguageBreakFactories = new UStack(_deleteFactory, nullptr, status);
 1160|      1|    if (gLanguageBreakFactories != nullptr && U_SUCCESS(status)) {
  ------------------
  |  Branch (1160:9): [True: 1, False: 0]
  |  Branch (1160:47): [True: 1, False: 0]
  ------------------
 1161|      1|        LocalPointer<ICULanguageBreakFactory> factory(new ICULanguageBreakFactory(status), status);
 1162|      1|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1162:13): [True: 1, False: 0]
  ------------------
 1163|      1|            gICULanguageBreakFactory = factory.orphan();
 1164|      1|            gLanguageBreakFactories->push(gICULanguageBreakFactory, status);
 1165|       |#ifdef U_LOCAL_SERVICE_HOOK
 1166|       |            LanguageBreakFactory *extra = (LanguageBreakFactory *)uprv_svc_hook("languageBreakFactory", &status);
 1167|       |            if (extra != nullptr) {
 1168|       |                gLanguageBreakFactories->push(extra, status);
 1169|       |            }
 1170|       |#endif
 1171|      1|        }
 1172|      1|    }
 1173|      1|    ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_cleanup);
  ------------------
  |  |  196|      1|#define rbbi_cleanup U_ICU_ENTRY_POINT_RENAME(rbbi_cleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1174|      1|}
rbbi.cpp:_ZN6icu_78L33getLanguageBreakEngineFromFactoryEiPKc:
 1182|  45.3k|{
 1183|  45.3k|    UErrorCode status = U_ZERO_ERROR;
 1184|  45.3k|    ensureLanguageFactories(status);
 1185|  45.3k|    if (U_FAILURE(status)) return nullptr;
  ------------------
  |  Branch (1185:9): [True: 0, False: 45.3k]
  ------------------
 1186|       |
 1187|  45.3k|    int32_t i = gLanguageBreakFactories->size();
 1188|  45.3k|    const LanguageBreakEngine *lbe = nullptr;
 1189|  85.9k|    while (--i >= 0) {
  ------------------
  |  Branch (1189:12): [True: 45.3k, False: 40.5k]
  ------------------
 1190|  45.3k|        LanguageBreakFactory* factory = static_cast<LanguageBreakFactory*>(gLanguageBreakFactories->elementAt(i));
 1191|  45.3k|        lbe = factory->getEngineFor(c, locale);
 1192|  45.3k|        if (lbe != nullptr) {
  ------------------
  |  Branch (1192:13): [True: 4.82k, False: 40.5k]
  ------------------
 1193|  4.82k|            break;
 1194|  4.82k|        }
 1195|  45.3k|    }
 1196|  45.3k|    return lbe;
 1197|  45.3k|}
rbbi.cpp:_ZN6icu_7822RuleBasedBreakIterator10handleNextINS_18RBBIStateTableRowTIhEEXadL_ZNS_L9TrieFunc8EPK7UCPTrieiEEEEiv:
  780|  24.4M|int32_t RuleBasedBreakIterator::handleNext() {
  781|  24.4M|    int32_t             state;
  782|  24.4M|    uint16_t            category        = 0;
  783|  24.4M|    RBBIRunMode         mode;
  784|       |
  785|  24.4M|    RowType             *row;
  786|  24.4M|    UChar32             c;
  787|  24.4M|    int32_t             result             = 0;
  788|  24.4M|    int32_t             initialPosition    = 0;
  789|  24.4M|    const RBBIStateTable *statetable       = fData->fForwardTable;
  790|  24.4M|    const char         *tableData          = statetable->fTableData;
  791|  24.4M|    uint32_t            tableRowLen        = statetable->fRowLen;
  792|  24.4M|    uint32_t            dictStart          = statetable->fDictCategoriesStart;
  793|       |    #ifdef RBBI_DEBUG
  794|       |        if (gTrace) {
  795|       |            RBBIDebugPuts("Handle Next   pos   char  state category");
  796|       |        }
  797|       |    #endif
  798|       |
  799|       |    // handleNext always sets the break tag value.
  800|       |    // Set the default for it.
  801|  24.4M|    fRuleStatusIndex = 0;
  802|       |
  803|  24.4M|    fDictionaryCharCount = 0;
  804|       |
  805|       |    // if we're already at the end of the text, return DONE.
  806|  24.4M|    initialPosition = fPosition;
  807|  24.4M|    UTEXT_SETNATIVEINDEX(&fText, initialPosition);
  ------------------
  |  |  750|  24.4M|#define UTEXT_SETNATIVEINDEX(ut, ix) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  24.4M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  751|  24.4M|    int64_t __offset = (ix) - (ut)->chunkNativeStart; \
  |  |  752|  24.4M|    if (__offset>=0 && __offset<(int64_t)(ut)->nativeIndexingLimit && (ut)->chunkContents[__offset]<0xdc00) { \
  |  |  ------------------
  |  |  |  Branch (752:9): [True: 24.4M, False: 0]
  |  |  |  Branch (752:24): [True: 24.4M, False: 8.89k]
  |  |  |  Branch (752:71): [True: 21.7M, False: 2.61M]
  |  |  ------------------
  |  |  753|  21.7M|        (ut)->chunkOffset=(int32_t)__offset; \
  |  |  754|  21.7M|    } else { \
  |  |  755|  2.62M|        utext_setNativeIndex((ut), (ix)); \
  |  |  ------------------
  |  |  |  | 1915|  2.62M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  756|  2.62M|    } \
  |  |  757|  24.4M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  24.4M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|  24.4M|    result          = initialPosition;
  809|  24.4M|    c               = UTEXT_NEXT32(&fText);
  ------------------
  |  |  704|  24.4M|    ((ut)->chunkOffset < (ut)->chunkLength && ((ut)->chunkContents)[(ut)->chunkOffset]<0xd800 ? \
  |  |  ------------------
  |  |  |  Branch (704:6): [True: 24.4M, False: 8.89k]
  |  |  |  Branch (704:47): [True: 21.5M, False: 2.83M]
  |  |  ------------------
  |  |  705|  24.4M|    ((ut)->chunkContents)[((ut)->chunkOffset)++] : utext_next32(ut))
  |  |  ------------------
  |  |  |  | 1904|  2.83M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  2.83M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  2.83M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  2.83M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  810|  24.4M|    if (c==U_SENTINEL) {
  ------------------
  |  |  469|  24.4M|#define U_SENTINEL (-1)
  ------------------
  |  Branch (810:9): [True: 8.89k, False: 24.4M]
  ------------------
  811|  8.89k|        fDone = true;
  812|  8.89k|        return UBRK_DONE;
  ------------------
  |  |  133|  8.89k|#define UBRK_DONE ((int32_t) -1)
  ------------------
  813|  8.89k|    }
  814|       |
  815|       |    //  Set the initial state for the state machine
  816|  24.4M|    state = START_STATE;
  817|  24.4M|    row = (RowType *)
  818|       |            //(statetable->fTableData + (statetable->fRowLen * state));
  819|  24.4M|            (tableData + tableRowLen * state);
  820|       |
  821|       |
  822|  24.4M|    mode     = RBBI_RUN;
  823|  24.4M|    if (statetable->fFlags & RBBI_BOF_REQUIRED) {
  ------------------
  |  Branch (823:9): [True: 1.63k, False: 24.4M]
  ------------------
  824|  1.63k|        category = 2;
  825|  1.63k|        mode     = RBBI_START;
  826|  1.63k|    }
  827|       |
  828|       |
  829|       |    // loop until we reach the end of the text or transition to state 0
  830|       |    //
  831|   140M|    for (;;) {
  832|   140M|        if (c == U_SENTINEL) {
  ------------------
  |  |  469|   140M|#define U_SENTINEL (-1)
  ------------------
  |  Branch (832:13): [True: 7.80k, False: 140M]
  ------------------
  833|       |            // Reached end of input string.
  834|  7.80k|            if (mode == RBBI_END) {
  ------------------
  |  Branch (834:17): [True: 985, False: 6.82k]
  ------------------
  835|       |                // We have already run the loop one last time with the
  836|       |                //   character set to the psueudo {eof} value.  Now it is time
  837|       |                //   to unconditionally bail out.
  838|    985|                break;
  839|    985|            }
  840|       |            // Run the loop one last time with the fake end-of-input character category.
  841|  6.82k|            mode = RBBI_END;
  842|  6.82k|            category = 1;
  843|  6.82k|        }
  844|       |
  845|       |        //
  846|       |        // Get the char category.  An incoming category of 1 or 2 means that
  847|       |        //      we are preset for doing the beginning or end of input, and
  848|       |        //      that we shouldn't get a category from an actual text input character.
  849|       |        //
  850|   140M|        if (mode == RBBI_RUN) {
  ------------------
  |  Branch (850:13): [True: 140M, False: 8.45k]
  ------------------
  851|       |            // look up the current character's character category, which tells us
  852|       |            // which column in the state table to look at.
  853|   140M|            category = trieFunc(fData->fTrie, c);
  854|   140M|            fDictionaryCharCount += (category >= dictStart);
  855|   140M|        }
  856|       |
  857|       |       #ifdef RBBI_DEBUG
  858|       |            if (gTrace) {
  859|       |                RBBIDebugPrintf("             %4" PRId64 "   ", utext_getNativeIndex(&fText));
  860|       |                if (0x20<=c && c<0x7f) {
  861|       |                    RBBIDebugPrintf("\"%c\"  ", c);
  862|       |                } else {
  863|       |                    RBBIDebugPrintf("%5x  ", c);
  864|       |                }
  865|       |                RBBIDebugPrintf("%3d  %3d\n", state, category);
  866|       |            }
  867|       |        #endif
  868|       |
  869|       |        // State Transition - move machine to its next state
  870|       |        //
  871|       |
  872|       |        // fNextState is a variable-length array.
  873|   140M|        U_ASSERT(category<fData->fHeader->fCatCount);
  ------------------
  |  |   35|   140M|#   define U_ASSERT(exp) (void)0
  ------------------
  874|   140M|        state = row->fNextState[category];  /*Not accessing beyond memory*/
  875|   140M|        row = (RowType *)
  876|       |            // (statetable->fTableData + (statetable->fRowLen * state));
  877|   140M|            (tableData + tableRowLen * state);
  878|       |
  879|       |
  880|   140M|        uint16_t accepting = row->fAccepting;
  881|   140M|        if (accepting == ACCEPTING_UNCONDITIONAL) {
  ------------------
  |  Branch (881:13): [True: 116M, False: 24.4M]
  ------------------
  882|       |            // Match found, common case.
  883|   116M|            if (mode != RBBI_START) {
  ------------------
  |  Branch (883:17): [True: 116M, False: 1.63k]
  ------------------
  884|   116M|                result = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(&fText));
  ------------------
  |  |  735|   116M|    ((ut)->chunkOffset <= (ut)->nativeIndexingLimit?   \
  |  |  ------------------
  |  |  |  Branch (735:6): [True: 116M, False: 0]
  |  |  ------------------
  |  |  736|   116M|        (ut)->chunkNativeStart+(ut)->chunkOffset :     \
  |  |  737|   116M|        (ut)->pFuncs->mapOffsetToNative(ut))    
  ------------------
  885|   116M|            }
  886|   116M|            fRuleStatusIndex = row->fTagsIdx;   // Remember the break status (tag) values.
  887|   116M|        } else if (accepting > ACCEPTING_UNCONDITIONAL) {
  ------------------
  |  Branch (887:20): [True: 0, False: 24.4M]
  ------------------
  888|       |            // Lookahead match is completed.
  889|      0|            U_ASSERT(accepting < fData->fForwardTable->fLookAheadResultsSize);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  890|      0|            int32_t lookaheadResult = fLookAheadMatches[accepting];
  891|      0|            if (lookaheadResult >= 0) {
  ------------------
  |  Branch (891:17): [True: 0, False: 0]
  ------------------
  892|      0|                fRuleStatusIndex = row->fTagsIdx;
  893|      0|                fPosition = lookaheadResult;
  894|      0|                return lookaheadResult;
  895|      0|            }
  896|      0|        }
  897|       |
  898|       |        // If we are at the position of the '/' in a look-ahead (hard break) rule;
  899|       |        // record the current position, to be returned later, if the full rule matches.
  900|       |        // TODO: Move this check before the previous check of fAccepting.
  901|       |        //       This would enable hard-break rules with no following context.
  902|       |        //       But there are line break test failures when trying this. Investigate.
  903|       |        //       Issue ICU-20837
  904|   140M|        uint16_t rule = row->fLookAhead;
  905|   140M|        U_ASSERT(rule == 0 || rule > ACCEPTING_UNCONDITIONAL);
  ------------------
  |  |   35|   140M|#   define U_ASSERT(exp) (void)0
  ------------------
  906|   140M|        U_ASSERT(rule == 0 || rule < fData->fForwardTable->fLookAheadResultsSize);
  ------------------
  |  |   35|   140M|#   define U_ASSERT(exp) (void)0
  ------------------
  907|   140M|        if (rule > ACCEPTING_UNCONDITIONAL) {
  ------------------
  |  Branch (907:13): [True: 0, False: 140M]
  ------------------
  908|      0|            int32_t pos = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(&fText));
  ------------------
  |  |  735|      0|    ((ut)->chunkOffset <= (ut)->nativeIndexingLimit?   \
  |  |  ------------------
  |  |  |  Branch (735:6): [True: 0, False: 0]
  |  |  ------------------
  |  |  736|      0|        (ut)->chunkNativeStart+(ut)->chunkOffset :     \
  |  |  737|      0|        (ut)->pFuncs->mapOffsetToNative(ut))    
  ------------------
  909|      0|            fLookAheadMatches[rule] = pos;
  910|      0|        }
  911|       |
  912|   140M|        if (state == STOP_STATE) {
  ------------------
  |  Branch (912:13): [True: 24.4M, False: 116M]
  ------------------
  913|       |            // This is the normal exit from the lookup state machine.
  914|       |            // We have advanced through the string until it is certain that no
  915|       |            //   longer match is possible, no matter what characters follow.
  916|  24.4M|            break;
  917|  24.4M|        }
  918|       |
  919|       |        // Advance to the next character.
  920|       |        // If this is a beginning-of-input loop iteration, don't advance
  921|       |        //    the input position.  The next iteration will be processing the
  922|       |        //    first real input character.
  923|   116M|        if (mode == RBBI_RUN) {
  ------------------
  |  Branch (923:13): [True: 116M, False: 2.61k]
  ------------------
  924|   116M|            c = UTEXT_NEXT32(&fText);
  ------------------
  |  |  704|   116M|    ((ut)->chunkOffset < (ut)->chunkLength && ((ut)->chunkContents)[(ut)->chunkOffset]<0xd800 ? \
  |  |  ------------------
  |  |  |  Branch (704:6): [True: 116M, False: 6.82k]
  |  |  |  Branch (704:47): [True: 103M, False: 12.8M]
  |  |  ------------------
  |  |  705|   116M|    ((ut)->chunkContents)[((ut)->chunkOffset)++] : utext_next32(ut))
  |  |  ------------------
  |  |  |  | 1904|  12.8M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  12.8M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  12.8M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  12.8M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  925|   116M|        } else {
  926|  2.61k|            if (mode == RBBI_START) {
  ------------------
  |  Branch (926:17): [True: 1.63k, False: 985]
  ------------------
  927|  1.63k|                mode = RBBI_RUN;
  928|  1.63k|            }
  929|  2.61k|        }
  930|   116M|    }
  931|       |
  932|       |    // The state machine is done.  Check whether it found a match...
  933|       |
  934|       |    // If the iterator failed to advance in the match engine, force it ahead by one.
  935|       |    //   (This really indicates a defect in the break rules.  They should always match
  936|       |    //    at least one character.)
  937|  24.4M|    if (result == initialPosition) {
  ------------------
  |  Branch (937:9): [True: 0, False: 24.4M]
  ------------------
  938|      0|        utext_setNativeIndex(&fText, initialPosition);
  ------------------
  |  | 1915|      0|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  939|      0|        utext_next32(&fText);
  ------------------
  |  | 1904|      0|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  940|      0|        result = static_cast<int32_t>(utext_getNativeIndex(&fText));
  ------------------
  |  | 1897|      0|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  941|      0|        fRuleStatusIndex = 0;
  942|      0|    }
  943|       |
  944|       |    // Leave the iterator at our result position.
  945|  24.4M|    fPosition = result;
  946|       |    #ifdef RBBI_DEBUG
  947|       |        if (gTrace) {
  948|       |            RBBIDebugPrintf("result = %d\n\n", result);
  949|       |        }
  950|       |    #endif
  951|  24.4M|    return result;
  952|  24.4M|}
rbbi.cpp:_ZN6icu_78L9TrieFunc8EPK7UCPTriei:
  728|   197M|static inline uint16_t TrieFunc8(const UCPTrie *trie, UChar32 c) {
  729|   197M|    return UCPTRIE_FAST_GET(trie, UCPTRIE_8, c);
  ------------------
  |  |  358|   197M|#define UCPTRIE_FAST_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_CP_INDEX(trie, 0xffff, c))
  |  |  ------------------
  |  |  |  |  729|   197M|    return UCPTRIE_FAST_GET(trie, UCPTRIE_8, c);
  |  |  |  |  ------------------
  |  |  |  |  |  |  346|   396M|#define UCPTRIE_8(trie, i) ((trie)->data.ptr8[i])
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (346:47): [True: 7.34k, False: 547k]
  |  |  |  |  |  |  |  Branch (346:47): [True: 554k, False: 0]
  |  |  |  |  |  |  |  Branch (346:47): [True: 196M, False: 554k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  730|   197M|}
rbbi.cpp:_ZN6icu_7822RuleBasedBreakIterator10handleNextINS_18RBBIStateTableRowTItEEXadL_ZNS_L9TrieFunc8EPK7UCPTrieiEEEEiv:
  780|  23.3M|int32_t RuleBasedBreakIterator::handleNext() {
  781|  23.3M|    int32_t             state;
  782|  23.3M|    uint16_t            category        = 0;
  783|  23.3M|    RBBIRunMode         mode;
  784|       |
  785|  23.3M|    RowType             *row;
  786|  23.3M|    UChar32             c;
  787|  23.3M|    int32_t             result             = 0;
  788|  23.3M|    int32_t             initialPosition    = 0;
  789|  23.3M|    const RBBIStateTable *statetable       = fData->fForwardTable;
  790|  23.3M|    const char         *tableData          = statetable->fTableData;
  791|  23.3M|    uint32_t            tableRowLen        = statetable->fRowLen;
  792|  23.3M|    uint32_t            dictStart          = statetable->fDictCategoriesStart;
  793|       |    #ifdef RBBI_DEBUG
  794|       |        if (gTrace) {
  795|       |            RBBIDebugPuts("Handle Next   pos   char  state category");
  796|       |        }
  797|       |    #endif
  798|       |
  799|       |    // handleNext always sets the break tag value.
  800|       |    // Set the default for it.
  801|  23.3M|    fRuleStatusIndex = 0;
  802|       |
  803|  23.3M|    fDictionaryCharCount = 0;
  804|       |
  805|       |    // if we're already at the end of the text, return DONE.
  806|  23.3M|    initialPosition = fPosition;
  807|  23.3M|    UTEXT_SETNATIVEINDEX(&fText, initialPosition);
  ------------------
  |  |  750|  23.3M|#define UTEXT_SETNATIVEINDEX(ut, ix) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  23.3M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  751|  23.3M|    int64_t __offset = (ix) - (ut)->chunkNativeStart; \
  |  |  752|  23.3M|    if (__offset>=0 && __offset<(int64_t)(ut)->nativeIndexingLimit && (ut)->chunkContents[__offset]<0xdc00) { \
  |  |  ------------------
  |  |  |  Branch (752:9): [True: 23.3M, False: 0]
  |  |  |  Branch (752:24): [True: 23.3M, False: 3.31k]
  |  |  |  Branch (752:71): [True: 23.1M, False: 212k]
  |  |  ------------------
  |  |  753|  23.1M|        (ut)->chunkOffset=(int32_t)__offset; \
  |  |  754|  23.1M|    } else { \
  |  |  755|   215k|        utext_setNativeIndex((ut), (ix)); \
  |  |  ------------------
  |  |  |  | 1915|   215k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   215k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   215k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   215k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  756|   215k|    } \
  |  |  757|  23.3M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  23.3M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|  23.3M|    result          = initialPosition;
  809|  23.3M|    c               = UTEXT_NEXT32(&fText);
  ------------------
  |  |  704|  23.3M|    ((ut)->chunkOffset < (ut)->chunkLength && ((ut)->chunkContents)[(ut)->chunkOffset]<0xd800 ? \
  |  |  ------------------
  |  |  |  Branch (704:6): [True: 23.3M, False: 3.31k]
  |  |  |  Branch (704:47): [True: 23.0M, False: 232k]
  |  |  ------------------
  |  |  705|  23.3M|    ((ut)->chunkContents)[((ut)->chunkOffset)++] : utext_next32(ut))
  |  |  ------------------
  |  |  |  | 1904|   235k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   235k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   235k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   235k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  810|  23.3M|    if (c==U_SENTINEL) {
  ------------------
  |  |  469|  23.3M|#define U_SENTINEL (-1)
  ------------------
  |  Branch (810:9): [True: 3.31k, False: 23.3M]
  ------------------
  811|  3.31k|        fDone = true;
  812|  3.31k|        return UBRK_DONE;
  ------------------
  |  |  133|  3.31k|#define UBRK_DONE ((int32_t) -1)
  ------------------
  813|  3.31k|    }
  814|       |
  815|       |    //  Set the initial state for the state machine
  816|  23.3M|    state = START_STATE;
  817|  23.3M|    row = (RowType *)
  818|       |            //(statetable->fTableData + (statetable->fRowLen * state));
  819|  23.3M|            (tableData + tableRowLen * state);
  820|       |
  821|       |
  822|  23.3M|    mode     = RBBI_RUN;
  823|  23.3M|    if (statetable->fFlags & RBBI_BOF_REQUIRED) {
  ------------------
  |  Branch (823:9): [True: 0, False: 23.3M]
  ------------------
  824|      0|        category = 2;
  825|      0|        mode     = RBBI_START;
  826|      0|    }
  827|       |
  828|       |
  829|       |    // loop until we reach the end of the text or transition to state 0
  830|       |    //
  831|  56.3M|    for (;;) {
  832|  56.3M|        if (c == U_SENTINEL) {
  ------------------
  |  |  469|  56.3M|#define U_SENTINEL (-1)
  ------------------
  |  Branch (832:13): [True: 2.04k, False: 56.3M]
  ------------------
  833|       |            // Reached end of input string.
  834|  2.04k|            if (mode == RBBI_END) {
  ------------------
  |  Branch (834:17): [True: 7, False: 2.03k]
  ------------------
  835|       |                // We have already run the loop one last time with the
  836|       |                //   character set to the psueudo {eof} value.  Now it is time
  837|       |                //   to unconditionally bail out.
  838|      7|                break;
  839|      7|            }
  840|       |            // Run the loop one last time with the fake end-of-input character category.
  841|  2.03k|            mode = RBBI_END;
  842|  2.03k|            category = 1;
  843|  2.03k|        }
  844|       |
  845|       |        //
  846|       |        // Get the char category.  An incoming category of 1 or 2 means that
  847|       |        //      we are preset for doing the beginning or end of input, and
  848|       |        //      that we shouldn't get a category from an actual text input character.
  849|       |        //
  850|  56.3M|        if (mode == RBBI_RUN) {
  ------------------
  |  Branch (850:13): [True: 56.3M, False: 2.03k]
  ------------------
  851|       |            // look up the current character's character category, which tells us
  852|       |            // which column in the state table to look at.
  853|  56.3M|            category = trieFunc(fData->fTrie, c);
  854|  56.3M|            fDictionaryCharCount += (category >= dictStart);
  855|  56.3M|        }
  856|       |
  857|       |       #ifdef RBBI_DEBUG
  858|       |            if (gTrace) {
  859|       |                RBBIDebugPrintf("             %4" PRId64 "   ", utext_getNativeIndex(&fText));
  860|       |                if (0x20<=c && c<0x7f) {
  861|       |                    RBBIDebugPrintf("\"%c\"  ", c);
  862|       |                } else {
  863|       |                    RBBIDebugPrintf("%5x  ", c);
  864|       |                }
  865|       |                RBBIDebugPrintf("%3d  %3d\n", state, category);
  866|       |            }
  867|       |        #endif
  868|       |
  869|       |        // State Transition - move machine to its next state
  870|       |        //
  871|       |
  872|       |        // fNextState is a variable-length array.
  873|  56.3M|        U_ASSERT(category<fData->fHeader->fCatCount);
  ------------------
  |  |   35|  56.3M|#   define U_ASSERT(exp) (void)0
  ------------------
  874|  56.3M|        state = row->fNextState[category];  /*Not accessing beyond memory*/
  875|  56.3M|        row = (RowType *)
  876|       |            // (statetable->fTableData + (statetable->fRowLen * state));
  877|  56.3M|            (tableData + tableRowLen * state);
  878|       |
  879|       |
  880|  56.3M|        uint16_t accepting = row->fAccepting;
  881|  56.3M|        if (accepting == ACCEPTING_UNCONDITIONAL) {
  ------------------
  |  Branch (881:13): [True: 33.0M, False: 23.3M]
  ------------------
  882|       |            // Match found, common case.
  883|  33.0M|            if (mode != RBBI_START) {
  ------------------
  |  Branch (883:17): [True: 33.0M, False: 0]
  ------------------
  884|  33.0M|                result = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(&fText));
  ------------------
  |  |  735|  33.0M|    ((ut)->chunkOffset <= (ut)->nativeIndexingLimit?   \
  |  |  ------------------
  |  |  |  Branch (735:6): [True: 33.0M, False: 0]
  |  |  ------------------
  |  |  736|  33.0M|        (ut)->chunkNativeStart+(ut)->chunkOffset :     \
  |  |  737|  33.0M|        (ut)->pFuncs->mapOffsetToNative(ut))    
  ------------------
  885|  33.0M|            }
  886|  33.0M|            fRuleStatusIndex = row->fTagsIdx;   // Remember the break status (tag) values.
  887|  33.0M|        } else if (accepting > ACCEPTING_UNCONDITIONAL) {
  ------------------
  |  Branch (887:20): [True: 3.47k, False: 23.3M]
  ------------------
  888|       |            // Lookahead match is completed.
  889|  3.47k|            U_ASSERT(accepting < fData->fForwardTable->fLookAheadResultsSize);
  ------------------
  |  |   35|  3.47k|#   define U_ASSERT(exp) (void)0
  ------------------
  890|  3.47k|            int32_t lookaheadResult = fLookAheadMatches[accepting];
  891|  3.47k|            if (lookaheadResult >= 0) {
  ------------------
  |  Branch (891:17): [True: 3.47k, False: 0]
  ------------------
  892|  3.47k|                fRuleStatusIndex = row->fTagsIdx;
  893|  3.47k|                fPosition = lookaheadResult;
  894|  3.47k|                return lookaheadResult;
  895|  3.47k|            }
  896|  3.47k|        }
  897|       |
  898|       |        // If we are at the position of the '/' in a look-ahead (hard break) rule;
  899|       |        // record the current position, to be returned later, if the full rule matches.
  900|       |        // TODO: Move this check before the previous check of fAccepting.
  901|       |        //       This would enable hard-break rules with no following context.
  902|       |        //       But there are line break test failures when trying this. Investigate.
  903|       |        //       Issue ICU-20837
  904|  56.3M|        uint16_t rule = row->fLookAhead;
  905|  56.3M|        U_ASSERT(rule == 0 || rule > ACCEPTING_UNCONDITIONAL);
  ------------------
  |  |   35|  56.3M|#   define U_ASSERT(exp) (void)0
  ------------------
  906|  56.3M|        U_ASSERT(rule == 0 || rule < fData->fForwardTable->fLookAheadResultsSize);
  ------------------
  |  |   35|  56.3M|#   define U_ASSERT(exp) (void)0
  ------------------
  907|  56.3M|        if (rule > ACCEPTING_UNCONDITIONAL) {
  ------------------
  |  Branch (907:13): [True: 21.5M, False: 34.7M]
  ------------------
  908|  21.5M|            int32_t pos = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(&fText));
  ------------------
  |  |  735|  21.5M|    ((ut)->chunkOffset <= (ut)->nativeIndexingLimit?   \
  |  |  ------------------
  |  |  |  Branch (735:6): [True: 21.5M, False: 0]
  |  |  ------------------
  |  |  736|  21.5M|        (ut)->chunkNativeStart+(ut)->chunkOffset :     \
  |  |  737|  21.5M|        (ut)->pFuncs->mapOffsetToNative(ut))    
  ------------------
  909|  21.5M|            fLookAheadMatches[rule] = pos;
  910|  21.5M|        }
  911|       |
  912|  56.3M|        if (state == STOP_STATE) {
  ------------------
  |  Branch (912:13): [True: 23.3M, False: 33.0M]
  ------------------
  913|       |            // This is the normal exit from the lookup state machine.
  914|       |            // We have advanced through the string until it is certain that no
  915|       |            //   longer match is possible, no matter what characters follow.
  916|  23.3M|            break;
  917|  23.3M|        }
  918|       |
  919|       |        // Advance to the next character.
  920|       |        // If this is a beginning-of-input loop iteration, don't advance
  921|       |        //    the input position.  The next iteration will be processing the
  922|       |        //    first real input character.
  923|  33.0M|        if (mode == RBBI_RUN) {
  ------------------
  |  Branch (923:13): [True: 33.0M, False: 7]
  ------------------
  924|  33.0M|            c = UTEXT_NEXT32(&fText);
  ------------------
  |  |  704|  33.0M|    ((ut)->chunkOffset < (ut)->chunkLength && ((ut)->chunkContents)[(ut)->chunkOffset]<0xd800 ? \
  |  |  ------------------
  |  |  |  Branch (704:6): [True: 33.0M, False: 2.03k]
  |  |  |  Branch (704:47): [True: 32.5M, False: 432k]
  |  |  ------------------
  |  |  705|  33.0M|    ((ut)->chunkContents)[((ut)->chunkOffset)++] : utext_next32(ut))
  |  |  ------------------
  |  |  |  | 1904|   434k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   434k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   434k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   434k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  925|  33.0M|        } else {
  926|      7|            if (mode == RBBI_START) {
  ------------------
  |  Branch (926:17): [True: 0, False: 7]
  ------------------
  927|      0|                mode = RBBI_RUN;
  928|      0|            }
  929|      7|        }
  930|  33.0M|    }
  931|       |
  932|       |    // The state machine is done.  Check whether it found a match...
  933|       |
  934|       |    // If the iterator failed to advance in the match engine, force it ahead by one.
  935|       |    //   (This really indicates a defect in the break rules.  They should always match
  936|       |    //    at least one character.)
  937|  23.3M|    if (result == initialPosition) {
  ------------------
  |  Branch (937:9): [True: 0, False: 23.3M]
  ------------------
  938|      0|        utext_setNativeIndex(&fText, initialPosition);
  ------------------
  |  | 1915|      0|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  939|      0|        utext_next32(&fText);
  ------------------
  |  | 1904|      0|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  940|      0|        result = static_cast<int32_t>(utext_getNativeIndex(&fText));
  ------------------
  |  | 1897|      0|#define utext_getNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_getNativeIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  941|      0|        fRuleStatusIndex = 0;
  942|      0|    }
  943|       |
  944|       |    // Leave the iterator at our result position.
  945|  23.3M|    fPosition = result;
  946|       |    #ifdef RBBI_DEBUG
  947|       |        if (gTrace) {
  948|       |            RBBIDebugPrintf("result = %d\n\n", result);
  949|       |        }
  950|       |    #endif
  951|  23.3M|    return result;
  952|  23.3M|}

_ZN6icu_7822RuleBasedBreakIterator15DictionaryCacheC2EPS0_R10UErrorCode:
   29|  14.7k|        fBI(bi), fBreaks(status), fPositionInCache(-1),
   30|  14.7k|        fStart(0), fLimit(0), fFirstRuleStatusIndex(0), fOtherRuleStatusIndex(0) {
   31|  14.7k|}
_ZN6icu_7822RuleBasedBreakIterator15DictionaryCacheD2Ev:
   33|  14.7k|RuleBasedBreakIterator::DictionaryCache::~DictionaryCache() {
   34|  14.7k|}
_ZN6icu_7822RuleBasedBreakIterator15DictionaryCache5resetEv:
   36|  2.56M|void RuleBasedBreakIterator::DictionaryCache::reset() {
   37|  2.56M|    fPositionInCache = -1;
   38|  2.56M|    fStart = 0;
   39|  2.56M|    fLimit = 0;
   40|  2.56M|    fFirstRuleStatusIndex = 0;
   41|  2.56M|    fOtherRuleStatusIndex = 0;
   42|  2.56M|    fBreaks.removeAllElements();
   43|  2.56M|}
_ZN6icu_7822RuleBasedBreakIterator15DictionaryCache9followingEiPiS2_:
   45|  68.7M|UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_t *result, int32_t *statusIndex) {
   46|  68.7M|    if (fromPos >= fLimit || fromPos < fStart) {
  ------------------
  |  Branch (46:9): [True: 19.1M, False: 49.6M]
  |  Branch (46:30): [True: 0, False: 49.6M]
  ------------------
   47|  19.1M|        fPositionInCache = -1;
   48|  19.1M|        return false;
   49|  19.1M|    }
   50|       |
   51|       |    // Sequential iteration, move from previous boundary to the following
   52|       |
   53|  49.6M|    int32_t r = 0;
   54|  49.6M|    if (fPositionInCache >= 0 && fPositionInCache < fBreaks.size() && fBreaks.elementAti(fPositionInCache) == fromPos) {
  ------------------
  |  Branch (54:9): [True: 49.6M, False: 0]
  |  Branch (54:34): [True: 49.6M, False: 0]
  |  Branch (54:71): [True: 49.6M, False: 0]
  ------------------
   55|  49.6M|        ++fPositionInCache;
   56|  49.6M|        if (fPositionInCache >= fBreaks.size()) {
  ------------------
  |  Branch (56:13): [True: 0, False: 49.6M]
  ------------------
   57|      0|            fPositionInCache = -1;
   58|      0|            return false;
   59|      0|        }
   60|  49.6M|        r = fBreaks.elementAti(fPositionInCache);
   61|  49.6M|        U_ASSERT(r > fromPos);
  ------------------
  |  |   35|  49.6M|#   define U_ASSERT(exp) (void)0
  ------------------
   62|  49.6M|        *result = r;
   63|  49.6M|        *statusIndex = fOtherRuleStatusIndex;
   64|  49.6M|        return true;
   65|  49.6M|    }
   66|       |
   67|       |    // Random indexing. Linear search for the boundary following the given position.
   68|       |
   69|      0|    for (fPositionInCache = 0; fPositionInCache < fBreaks.size(); ++fPositionInCache) {
  ------------------
  |  Branch (69:32): [True: 0, False: 0]
  ------------------
   70|      0|        r= fBreaks.elementAti(fPositionInCache);
   71|      0|        if (r > fromPos) {
  ------------------
  |  Branch (71:13): [True: 0, False: 0]
  ------------------
   72|      0|            *result = r;
   73|      0|            *statusIndex = fOtherRuleStatusIndex;
   74|      0|            return true;
   75|      0|        }
   76|      0|    }
   77|      0|    UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   78|      0|}
_ZN6icu_7822RuleBasedBreakIterator15DictionaryCache18populateDictionaryEiiii:
  121|  8.22M|                                       int32_t firstRuleStatus, int32_t otherRuleStatus) {
  122|  8.22M|    if ((endPos - startPos) <= 1) {
  ------------------
  |  Branch (122:9): [True: 5.67M, False: 2.55M]
  ------------------
  123|  5.67M|        return;
  124|  5.67M|    }
  125|       |
  126|  2.55M|    reset();
  127|  2.55M|    fFirstRuleStatusIndex = firstRuleStatus;
  128|  2.55M|    fOtherRuleStatusIndex = otherRuleStatus;
  129|       |
  130|  2.55M|    int32_t rangeStart = startPos;
  131|  2.55M|    int32_t rangeEnd = endPos;
  132|       |
  133|  2.55M|    uint16_t    category;
  134|  2.55M|    int32_t     current;
  135|  2.55M|    UErrorCode  status = U_ZERO_ERROR;
  136|  2.55M|    int32_t     foundBreakCount = 0;
  137|  2.55M|    UText      *text = &fBI->fText;
  138|       |
  139|       |    // Loop through the text, looking for ranges of dictionary characters.
  140|       |    // For each span, find the appropriate break engine, and ask it to find
  141|       |    // any breaks within the span.
  142|       |
  143|  2.55M|    utext_setNativeIndex(text, rangeStart);
  ------------------
  |  | 1915|  2.55M|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  2.55M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.55M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.55M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|  2.55M|    UChar32     c = utext_current32(text);
  ------------------
  |  | 1893|  2.55M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  2.55M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.55M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.55M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  145|  2.55M|    category = ucptrie_get(fBI->fData->fTrie, c);
  ------------------
  |  |  805|  2.55M|#define ucptrie_get U_ICU_ENTRY_POINT_RENAME(ucptrie_get)
  |  |  ------------------
  |  |  |  |  123|  2.55M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.55M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.55M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  146|  2.55M|    uint32_t dictStart = fBI->fData->fForwardTable->fDictCategoriesStart;
  147|       |
  148|  5.12M|    while(U_SUCCESS(status)) {
  ------------------
  |  Branch (148:11): [True: 5.12M, False: 0]
  ------------------
  149|  6.72M|        while ((current = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(text))) < rangeEnd
  ------------------
  |  |  735|  6.72M|    ((ut)->chunkOffset <= (ut)->nativeIndexingLimit?   \
  |  |  ------------------
  |  |  |  Branch (735:6): [True: 6.72M, False: 0]
  |  |  ------------------
  |  |  736|  6.72M|        (ut)->chunkNativeStart+(ut)->chunkOffset :     \
  |  |  737|  6.72M|        (ut)->pFuncs->mapOffsetToNative(ut))    
  ------------------
  |  Branch (149:16): [True: 4.16M, False: 2.55M]
  ------------------
  150|  6.72M|                && (category < dictStart)) {
  ------------------
  |  Branch (150:20): [True: 1.60M, False: 2.56M]
  ------------------
  151|  1.60M|            utext_next32(text);           // TODO: cleaner loop structure.
  ------------------
  |  | 1904|  1.60M|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  1.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  152|  1.60M|            c = utext_current32(text);
  ------------------
  |  | 1893|  1.60M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  1.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|  1.60M|            category = ucptrie_get(fBI->fData->fTrie, c);
  ------------------
  |  |  805|  1.60M|#define ucptrie_get U_ICU_ENTRY_POINT_RENAME(ucptrie_get)
  |  |  ------------------
  |  |  |  |  123|  1.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|  1.60M|        }
  155|  5.12M|        if (current >= rangeEnd) {
  ------------------
  |  Branch (155:13): [True: 2.55M, False: 2.56M]
  ------------------
  156|  2.55M|            break;
  157|  2.55M|        }
  158|       |
  159|       |        // We now have a dictionary character. Get the appropriate language object
  160|       |        // to deal with it.
  161|  2.56M|        const LanguageBreakEngine *lbe = fBI->getLanguageBreakEngine(
  162|  2.56M|            c, fBI->getLocaleID(ULOC_REQUESTED_LOCALE, status));
  163|       |
  164|       |        // Ask the language object if there are any breaks. It will add them to the cache and
  165|       |        // leave the text pointer on the other side of its range, ready to search for the next one.
  166|  2.56M|        if (lbe != nullptr) {
  ------------------
  |  Branch (166:13): [True: 2.56M, False: 0]
  ------------------
  167|  2.56M|            foundBreakCount += lbe->findBreaks(text, current, rangeEnd, fBreaks, fBI->fIsPhraseBreaking, status);
  168|  2.56M|        }
  169|       |
  170|       |        // Reload the loop variables for the next go-round
  171|  2.56M|        c = utext_current32(text);
  ------------------
  |  | 1893|  2.56M|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  2.56M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.56M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.56M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|  2.56M|        category = ucptrie_get(fBI->fData->fTrie, c);
  ------------------
  |  |  805|  2.56M|#define ucptrie_get U_ICU_ENTRY_POINT_RENAME(ucptrie_get)
  |  |  ------------------
  |  |  |  |  123|  2.56M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.56M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.56M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  173|  2.56M|    }
  174|       |
  175|       |    // If we found breaks, ensure that the first and last entries are
  176|       |    // the original starting and ending position. And initialize the
  177|       |    // cache iteration position to the first entry.
  178|       |
  179|       |    // printf("foundBreakCount = %d\n", foundBreakCount);
  180|  2.55M|    if (foundBreakCount > 0) {
  ------------------
  |  Branch (180:9): [True: 2.10M, False: 456k]
  ------------------
  181|  2.10M|        U_ASSERT(foundBreakCount == fBreaks.size());
  ------------------
  |  |   35|  2.10M|#   define U_ASSERT(exp) (void)0
  ------------------
  182|  2.10M|        if (startPos < fBreaks.elementAti(0)) {
  ------------------
  |  Branch (182:13): [True: 2.10M, False: 0]
  ------------------
  183|       |            // The dictionary did not place a boundary at the start of the segment of text.
  184|       |            // Add one now. This should not commonly happen, but it would be easy for interactions
  185|       |            // of the rules for dictionary segments and the break engine implementations to
  186|       |            // inadvertently cause it. Cover it here, just in case.
  187|  2.10M|            fBreaks.insertElementAt(startPos, 0, status);
  188|  2.10M|        }
  189|  2.10M|        if (endPos > fBreaks.peeki()) {
  ------------------
  |  Branch (189:13): [True: 2.10M, False: 0]
  ------------------
  190|  2.10M|            fBreaks.push(endPos, status);
  191|  2.10M|        }
  192|  2.10M|        fPositionInCache = 0;
  193|       |        // Note: Dictionary matching may extend beyond the original limit.
  194|  2.10M|        fStart = fBreaks.elementAti(0);
  195|  2.10M|        fLimit = fBreaks.peeki();
  196|  2.10M|    } else {
  197|       |        // there were no language-based breaks, even though the segment contained
  198|       |        // dictionary characters. Subsequent attempts to fetch boundaries from the dictionary cache
  199|       |        // for this range will fail, and the calling code will fall back to the rule based boundaries.
  200|   456k|    }
  201|  2.55M|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCacheC2EPS0_R10UErrorCode:
  209|  14.7k|        fBI(bi), fSideBuffer(status) {
  210|  14.7k|    reset();
  211|  14.7k|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCacheD2Ev:
  214|  14.7k|RuleBasedBreakIterator::BreakCache::~BreakCache() {
  215|  14.7k|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCache5resetEii:
  218|  22.1k|void RuleBasedBreakIterator::BreakCache::reset(int32_t pos, int32_t ruleStatus) {
  219|  22.1k|    fStartBufIdx = 0;
  220|  22.1k|    fEndBufIdx = 0;
  221|  22.1k|    fTextIdx = pos;
  222|  22.1k|    fBufIdx = 0;
  223|  22.1k|    fBoundaries[0] = pos;
  224|  22.1k|    fStatuses[0] = static_cast<uint16_t>(ruleStatus);
  225|  22.1k|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCache7currentEv:
  228|  14.7k|int32_t  RuleBasedBreakIterator::BreakCache::current() {
  229|  14.7k|    fBI->fPosition = fTextIdx;
  230|  14.7k|    fBI->fRuleStatusIndex = fStatuses[fBufIdx];
  231|  14.7k|    fBI->fDone = false;
  232|  14.7k|    return fTextIdx;
  233|  14.7k|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCache6nextOLEv:
  274|  60.5M|void RuleBasedBreakIterator::BreakCache::nextOL() {
  275|  60.5M|    fBI->fDone = !populateFollowing();
  276|  60.5M|    fBI->fPosition = fTextIdx;
  277|  60.5M|    fBI->fRuleStatusIndex = fStatuses[fBufIdx];
  278|  60.5M|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCache4seekEi:
  300|  14.7k|UBool RuleBasedBreakIterator::BreakCache::seek(int32_t pos) {
  301|  14.7k|    if (pos < fBoundaries[fStartBufIdx] || pos > fBoundaries[fEndBufIdx]) {
  ------------------
  |  Branch (301:9): [True: 0, False: 14.7k]
  |  Branch (301:44): [True: 0, False: 14.7k]
  ------------------
  302|      0|        return false;
  303|      0|    }
  304|  14.7k|    if (pos == fBoundaries[fStartBufIdx]) {
  ------------------
  |  Branch (304:9): [True: 14.7k, False: 0]
  ------------------
  305|       |        // Common case: seek(0), from BreakIterator::first()
  306|  14.7k|        fBufIdx = fStartBufIdx;
  307|  14.7k|        fTextIdx = fBoundaries[fBufIdx];
  308|  14.7k|        return true;
  309|  14.7k|    }
  310|      0|    if (pos == fBoundaries[fEndBufIdx]) {
  ------------------
  |  Branch (310:9): [True: 0, False: 0]
  ------------------
  311|      0|        fBufIdx = fEndBufIdx;
  312|      0|        fTextIdx = fBoundaries[fBufIdx];
  313|      0|        return true;
  314|      0|    }
  315|       |
  316|      0|    int32_t min = fStartBufIdx;
  317|      0|    int32_t max = fEndBufIdx;
  318|      0|    while (min != max) {
  ------------------
  |  Branch (318:12): [True: 0, False: 0]
  ------------------
  319|      0|        int32_t probe = (min + max + (min>max ? CACHE_SIZE : 0)) / 2;
  ------------------
  |  Branch (319:39): [True: 0, False: 0]
  ------------------
  320|      0|        probe = modChunkSize(probe);
  321|      0|        if (fBoundaries[probe] > pos) {
  ------------------
  |  Branch (321:13): [True: 0, False: 0]
  ------------------
  322|      0|            max = probe;
  323|      0|        } else {
  324|      0|            min = modChunkSize(probe + 1);
  325|      0|        }
  326|      0|    }
  327|      0|    U_ASSERT(fBoundaries[max] > pos);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  328|      0|    fBufIdx = modChunkSize(max - 1);
  329|      0|    fTextIdx = fBoundaries[fBufIdx];
  330|      0|    U_ASSERT(fTextIdx <= pos);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  331|      0|    return true;
  332|      0|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCache17populateFollowingEv:
  468|  60.5M|UBool RuleBasedBreakIterator::BreakCache::populateFollowing() {
  469|  60.5M|    int32_t fromPosition = fBoundaries[fEndBufIdx];
  470|  60.5M|    int32_t fromRuleStatusIdx = fStatuses[fEndBufIdx];
  471|  60.5M|    int32_t pos = 0;
  472|  60.5M|    int32_t ruleStatusIdx = 0;
  473|       |
  474|  60.5M|    if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) {
  ------------------
  |  Branch (474:9): [True: 47.5M, False: 13.0M]
  ------------------
  475|  47.5M|        addFollowing(pos, ruleStatusIdx, UpdateCachePosition);
  476|  47.5M|        return true;
  477|  47.5M|    }
  478|       |
  479|  13.0M|    fBI->fPosition = fromPosition;
  480|  13.0M|    pos = fBI->handleNext();
  481|  13.0M|    if (pos == UBRK_DONE) {
  ------------------
  |  |  133|  13.0M|#define UBRK_DONE ((int32_t) -1)
  ------------------
  |  Branch (481:9): [True: 7.39k, False: 13.0M]
  ------------------
  482|  7.39k|        return false;
  483|  7.39k|    }
  484|       |
  485|  13.0M|    ruleStatusIdx = fBI->fRuleStatusIndex;
  486|  13.0M|    if (fBI->fDictionaryCharCount > 0) {
  ------------------
  |  Branch (486:9): [True: 8.22M, False: 4.77M]
  ------------------
  487|       |        // The text segment obtained from the rules includes dictionary characters.
  488|       |        // Subdivide it, with subdivided results going into the dictionary cache.
  489|  8.22M|        fBI->fDictionaryCache->populateDictionary(fromPosition, pos, fromRuleStatusIdx, ruleStatusIdx);
  490|  8.22M|        if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) {
  ------------------
  |  Branch (490:13): [True: 2.10M, False: 6.12M]
  ------------------
  491|  2.10M|            addFollowing(pos, ruleStatusIdx, UpdateCachePosition);
  492|  2.10M|            return true;
  493|       |            // TODO: may want to move a sizable chunk of dictionary cache to break cache at this point.
  494|       |            //       But be careful with interactions with populateNear().
  495|  2.10M|        }
  496|  8.22M|    }
  497|       |
  498|       |    // Rule based segment did not include dictionary characters.
  499|       |    // Or, it did contain dictionary chars, but the dictionary segmenter didn't handle them,
  500|       |    //    meaning that we didn't take the return, above.
  501|       |    // Add its end point to the cache.
  502|  10.9M|    addFollowing(pos, ruleStatusIdx, UpdateCachePosition);
  503|       |
  504|       |    // Add several non-dictionary boundaries at this point, to optimize straight forward iteration.
  505|       |    //    (subsequent calls to BreakIterator::next() will take the fast path, getting cached results.
  506|       |    //
  507|  39.1M|    for (int count=0; count<6; ++count) {
  ------------------
  |  Branch (507:23): [True: 34.7M, False: 4.46M]
  ------------------
  508|  34.7M|        pos = fBI->handleNext();
  509|  34.7M|        if (pos == UBRK_DONE || fBI->fDictionaryCharCount > 0) {
  ------------------
  |  |  133|  69.4M|#define UBRK_DONE ((int32_t) -1)
  ------------------
  |  Branch (509:13): [True: 4.81k, False: 34.7M]
  |  Branch (509:33): [True: 6.43M, False: 28.2M]
  ------------------
  510|  6.43M|            break;
  511|  6.43M|        }
  512|  28.2M|        addFollowing(pos, fBI->fRuleStatusIndex, RetainCachePosition);
  513|  28.2M|    }
  514|       |
  515|  10.9M|    return true;
  516|  13.0M|}
_ZN6icu_7822RuleBasedBreakIterator10BreakCache12addFollowingEiiNS1_20UpdatePositionValuesE:
  638|  88.8M|void RuleBasedBreakIterator::BreakCache::addFollowing(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update) {
  639|  88.8M|    U_ASSERT(position > fBoundaries[fEndBufIdx]);
  ------------------
  |  |   35|  88.8M|#   define U_ASSERT(exp) (void)0
  ------------------
  640|  88.8M|    U_ASSERT(ruleStatusIdx <= UINT16_MAX);
  ------------------
  |  |   35|  88.8M|#   define U_ASSERT(exp) (void)0
  ------------------
  641|  88.8M|    int32_t nextIdx = modChunkSize(fEndBufIdx + 1);
  642|  88.8M|    if (nextIdx == fStartBufIdx) {
  ------------------
  |  Branch (642:9): [True: 14.7M, False: 74.0M]
  ------------------
  643|  14.7M|        fStartBufIdx = modChunkSize(fStartBufIdx + 6);    // TODO: experiment. Probably revert to 1.
  644|  14.7M|    }
  645|  88.8M|    fBoundaries[nextIdx] = position;
  646|  88.8M|    fStatuses[nextIdx] = static_cast<uint16_t>(ruleStatusIdx);
  647|  88.8M|    fEndBufIdx = nextIdx;
  648|  88.8M|    if (update == UpdateCachePosition) {
  ------------------
  |  Branch (648:9): [True: 60.5M, False: 28.2M]
  ------------------
  649|       |        // Set current position to the newly added boundary.
  650|  60.5M|        fBufIdx = nextIdx;
  651|  60.5M|        fTextIdx = position;
  652|  60.5M|    } else {
  653|       |        // Retaining the original cache position.
  654|       |        // Check if the added boundary wraps around the buffer, and would over-write the original position.
  655|       |        // It's the responsibility of callers of this function to not add too many.
  656|  28.2M|        U_ASSERT(nextIdx != fBufIdx);
  ------------------
  |  |   35|  28.2M|#   define U_ASSERT(exp) (void)0
  ------------------
  657|  28.2M|    }
  658|  88.8M|}

_ZN6icu_7822RuleBasedBreakIterator10BreakCache4nextEv:
   91|  88.8M|    void        next() {    if (fBufIdx == fEndBufIdx) {
  ------------------
  |  Branch (91:33): [True: 60.5M, False: 28.2M]
  ------------------
   92|  60.5M|                                nextOL();
   93|  60.5M|                            } else {
   94|  28.2M|                                fBufIdx = modChunkSize(fBufIdx + 1);
   95|  28.2M|                                fTextIdx = fBI->fPosition = fBoundaries[fBufIdx];
   96|  28.2M|                                fBI->fRuleStatusIndex = fStatuses[fBufIdx];
   97|  28.2M|                            }
   98|  88.8M|                }
_ZN6icu_7822RuleBasedBreakIterator10BreakCache12modChunkSizeEi:
  181|   131M|    static inline int32_t   modChunkSize(int index) { return index & (CACHE_SIZE - 1); }

_ZN6icu_7815RBBIDataWrapperC2EP11UDataMemoryR10UErrorCode:
   44|  14.7k|RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) {
   45|  14.7k|    init0();
   46|  14.7k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (46:9): [True: 0, False: 14.7k]
  ------------------
   47|      0|        return;
   48|      0|    }
   49|  14.7k|    const DataHeader *dh = udm->pHeader;
   50|  14.7k|    int32_t headerSize = dh->dataHeader.headerSize;
   51|  14.7k|    if (  !(headerSize >= 20 &&
  ------------------
  |  Branch (51:13): [True: 14.7k, False: 0]
  ------------------
   52|  14.7k|            dh->info.isBigEndian == U_IS_BIG_ENDIAN &&
  ------------------
  |  |  353|  29.5k|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (52:13): [True: 14.7k, False: 0]
  ------------------
   53|  14.7k|            dh->info.charsetFamily == U_CHARSET_FAMILY &&
  ------------------
  |  |  588|  14.7k|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|  29.5k|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
  |  Branch (53:13): [True: 14.7k, False: 0]
  ------------------
   54|  14.7k|            dh->info.dataFormat[0] == 0x42 &&  // dataFormat="Brk "
  ------------------
  |  Branch (54:13): [True: 14.7k, False: 0]
  ------------------
   55|  14.7k|            dh->info.dataFormat[1] == 0x72 &&
  ------------------
  |  Branch (55:13): [True: 14.7k, False: 0]
  ------------------
   56|  14.7k|            dh->info.dataFormat[2] == 0x6b &&
  ------------------
  |  Branch (56:13): [True: 14.7k, False: 0]
  ------------------
   57|  14.7k|            dh->info.dataFormat[3] == 0x20 &&
  ------------------
  |  Branch (57:13): [True: 14.7k, False: 0]
  ------------------
   58|  14.7k|            isDataVersionAcceptable(dh->info.formatVersion))
  ------------------
  |  Branch (58:13): [True: 14.7k, False: 0]
  ------------------
   59|  14.7k|        ) {
   60|      0|        status = U_INVALID_FORMAT_ERROR;
   61|      0|        return;
   62|      0|    }
   63|  14.7k|    const char *dataAsBytes = reinterpret_cast<const char *>(dh);
   64|  14.7k|    const RBBIDataHeader *rbbidh = reinterpret_cast<const RBBIDataHeader *>(dataAsBytes + headerSize);
   65|  14.7k|    init(rbbidh, status);
   66|  14.7k|    fUDataMem = udm;
   67|  14.7k|}
_ZN6icu_7815RBBIDataWrapper23isDataVersionAcceptableEPKh:
   69|  29.5k|UBool RBBIDataWrapper::isDataVersionAcceptable(const UVersionInfo version) {
   70|  29.5k|    return RBBI_DATA_FORMAT_VERSION[0] == version[0];
   71|  29.5k|}
_ZN6icu_7815RBBIDataWrapper5init0Ev:
   80|  14.7k|void RBBIDataWrapper::init0() {
   81|  14.7k|    fHeader = nullptr;
   82|  14.7k|    fForwardTable = nullptr;
   83|  14.7k|    fReverseTable = nullptr;
   84|  14.7k|    fRuleSource   = nullptr;
   85|  14.7k|    fRuleStatusTable = nullptr;
   86|  14.7k|    fTrie         = nullptr;
   87|  14.7k|    fUDataMem     = nullptr;
   88|  14.7k|    fRefCount     = 0;
   89|  14.7k|    fDontFreeData = true;
   90|  14.7k|}
_ZN6icu_7815RBBIDataWrapper4initEPKNS_14RBBIDataHeaderER10UErrorCode:
   92|  14.7k|void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) {
   93|  14.7k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (93:9): [True: 0, False: 14.7k]
  ------------------
   94|      0|        return;
   95|      0|    }
   96|  14.7k|    fHeader = data;
   97|  14.7k|    if (fHeader->fMagic != 0xb1a0 || !isDataVersionAcceptable(fHeader->fFormatVersion)) {
  ------------------
  |  Branch (97:9): [True: 0, False: 14.7k]
  |  Branch (97:38): [True: 0, False: 14.7k]
  ------------------
   98|      0|        status = U_INVALID_FORMAT_ERROR;
   99|      0|        return;
  100|      0|    }
  101|       |    // Note: in ICU version 3.2 and earlier, there was a formatVersion 1
  102|       |    //       that is no longer supported.  At that time fFormatVersion was
  103|       |    //       an int32_t field, rather than an array of 4 bytes.
  104|       |
  105|  14.7k|    fDontFreeData = false;
  106|  14.7k|    if (data->fFTableLen != 0) {
  ------------------
  |  Branch (106:9): [True: 14.7k, False: 0]
  ------------------
  107|  14.7k|        fForwardTable = reinterpret_cast<const RBBIStateTable*>(reinterpret_cast<const char*>(data) + fHeader->fFTable);
  108|  14.7k|    }
  109|  14.7k|    if (data->fRTableLen != 0) {
  ------------------
  |  Branch (109:9): [True: 14.7k, False: 0]
  ------------------
  110|  14.7k|        fReverseTable = reinterpret_cast<const RBBIStateTable*>(reinterpret_cast<const char*>(data) + fHeader->fRTable);
  111|  14.7k|    }
  112|       |
  113|  14.7k|    fTrie = ucptrie_openFromBinary(UCPTRIE_TYPE_FAST,
  ------------------
  |  |  813|  14.7k|#define ucptrie_openFromBinary U_ICU_ENTRY_POINT_RENAME(ucptrie_openFromBinary)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  114|  14.7k|                                   UCPTRIE_VALUE_BITS_ANY,
  115|  14.7k|                                   (uint8_t *)data + fHeader->fTrie,
  116|  14.7k|                                   fHeader->fTrieLen,
  117|  14.7k|                                   nullptr,           // *actual length
  118|  14.7k|                                   &status);
  119|  14.7k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (119:9): [True: 0, False: 14.7k]
  ------------------
  120|      0|        return;
  121|      0|    }
  122|       |
  123|  14.7k|    UCPTrieValueWidth width = ucptrie_getValueWidth(fTrie);
  ------------------
  |  |  808|  14.7k|#define ucptrie_getValueWidth U_ICU_ENTRY_POINT_RENAME(ucptrie_getValueWidth)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|  14.7k|    if (!(width == UCPTRIE_VALUE_BITS_8 || width == UCPTRIE_VALUE_BITS_16)) {
  ------------------
  |  Branch (124:11): [True: 14.7k, False: 0]
  |  Branch (124:44): [True: 0, False: 0]
  ------------------
  125|      0|        status = U_INVALID_FORMAT_ERROR;
  126|      0|        return;
  127|      0|    }
  128|       |
  129|  14.7k|    fRuleSource   = ((char *)data + fHeader->fRuleSource);
  130|  14.7k|    fRuleString = UnicodeString::fromUTF8(StringPiece(fRuleSource, fHeader->fRuleSourceLen));
  131|  14.7k|    U_ASSERT(data->fRuleSourceLen > 0);
  ------------------
  |  |   35|  14.7k|#   define U_ASSERT(exp) (void)0
  ------------------
  132|       |
  133|  14.7k|    fRuleStatusTable = reinterpret_cast<const int32_t*>(reinterpret_cast<const char*>(data) + fHeader->fStatusTable);
  134|  14.7k|    fStatusMaxIdx    = data->fStatusTableLen / sizeof(int32_t);
  135|       |
  136|  14.7k|    fRefCount = 1;
  137|       |
  138|       |#ifdef RBBI_DEBUG
  139|       |    char *debugEnv = getenv("U_RBBIDEBUG");
  140|       |    if (debugEnv && uprv_strstr(debugEnv, "data")) {this->printData();}
  141|       |#endif
  142|  14.7k|}
_ZN6icu_7815RBBIDataWrapperD2Ev:
  150|  14.7k|RBBIDataWrapper::~RBBIDataWrapper() {
  151|  14.7k|    U_ASSERT(fRefCount == 0);
  ------------------
  |  |   35|  14.7k|#   define U_ASSERT(exp) (void)0
  ------------------
  152|  14.7k|    ucptrie_close(fTrie);
  ------------------
  |  |  804|  14.7k|#define ucptrie_close U_ICU_ENTRY_POINT_RENAME(ucptrie_close)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|  14.7k|    fTrie = nullptr;
  154|  14.7k|    if (fUDataMem) {
  ------------------
  |  Branch (154:9): [True: 14.7k, False: 0]
  ------------------
  155|  14.7k|        udata_close(fUDataMem);
  ------------------
  |  |  885|  14.7k|#define udata_close U_ICU_ENTRY_POINT_RENAME(udata_close)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  156|  14.7k|    } else if (!fDontFreeData) {
  ------------------
  |  Branch (156:16): [True: 0, False: 0]
  ------------------
  157|      0|        uprv_free((void *)fHeader);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  158|      0|    }
  159|  14.7k|}
_ZN6icu_7815RBBIDataWrapper15removeReferenceEv:
  199|  14.7k|void RBBIDataWrapper::removeReference() {
  200|  14.7k|    if (umtx_atomic_dec(&fRefCount) == 0) {
  ------------------
  |  Branch (200:9): [True: 14.7k, False: 0]
  ------------------
  201|  14.7k|        delete this;
  202|  14.7k|    }
  203|  14.7k|}

_ZN6icu_7814ResourceBundleC2EP15UResourceBundleR10UErrorCode:
  199|      1|                               :UObject(), fLocale(nullptr)
  200|      1|{
  201|      1|    if (res) {
  ------------------
  |  Branch (201:9): [True: 1, False: 0]
  ------------------
  202|      1|        fResource = ures_copyResb(nullptr, res, &err);
  ------------------
  |  | 1653|      1|#define ures_copyResb U_ICU_ENTRY_POINT_RENAME(ures_copyResb)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  203|      1|    } else {
  204|       |        /* Copying a bad resource bundle */
  205|      0|        fResource = nullptr;
  206|      0|    }
  207|      1|}
_ZN6icu_7814ResourceBundleC2EPKcRKNS_6LocaleER10UErrorCode:
  210|      1|                               :UObject(), fLocale(nullptr)
  211|      1|{
  212|      1|    fResource = ures_open(path, locale.getName(), &err);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|      1|}
_ZN6icu_7814ResourceBundleD2Ev:
  240|      2|{
  241|      2|    if (fResource != nullptr) {
  ------------------
  |  Branch (241:9): [True: 2, False: 0]
  ------------------
  242|      2|        ures_close(fResource);
  ------------------
  |  | 1652|      2|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  243|      2|    }
  244|      2|    delete fLocale;
  245|      2|}
_ZNK6icu_7814ResourceBundle7hasNextEv:
  290|    225|UBool ResourceBundle::hasNext() const {
  291|    225|    return ures_hasNext(fResource);
  ------------------
  |  | 1689|    225|#define ures_hasNext U_ICU_ENTRY_POINT_RENAME(ures_hasNext)
  |  |  ------------------
  |  |  |  |  123|    225|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    225|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    225|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  292|    225|}
_ZN6icu_7814ResourceBundle13getNextStringER10UErrorCode:
  310|    224|UnicodeString ResourceBundle::getNextString(UErrorCode& status) {
  311|    224|    int32_t len = 0;
  312|    224|    const char16_t* r = ures_getNextString(fResource, &len, nullptr, &status);
  ------------------
  |  | 1673|    224|#define ures_getNextString U_ICU_ENTRY_POINT_RENAME(ures_getNextString)
  |  |  ------------------
  |  |  |  |  123|    224|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    224|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    224|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  313|    224|    return UnicodeString(true, r, len);
  314|    224|}
_ZNK6icu_7814ResourceBundle3getEPKcR10UErrorCode:
  340|      1|ResourceBundle ResourceBundle::get(const char* key, UErrorCode& status) const {
  341|      1|    UResourceBundle r;
  342|       |
  343|      1|    ures_initStackObject(&r);
  ------------------
  |  | 1690|      1|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  344|      1|    ures_getByKey(fResource, key, &r, &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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  345|      1|    ResourceBundle res(&r, status);
  346|      1|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (346:9): [True: 1, False: 0]
  ------------------
  347|      1|        ures_close(&r);
  ------------------
  |  | 1652|      1|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  348|      1|    }
  349|      1|    return res;
  350|      1|}

_ZN6icu_7813ResourceValueD2Ev:
   18|      1|ResourceValue::~ResourceValue() {}
_ZN6icu_7812ResourceSinkD2Ev:
   20|      1|ResourceSink::~ResourceSink() {}

_ZN6icu_7813ResourceTableC2EPKtPKiS2_PKjiRKNS_14ResourceTracerE:
   89|      3|            keys16(k16), keys32(k32), items16(i16), items32(i32), length(len),
   90|      3|            fTraceInfo(traceInfo) {}
_ZNK6icu_7813ResourceTable7getSizeEv:
   95|      2|    int32_t getSize() const { return length; }
_ZN6icu_7813ResourceValueC2Ev:
  254|      1|    ResourceValue() {}
_ZN6icu_7812ResourceSinkC2Ev:
  266|      1|    ResourceSink() {}

_ZN6icu_7814ResourceTracerC2Ev:
  116|      1|    ResourceTracer() {}
_ZN6icu_7814ResourceTracerC2EPKv:
  118|   312k|    ResourceTracer(const void*) {}
_ZN6icu_7814ResourceTracerC2EPKvPKc:
  120|  1.29k|    ResourceTracer(const void*, const char*) {}
_ZN6icu_7814ResourceTracerC2EPKvi:
  122|    224|    ResourceTracer(const void*, int32_t) {}
_ZN6icu_7814ResourceTracerC2ERKS0_PKc:
  124|    941|    ResourceTracer(const ResourceTracer&, const char*) {}
_ZNK6icu_7814ResourceTracer5traceEPKc:
  128|   258k|    void trace(const char*) const {}
_ZNK6icu_7814ResourceTracer9traceOpenEv:
  130|  55.5k|    void traceOpen() const {}
_ZNK6icu_7814ResourceTracer10maybeTraceEPKc:
  132|      3|    void maybeTrace(const char*) const {}
_ZN6icu_7810FileTracer9traceOpenEPKcS2_S2_:
  140|  28.7k|    static void traceOpen(const char*, const char*, const char*) {}

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

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

_ZN6icu_7811StringPieceC2EPKc:
   19|   482k|    : ptr_(str), length_((str == nullptr) ? 0 : static_cast<int32_t>(uprv_strlen(str))) { }
  ------------------
  |  |   37|   482k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   482k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (19:26): [True: 0, False: 482k]
  ------------------

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

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

u_charType_78:
   50|  72.0k|u_charType(UChar32 c) {
   51|  72.0k|    uint32_t props;
   52|  72.0k|    GET_PROPS(c, props);
  ------------------
  |  |   44|  72.0k|#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c))
  |  |  ------------------
  |  |  |  |  360|  72.0k|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  871|  72.0k|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  845|  72.0k|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (845:6): [True: 42.3k, False: 29.6k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  846|  72.0k|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|  42.3k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  816|  42.3k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|  42.3k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  847|  72.0k|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (847:9): [True: 2.17k, False: 27.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  848|  29.6k|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|  4.34k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 12, False: 2.16k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  816|  2.17k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|  2.17k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  849|  29.6k|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  |  |  850|  29.6k|                (trie)->index, c) : \
  |  |  |  |  |  |  |  |  851|  29.6k|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 27.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  852|  27.4k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  |  |  853|  27.4k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 27.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  27.4k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  |  |  855|  27.4k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  833|  27.4k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  |  |  834|  27.4k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  |  |  835|  27.4k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  |  |  836|  27.4k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  |  |  837|  27.4k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  838|  27.4k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   53|  72.0k|    return (int8_t)GET_CATEGORY(props);
  ------------------
  |  |   65|  72.0k|#define GET_CATEGORY(props) ((props)&0x1f)
  ------------------
   54|  72.0k|}
u_getUnicodeProperties_78:
  499|  69.4M|u_getUnicodeProperties(UChar32 c, int32_t column) {
  500|  69.4M|    U_ASSERT(column>=0);
  ------------------
  |  |   35|  69.4M|#   define U_ASSERT(exp) (void)0
  ------------------
  501|  69.4M|    if(column>=propsVectorsColumns) {
  ------------------
  |  Branch (501:8): [True: 0, False: 69.4M]
  ------------------
  502|      0|        return 0;
  503|  69.4M|    } else {
  504|  69.4M|        uint16_t vecIndex=UTRIE2_GET16(&propsVectorsTrie, c);
  ------------------
  |  |  360|  69.4M|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  ------------------
  |  |  |  |  871|  69.4M|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  ------------------
  |  |  |  |  |  |  845|  69.4M|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (845:6): [True: 32.8M, False: 36.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  846|  69.4M|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  32.8M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  816|  32.8M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  32.8M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  847|  69.4M|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (847:9): [True: 2.92M, False: 33.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  848|  36.6M|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  5.84M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 11, False: 2.92M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  816|  2.92M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  2.92M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  849|  36.6M|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  850|  36.6M|                (trie)->index, c) : \
  |  |  |  |  |  |  851|  36.6M|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 33.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  852|  33.6M|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  853|  33.6M|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 33.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  33.6M|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  855|  33.6M|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  833|  33.6M|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  834|  33.6M|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  835|  33.6M|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  836|  33.6M|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  837|  33.6M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  838|  33.6M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  505|  69.4M|        return propsVectors[vecIndex+column];
  506|  69.4M|    }
  507|  69.4M|}
uscript_getScript_78:
  534|  69.3M|uscript_getScript(UChar32 c, UErrorCode *pErrorCode) {
  535|  69.3M|    if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (535:8): [True: 0, False: 69.3M]
  |  Branch (535:31): [True: 0, False: 69.3M]
  ------------------
  536|      0|        return USCRIPT_INVALID_CODE;
  537|      0|    }
  538|  69.3M|    if((uint32_t)c>0x10ffff) {
  ------------------
  |  Branch (538:8): [True: 0, False: 69.3M]
  ------------------
  539|      0|        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
  540|      0|        return USCRIPT_INVALID_CODE;
  541|      0|    }
  542|  69.3M|    uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
  ------------------
  |  |  288|  69.3M|#define u_getUnicodeProperties U_ICU_ENTRY_POINT_RENAME(u_getUnicodeProperties)
  |  |  ------------------
  |  |  |  |  123|  69.3M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  69.3M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  69.3M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  543|  69.3M|    uint32_t codeOrIndex=scriptX&UPROPS_MAX_SCRIPT;
  544|  69.3M|    if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
  ------------------
  |  Branch (544:8): [True: 66.5M, False: 2.88M]
  ------------------
  545|  66.5M|        return (UScriptCode)codeOrIndex;
  546|  66.5M|    } else if(scriptX<UPROPS_SCRIPT_X_WITH_INHERITED) {
  ------------------
  |  Branch (546:15): [True: 1.83M, False: 1.05M]
  ------------------
  547|  1.83M|        return USCRIPT_COMMON;
  548|  1.83M|    } else if(scriptX<UPROPS_SCRIPT_X_WITH_OTHER) {
  ------------------
  |  Branch (548:15): [True: 649k, False: 405k]
  ------------------
  549|   649k|        return USCRIPT_INHERITED;
  550|   649k|    } else {
  551|   405k|        return (UScriptCode)scriptExtensions[codeOrIndex];
  552|   405k|    }
  553|  69.3M|}
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|}

_ZN6icu_7810UCharsTrieD2Ev:
   27|   113M|UCharsTrie::~UCharsTrie() {
   28|   113M|    uprv_free(ownedArray_);
  ------------------
  |  | 1503|   113M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|   113M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   113M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   113M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   29|   113M|}
_ZN6icu_7810UCharsTrie10branchNextEPKDsii:
   62|   250M|UCharsTrie::branchNext(const char16_t *pos, int32_t length, int32_t uchar) {
   63|       |    // Branch according to the current unit.
   64|   250M|    if(length==0) {
  ------------------
  |  Branch (64:8): [True: 139M, False: 111M]
  ------------------
   65|   139M|        length=*pos++;
   66|   139M|    }
   67|   250M|    ++length;
   68|       |    // The length of the branch is the number of units to select from.
   69|       |    // The data structure encodes a binary search.
   70|  1.93G|    while(length>kMaxBranchLinearSubNodeLength) {
  ------------------
  |  Branch (70:11): [True: 1.68G, False: 250M]
  ------------------
   71|  1.68G|        if(uchar<*pos++) {
  ------------------
  |  Branch (71:12): [True: 1.08G, False: 599M]
  ------------------
   72|  1.08G|            length>>=1;
   73|  1.08G|            pos=jumpByDelta(pos);
   74|  1.08G|        } else {
   75|   599M|            length=length-(length>>1);
   76|   599M|            pos=skipDelta(pos);
   77|   599M|        }
   78|  1.68G|    }
   79|       |    // Drop down to linear search for the last few units.
   80|       |    // length>=2 because the loop body above sees length>kMaxBranchLinearSubNodeLength>=3
   81|       |    // and divides length by 2.
   82|   557M|    do {
   83|   557M|        if(uchar==*pos++) {
  ------------------
  |  Branch (83:12): [True: 155M, False: 402M]
  ------------------
   84|   155M|            UStringTrieResult result;
   85|   155M|            int32_t node=*pos;
   86|   155M|            if(node&kValueIsFinal) {
  ------------------
  |  Branch (86:16): [True: 14.2M, False: 141M]
  ------------------
   87|       |                // Leave the final value for getValue() to read.
   88|  14.2M|                result=USTRINGTRIE_FINAL_VALUE;
   89|   141M|            } else {
   90|       |                // Use the non-final value as the jump delta.
   91|   141M|                ++pos;
   92|       |                // int32_t delta=readValue(pos, node);
   93|   141M|                int32_t delta;
   94|   141M|                if(node<kMinTwoUnitValueLead) {
  ------------------
  |  Branch (94:20): [True: 141M, False: 16.4k]
  ------------------
   95|   141M|                    delta=node;
   96|   141M|                } else if(node<kThreeUnitValueLead) {
  ------------------
  |  Branch (96:27): [True: 16.4k, False: 0]
  ------------------
   97|  16.4k|                    delta=((node-kMinTwoUnitValueLead)<<16)|*pos++;
   98|  16.4k|                } else {
   99|      0|                    delta=(pos[0]<<16)|pos[1];
  100|      0|                    pos+=2;
  101|      0|                }
  102|       |                // end readValue()
  103|   141M|                pos+=delta;
  104|   141M|                node=*pos;
  105|   141M|                result= node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (105:25): [True: 57.5M, False: 84.0M]
  ------------------
  106|   141M|            }
  107|   155M|            pos_=pos;
  108|   155M|            return result;
  109|   155M|        }
  110|   402M|        --length;
  111|   402M|        pos=skipValue(pos);
  112|   402M|    } while(length>1);
  ------------------
  |  Branch (112:13): [True: 307M, False: 94.3M]
  ------------------
  113|  94.3M|    if(uchar==*pos++) {
  ------------------
  |  Branch (113:8): [True: 39.0M, False: 55.3M]
  ------------------
  114|  39.0M|        pos_=pos;
  115|  39.0M|        int32_t node=*pos;
  116|  39.0M|        return node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (116:16): [True: 13.8M, False: 25.2M]
  ------------------
  117|  55.3M|    } else {
  118|  55.3M|        stop();
  119|  55.3M|        return USTRINGTRIE_NO_MATCH;
  120|  55.3M|    }
  121|  94.3M|}
_ZN6icu_7810UCharsTrie8nextImplEPKDsi:
  124|   291M|UCharsTrie::nextImpl(const char16_t *pos, int32_t uchar) {
  125|   291M|    int32_t node=*pos++;
  126|   360M|    for(;;) {
  127|   360M|        if(node<kMinLinearMatch) {
  ------------------
  |  Branch (127:12): [True: 250M, False: 109M]
  ------------------
  128|   250M|            return branchNext(pos, node, uchar);
  129|   250M|        } else if(node<kMinValueLead) {
  ------------------
  |  Branch (129:19): [True: 41.5M, False: 68.4M]
  ------------------
  130|       |            // Match the first of length+1 units.
  131|  41.5M|            int32_t length=node-kMinLinearMatch;  // Actual match length minus 1.
  132|  41.5M|            if(uchar==*pos++) {
  ------------------
  |  Branch (132:16): [True: 20.7M, False: 20.8M]
  ------------------
  133|  20.7M|                remainingMatchLength_=--length;
  134|  20.7M|                pos_=pos;
  135|  20.7M|                return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (135:25): [True: 10.3M, False: 10.3M]
  |  Branch (135:37): [True: 10.3M, False: 78.6k]
  ------------------
  136|  10.4M|                        valueResult(node) : USTRINGTRIE_NO_VALUE;
  137|  20.8M|            } else {
  138|       |                // No match.
  139|  20.8M|                break;
  140|  20.8M|            }
  141|  68.4M|        } else if(node&kValueIsFinal) {
  ------------------
  |  Branch (141:19): [True: 0, False: 68.4M]
  ------------------
  142|       |            // No further matching units.
  143|      0|            break;
  144|  68.4M|        } else {
  145|       |            // Skip intermediate value.
  146|  68.4M|            pos=skipNodeValue(pos, node);
  147|  68.4M|            node&=kNodeTypeMask;
  148|  68.4M|        }
  149|   360M|    }
  150|  20.8M|    stop();
  151|  20.8M|    return USTRINGTRIE_NO_MATCH;
  152|   291M|}
_ZN6icu_7810UCharsTrie4nextEi:
  155|   198M|UCharsTrie::next(int32_t uchar) {
  156|   198M|    const char16_t *pos=pos_;
  157|   198M|    if(pos==nullptr) {
  ------------------
  |  Branch (157:8): [True: 0, False: 198M]
  ------------------
  158|      0|        return USTRINGTRIE_NO_MATCH;
  159|      0|    }
  160|   198M|    int32_t length=remainingMatchLength_;  // Actual remaining match length minus 1.
  161|   198M|    if(length>=0) {
  ------------------
  |  Branch (161:8): [True: 20.6M, False: 177M]
  ------------------
  162|       |        // Remaining part of a linear-match node.
  163|  20.6M|        if(uchar==*pos++) {
  ------------------
  |  Branch (163:12): [True: 20.6M, False: 40.9k]
  ------------------
  164|  20.6M|            remainingMatchLength_=--length;
  165|  20.6M|            pos_=pos;
  166|  20.6M|            int32_t node;
  167|  20.6M|            return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (167:21): [True: 10.3M, False: 10.2M]
  |  Branch (167:33): [True: 10.3M, False: 196]
  ------------------
  168|  10.3M|                    valueResult(node) : USTRINGTRIE_NO_VALUE;
  169|  20.6M|        } else {
  170|  40.9k|            stop();
  171|  40.9k|            return USTRINGTRIE_NO_MATCH;
  172|  40.9k|        }
  173|  20.6M|    }
  174|   177M|    return nextImpl(pos, uchar);
  175|   198M|}

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

_ZN6icu_7822UCharCharacterIteratorC2ENS_14ConstChar16PtrEi:
   30|  14.7k|  : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0),
  ------------------
  |  |  393|      0|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (30:23): [True: 14.7k, False: 0]
  |  Branch (30:45): [True: 14.7k, False: 0]
  ------------------
   31|  14.7k|  text(textPtr)
   32|  14.7k|{
   33|  14.7k|}
_ZN6icu_7822UCharCharacterIteratorD2Ev:
   67|  14.7k|UCharCharacterIterator::~UCharCharacterIterator() {
   68|  14.7k|}
_ZN6icu_7822UCharCharacterIterator7setTextENS_14ConstChar16PtrEi:
  354|  7.39k|                                     int32_t      newTextLength) {
  355|  7.39k|    text = newText;
  356|  7.39k|    if (newText == nullptr || newTextLength < 0) {
  ------------------
  |  Branch (356:9): [True: 0, False: 7.39k]
  |  Branch (356:31): [True: 0, False: 7.39k]
  ------------------
  357|      0|        newTextLength = 0;
  358|      0|    }
  359|  7.39k|    end = textLength = newTextLength;
  360|  7.39k|    pos = begin = 0;
  361|  7.39k|}

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

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

ucptrie_openFromBinary_78:
   24|  14.7k|                       UErrorCode *pErrorCode) {
   25|  14.7k|    if (U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (25:9): [True: 0, False: 14.7k]
  ------------------
   26|      0|        return nullptr;
   27|      0|    }
   28|       |
   29|  14.7k|    if (length <= 0 || (U_POINTER_MASK_LSB(data, 3) != 0) ||
  ------------------
  |  |  123|  14.7k|#define U_POINTER_MASK_LSB(ptr, mask) ((uintptr_t)(ptr) & (mask))
  ------------------
  |  Branch (29:9): [True: 0, False: 14.7k]
  |  Branch (29:24): [True: 0, False: 14.7k]
  ------------------
   30|  14.7k|            type < UCPTRIE_TYPE_ANY || UCPTRIE_TYPE_SMALL < type ||
  ------------------
  |  Branch (30:13): [True: 0, False: 14.7k]
  |  Branch (30:40): [True: 0, False: 14.7k]
  ------------------
   31|  14.7k|            valueWidth < UCPTRIE_VALUE_BITS_ANY || UCPTRIE_VALUE_BITS_8 < valueWidth) {
  ------------------
  |  Branch (31:13): [True: 0, False: 14.7k]
  |  Branch (31:52): [True: 0, False: 14.7k]
  ------------------
   32|      0|        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
   33|      0|        return nullptr;
   34|      0|    }
   35|       |
   36|       |    // Enough data for a trie header?
   37|  14.7k|    if (length < (int32_t)sizeof(UCPTrieHeader)) {
  ------------------
  |  Branch (37:9): [True: 0, False: 14.7k]
  ------------------
   38|      0|        *pErrorCode = U_INVALID_FORMAT_ERROR;
   39|      0|        return nullptr;
   40|      0|    }
   41|       |
   42|       |    // Check the signature.
   43|  14.7k|    const UCPTrieHeader *header = (const UCPTrieHeader *)data;
   44|  14.7k|    if (header->signature != UCPTRIE_SIG) {
  ------------------
  |  |   17|  14.7k|#define UCPTRIE_SIG     0x54726933
  ------------------
  |  Branch (44:9): [True: 0, False: 14.7k]
  ------------------
   45|      0|        *pErrorCode = U_INVALID_FORMAT_ERROR;
   46|      0|        return nullptr;
   47|      0|    }
   48|       |
   49|  14.7k|    int32_t options = header->options;
   50|  14.7k|    int32_t typeInt = (options >> 6) & 3;
   51|  14.7k|    int32_t valueWidthInt = options & UCPTRIE_OPTIONS_VALUE_BITS_MASK;
   52|  14.7k|    if (typeInt > UCPTRIE_TYPE_SMALL || valueWidthInt > UCPTRIE_VALUE_BITS_8 ||
  ------------------
  |  Branch (52:9): [True: 0, False: 14.7k]
  |  Branch (52:41): [True: 0, False: 14.7k]
  ------------------
   53|  14.7k|            (options & UCPTRIE_OPTIONS_RESERVED_MASK) != 0) {
  ------------------
  |  Branch (53:13): [True: 0, False: 14.7k]
  ------------------
   54|      0|        *pErrorCode = U_INVALID_FORMAT_ERROR;
   55|      0|        return nullptr;
   56|      0|    }
   57|  14.7k|    UCPTrieType actualType = (UCPTrieType)typeInt;
   58|  14.7k|    UCPTrieValueWidth actualValueWidth = (UCPTrieValueWidth)valueWidthInt;
   59|  14.7k|    if (type < 0) {
  ------------------
  |  Branch (59:9): [True: 0, False: 14.7k]
  ------------------
   60|      0|        type = actualType;
   61|      0|    }
   62|  14.7k|    if (valueWidth < 0) {
  ------------------
  |  Branch (62:9): [True: 14.7k, False: 1]
  ------------------
   63|  14.7k|        valueWidth = actualValueWidth;
   64|  14.7k|    }
   65|  14.7k|    if (type != actualType || valueWidth != actualValueWidth) {
  ------------------
  |  Branch (65:9): [True: 0, False: 14.7k]
  |  Branch (65:31): [True: 0, False: 14.7k]
  ------------------
   66|      0|        *pErrorCode = U_INVALID_FORMAT_ERROR;
   67|      0|        return nullptr;
   68|      0|    }
   69|       |
   70|       |    // Get the length values and offsets.
   71|  14.7k|    UCPTrie tempTrie;
   72|  14.7k|    uprv_memset(&tempTrie, 0, sizeof(tempTrie));
  ------------------
  |  |  100|  14.7k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  14.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   73|  14.7k|    tempTrie.indexLength = header->indexLength;
   74|  14.7k|    tempTrie.dataLength =
   75|  14.7k|        ((options & UCPTRIE_OPTIONS_DATA_LENGTH_MASK) << 4) | header->dataLength;
   76|  14.7k|    tempTrie.index3NullOffset = header->index3NullOffset;
   77|  14.7k|    tempTrie.dataNullOffset =
   78|  14.7k|        ((options & UCPTRIE_OPTIONS_DATA_NULL_OFFSET_MASK) << 8) | header->dataNullOffset;
   79|       |
   80|  14.7k|    tempTrie.highStart = header->shiftedHighStart << UCPTRIE_SHIFT_2;
   81|  14.7k|    tempTrie.shifted12HighStart = (tempTrie.highStart + 0xfff) >> 12;
   82|  14.7k|    tempTrie.type = type;
   83|  14.7k|    tempTrie.valueWidth = valueWidth;
   84|       |
   85|       |    // Calculate the actual length.
   86|  14.7k|    int32_t actualLength = (int32_t)sizeof(UCPTrieHeader) + tempTrie.indexLength * 2;
   87|  14.7k|    if (valueWidth == UCPTRIE_VALUE_BITS_16) {
  ------------------
  |  Branch (87:9): [True: 1, False: 14.7k]
  ------------------
   88|      1|        actualLength += tempTrie.dataLength * 2;
   89|  14.7k|    } else if (valueWidth == UCPTRIE_VALUE_BITS_32) {
  ------------------
  |  Branch (89:16): [True: 0, False: 14.7k]
  ------------------
   90|      0|        actualLength += tempTrie.dataLength * 4;
   91|  14.7k|    } else {
   92|  14.7k|        actualLength += tempTrie.dataLength;
   93|  14.7k|    }
   94|  14.7k|    if (length < actualLength) {
  ------------------
  |  Branch (94:9): [True: 0, False: 14.7k]
  ------------------
   95|      0|        *pErrorCode = U_INVALID_FORMAT_ERROR;  // Not enough bytes.
   96|      0|        return nullptr;
   97|      0|    }
   98|       |
   99|       |    // Allocate the trie.
  100|  14.7k|    UCPTrie *trie = (UCPTrie *)uprv_malloc(sizeof(UCPTrie));
  ------------------
  |  | 1524|  14.7k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|  14.7k|    if (trie == nullptr) {
  ------------------
  |  Branch (101:9): [True: 0, False: 14.7k]
  ------------------
  102|      0|        *pErrorCode = U_MEMORY_ALLOCATION_ERROR;
  103|      0|        return nullptr;
  104|      0|    }
  105|  14.7k|    uprv_memcpy(trie, &tempTrie, sizeof(tempTrie));
  ------------------
  |  |   42|  14.7k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  14.7k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  14.7k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  14.7k|    _Pragma("clang diagnostic push") \
  |  |   45|  14.7k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  14.7k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  14.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  14.7k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  14.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  14.7k|    _Pragma("clang diagnostic pop") \
  |  |   49|  14.7k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  14.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  14.7k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  14.7k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  106|       |#ifdef UCPTRIE_DEBUG
  107|       |    trie->name = "fromSerialized";
  108|       |#endif
  109|       |
  110|       |    // Set the pointers to its index and data arrays.
  111|  14.7k|    const uint16_t *p16 = (const uint16_t *)(header + 1);
  112|  14.7k|    trie->index = p16;
  113|  14.7k|    p16 += trie->indexLength;
  114|       |
  115|       |    // Get the data.
  116|  14.7k|    int32_t nullValueOffset = trie->dataNullOffset;
  117|  14.7k|    if (nullValueOffset >= trie->dataLength) {
  ------------------
  |  Branch (117:9): [True: 0, False: 14.7k]
  ------------------
  118|      0|        nullValueOffset = trie->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET;
  119|      0|    }
  120|  14.7k|    switch (valueWidth) {
  121|      1|    case UCPTRIE_VALUE_BITS_16:
  ------------------
  |  Branch (121:5): [True: 1, False: 14.7k]
  ------------------
  122|      1|        trie->data.ptr16 = p16;
  123|      1|        trie->nullValue = trie->data.ptr16[nullValueOffset];
  124|      1|        break;
  125|      0|    case UCPTRIE_VALUE_BITS_32:
  ------------------
  |  Branch (125:5): [True: 0, False: 14.7k]
  ------------------
  126|      0|        trie->data.ptr32 = (const uint32_t *)p16;
  127|      0|        trie->nullValue = trie->data.ptr32[nullValueOffset];
  128|      0|        break;
  129|  14.7k|    case UCPTRIE_VALUE_BITS_8:
  ------------------
  |  Branch (129:5): [True: 14.7k, False: 1]
  ------------------
  130|  14.7k|        trie->data.ptr8 = (const uint8_t *)p16;
  131|  14.7k|        trie->nullValue = trie->data.ptr8[nullValueOffset];
  132|  14.7k|        break;
  133|      0|    default:
  ------------------
  |  Branch (133:5): [True: 0, False: 14.7k]
  ------------------
  134|       |        // Unreachable because valueWidth was checked above.
  135|      0|        *pErrorCode = U_INVALID_FORMAT_ERROR;
  136|      0|        return nullptr;
  137|  14.7k|    }
  138|       |
  139|  14.7k|    if (pActualLength != nullptr) {
  ------------------
  |  Branch (139:9): [True: 0, False: 14.7k]
  ------------------
  140|      0|        *pActualLength = actualLength;
  141|      0|    }
  142|  14.7k|    return trie;
  143|  14.7k|}
ucptrie_close_78:
  146|  14.7k|ucptrie_close(UCPTrie *trie) {
  147|  14.7k|    uprv_free(trie);
  ------------------
  |  | 1503|  14.7k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  148|  14.7k|}
ucptrie_getValueWidth_78:
  156|  47.7M|ucptrie_getValueWidth(const UCPTrie *trie) {
  157|  47.7M|    return (UCPTrieValueWidth)trie->valueWidth;
  158|  47.7M|}
ucptrie_internalSmallIndex_78:
  161|  1.21M|ucptrie_internalSmallIndex(const UCPTrie *trie, UChar32 c) {
  162|  1.21M|    int32_t i1 = c >> UCPTRIE_SHIFT_1;
  163|  1.21M|    if (trie->type == UCPTRIE_TYPE_FAST) {
  ------------------
  |  Branch (163:9): [True: 1.21M, False: 0]
  ------------------
  164|  1.21M|        U_ASSERT(0xffff < c && c < trie->highStart);
  ------------------
  |  |   35|  1.21M|#   define U_ASSERT(exp) (void)0
  ------------------
  165|  1.21M|        i1 += UCPTRIE_BMP_INDEX_LENGTH - UCPTRIE_OMITTED_BMP_INDEX_1_LENGTH;
  166|  1.21M|    } else {
  167|      0|        U_ASSERT((uint32_t)c < (uint32_t)trie->highStart && trie->highStart > UCPTRIE_SMALL_LIMIT);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  168|      0|        i1 += UCPTRIE_SMALL_INDEX_LENGTH;
  169|      0|    }
  170|  1.21M|    int32_t i3Block = trie->index[
  171|  1.21M|        (int32_t)trie->index[i1] + ((c >> UCPTRIE_SHIFT_2) & UCPTRIE_INDEX_2_MASK)];
  172|  1.21M|    int32_t i3 = (c >> UCPTRIE_SHIFT_3) & UCPTRIE_INDEX_3_MASK;
  173|  1.21M|    int32_t dataBlock;
  174|  1.21M|    if ((i3Block & 0x8000) == 0) {
  ------------------
  |  Branch (174:9): [True: 1.21M, False: 0]
  ------------------
  175|       |        // 16-bit indexes
  176|  1.21M|        dataBlock = trie->index[i3Block + i3];
  177|  1.21M|    } else {
  178|       |        // 18-bit indexes stored in groups of 9 entries per 8 indexes.
  179|      0|        i3Block = (i3Block & 0x7fff) + (i3 & ~7) + (i3 >> 3);
  180|      0|        i3 &= 7;
  181|      0|        dataBlock = ((int32_t)trie->index[i3Block++] << (2 + (2 * i3))) & 0x30000;
  182|      0|        dataBlock |= trie->index[i3Block + i3];
  183|      0|    }
  184|  1.21M|    return dataBlock + (c & UCPTRIE_SMALL_DATA_MASK);
  185|  1.21M|}
ucptrie_get_78:
  233|  6.72M|ucptrie_get(const UCPTrie *trie, UChar32 c) {
  234|  6.72M|    int32_t dataIndex;
  235|  6.72M|    if ((uint32_t)c <= 0x7f) {
  ------------------
  |  Branch (235:9): [True: 31.4k, False: 6.69M]
  ------------------
  236|       |        // linear ASCII
  237|  31.4k|        dataIndex = c;
  238|  6.69M|    } else {
  239|  6.69M|        UChar32 fastMax = trie->type == UCPTRIE_TYPE_FAST ? 0xffff : UCPTRIE_SMALL_MAX;
  ------------------
  |  Branch (239:27): [True: 6.69M, False: 0]
  ------------------
  240|  6.69M|        dataIndex = _UCPTRIE_CP_INDEX(trie, fastMax, c);
  ------------------
  |  |  616|  6.69M|    ((uint32_t)(c) <= (uint32_t)(fastMax) ? \
  |  |  ------------------
  |  |  |  Branch (616:6): [True: 6.66M, False: 25.0k]
  |  |  ------------------
  |  |  617|  6.69M|        _UCPTRIE_FAST_INDEX(trie, c) : \
  |  |  ------------------
  |  |  |  |  602|  6.66M|    ((int32_t)(trie)->index[(c) >> UCPTRIE_FAST_SHIFT] + ((c) & UCPTRIE_FAST_DATA_MASK))
  |  |  ------------------
  |  |  618|  6.69M|        (uint32_t)(c) <= 0x10ffff ? \
  |  |  ------------------
  |  |  |  Branch (618:9): [True: 21.8k, False: 3.27k]
  |  |  ------------------
  |  |  619|  25.0k|            _UCPTRIE_SMALL_INDEX(trie, c) : \
  |  |  ------------------
  |  |  |  |  606|  21.8k|    ((c) >= (trie)->highStart ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (606:6): [True: 2.25k, False: 19.5k]
  |  |  |  |  ------------------
  |  |  |  |  607|  21.8k|        (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
  |  |  |  |  608|  21.8k|        ucptrie_internalSmallIndex(trie, c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  810|  19.5k|#define ucptrie_internalSmallIndex U_ICU_ENTRY_POINT_RENAME(ucptrie_internalSmallIndex)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  123|  19.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  122|  19.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  121|  19.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  620|  25.0k|            (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET)
  ------------------
  241|  6.69M|    }
  242|  6.72M|    return getValue(trie->data, (UCPTrieValueWidth)trie->valueWidth, dataIndex);
  243|  6.72M|}
ucptrie.cpp:_ZN12_GLOBAL__N_18getValueE11UCPTrieData17UCPTrieValueWidthi:
  216|  6.72M|inline uint32_t getValue(UCPTrieData data, UCPTrieValueWidth valueWidth, int32_t dataIndex) {
  217|  6.72M|    switch (valueWidth) {
  218|      0|    case UCPTRIE_VALUE_BITS_16:
  ------------------
  |  Branch (218:5): [True: 0, False: 6.72M]
  ------------------
  219|      0|        return data.ptr16[dataIndex];
  220|      0|    case UCPTRIE_VALUE_BITS_32:
  ------------------
  |  Branch (220:5): [True: 0, False: 6.72M]
  ------------------
  221|      0|        return data.ptr32[dataIndex];
  222|  6.72M|    case UCPTRIE_VALUE_BITS_8:
  ------------------
  |  Branch (222:5): [True: 6.72M, False: 0]
  ------------------
  223|  6.72M|        return data.ptr8[dataIndex];
  224|      0|    default:
  ------------------
  |  Branch (224:5): [True: 0, False: 6.72M]
  ------------------
  225|       |        // Unreachable if the trie is properly initialized.
  226|      0|        return 0xffffffff;
  227|  6.72M|    }
  228|  6.72M|}

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

UDataMemory_init_78:
   28|  57.5k|U_CFUNC void UDataMemory_init(UDataMemory *This) {
   29|  57.5k|    uprv_memset(This, 0, sizeof(UDataMemory));
  ------------------
  |  |  100|  57.5k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  57.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   30|  57.5k|    This->length=-1;
   31|  57.5k|}
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|  14.7k|U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) {
   42|  14.7k|    UDataMemory *This;
   43|       |
   44|  14.7k|    if (U_FAILURE(*pErr)) {
  ------------------
  |  Branch (44:9): [True: 0, False: 14.7k]
  ------------------
   45|      0|        return nullptr;
   46|      0|    }
   47|  14.7k|    This = (UDataMemory *)uprv_malloc(sizeof(UDataMemory));
  ------------------
  |  | 1524|  14.7k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   48|  14.7k|    if (This == nullptr) {
  ------------------
  |  Branch (48:9): [True: 0, False: 14.7k]
  ------------------
   49|      0|        *pErr = U_MEMORY_ALLOCATION_ERROR; }
   50|  14.7k|    else {
   51|  14.7k|        UDataMemory_init(This);
  ------------------
  |  |   80|  14.7k|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|  14.7k|        This->heapAllocated = true;
   53|  14.7k|    }
   54|  14.7k|    return This;
   55|  14.7k|}
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_close_78:
   92|  14.7k|udata_close(UDataMemory *pData) {
   93|  14.7k|    if(pData!=nullptr) {
  ------------------
  |  Branch (93:8): [True: 14.7k, False: 0]
  ------------------
   94|  14.7k|        uprv_unmapFile(pData);
  ------------------
  |  | 1554|  14.7k|#define uprv_unmapFile U_ICU_ENTRY_POINT_RENAME(uprv_unmapFile)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|  14.7k|        if(pData->heapAllocated ) {
  ------------------
  |  Branch (95:12): [True: 14.7k, False: 0]
  ------------------
   96|  14.7k|            uprv_free(pData);
  ------------------
  |  | 1503|  14.7k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|  14.7k|        } else {
   98|      0|            UDataMemory_init(pData);
  ------------------
  |  |   80|      0|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|      0|        }
  100|  14.7k|    }
  101|  14.7k|}
udata_getMemory_78:
  104|     25|udata_getMemory(UDataMemory *pData) {
  105|     25|    if(pData!=nullptr && pData->pHeader!=nullptr) {
  ------------------
  |  Branch (105:8): [True: 25, False: 0]
  |  Branch (105:26): [True: 25, False: 0]
  ------------------
  106|     25|        return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader);
  ------------------
  |  |  887|     25|#define udata_getHeaderSize U_ICU_ENTRY_POINT_RENAME(udata_getHeaderSize)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|     25|    } else {
  108|      0|        return nullptr;
  109|      0|    }
  110|     25|}
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|     42|           UErrorCode *status) {
  548|       |
  549|     42|    return _uhash_create(keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|     42|#define DEFAULT_PRIME_INDEX 4
  ------------------
  550|     42|}
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|      2|           UErrorCode *status) {
  574|       |
  575|      2|    return _uhash_init(fillinResult, keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|      2|#define DEFAULT_PRIME_INDEX 4
  ------------------
  576|      2|}
uhash_close_78:
  595|    371|uhash_close(UHashtable *hash) {
  596|    371|    if (hash == nullptr) {
  ------------------
  |  Branch (596:9): [True: 370, False: 1]
  ------------------
  597|    370|        return;
  598|    370|    }
  599|      1|    if (hash->elements != nullptr) {
  ------------------
  |  Branch (599:9): [True: 1, False: 0]
  ------------------
  600|      1|        if (hash->keyDeleter != nullptr || hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (600:13): [True: 0, False: 1]
  |  Branch (600:44): [True: 0, False: 1]
  ------------------
  601|      0|            int32_t pos=UHASH_FIRST;
  ------------------
  |  |  610|      0|#define UHASH_FIRST (-1)
  ------------------
  602|      0|            UHashElement *e;
  603|      0|            while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != nullptr) {
  ------------------
  |  | 1029|      0|#define uhash_nextElement U_ICU_ENTRY_POINT_RENAME(uhash_nextElement)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (603:20): [True: 0, False: 0]
  ------------------
  604|      0|                HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer);
  ------------------
  |  |  124|      0|#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  125|      0|    if (hash->keyDeleter != nullptr && keypointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (125:9): [True: 0, False: 0]
  |  |  |  Branch (125:40): [True: 0, False: 0]
  |  |  ------------------
  |  |  126|      0|        (*hash->keyDeleter)(keypointer); \
  |  |  127|      0|    } \
  |  |  128|      0|    if (hash->valueDeleter != nullptr && valuepointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (128:9): [True: 0, False: 0]
  |  |  |  Branch (128:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  129|      0|        (*hash->valueDeleter)(valuepointer); \
  |  |  130|      0|    } \
  |  |  131|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  605|      0|            }
  606|      0|        }
  607|      1|        uprv_free(hash->elements);
  ------------------
  |  | 1503|      1|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  608|      1|        hash->elements = nullptr;
  609|      1|    }
  610|      1|    if (hash->allocated) {
  ------------------
  |  Branch (610:9): [True: 0, False: 1]
  ------------------
  611|      0|        uprv_free(hash);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  612|      0|    }
  613|      1|}
uhash_setKeyDeleter_78:
  636|      1|uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) {
  637|      1|    UObjectDeleter *result = hash->keyDeleter;
  638|      1|    hash->keyDeleter = fn;
  639|      1|    return result;
  640|      1|}
uhash_setValueDeleter_78:
  643|      2|uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) {
  644|      2|    UObjectDeleter *result = hash->valueDeleter;
  645|      2|    hash->valueDeleter = fn;
  646|      2|    return result;
  647|      2|}
uhash_get_78:
  665|  1.74M|          const void* key) {
  666|  1.74M|    UHashTok keyholder;
  667|  1.74M|    keyholder.pointer = (void*) key;
  668|  1.74M|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
  669|  1.74M|}
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|  17.0k|          UErrorCode *status) {
  722|  17.0k|    UHashTok keyholder, valueholder;
  723|  17.0k|    keyholder.pointer = key;
  724|  17.0k|    valueholder.pointer = value;
  725|  17.0k|    return _uhash_put(hash, keyholder, valueholder,
  726|  17.0k|                      HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  139|  17.0k|#define HINT_KEY_POINTER   (1)
  ------------------
                                    HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  140|  17.0k|#define HINT_VALUE_POINTER (2)
  ------------------
  727|  17.0k|                      status).pointer;
  728|  17.0k|}
uhash_puti_78:
  747|  1.59k|           UErrorCode *status) {
  748|  1.59k|    UHashTok keyholder, valueholder;
  749|  1.59k|    keyholder.pointer = key;
  750|  1.59k|    valueholder.integer = value;
  751|  1.59k|    return _uhash_put(hash, keyholder, valueholder,
  752|  1.59k|                      HINT_KEY_POINTER,
  ------------------
  |  |  139|  1.59k|#define HINT_KEY_POINTER   (1)
  ------------------
  753|  1.59k|                      status).integer;
  754|  1.59k|}
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|   258k|uhash_hashChars(const UHashTok key) {
  939|   258k|    const char *s = (const char *)key.pointer;
  940|   258k|    return s == nullptr ? 0 : static_cast<int32_t>(ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s))));
  ------------------
  |  | 1878|   258k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|   258k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   258k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   258k|#       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|   258k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   258k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (940:12): [True: 14, False: 258k]
  ------------------
  941|   258k|}
uhash_hashIStringView_78:
  950|  1.62M|uhash_hashIStringView(const UHashTok key) {
  951|  1.62M|    const std::string_view* s = static_cast<std::string_view*>(key.pointer);
  952|  1.62M|    return s == nullptr ? 0 : ustr_hashICharsN(s->data(), static_cast<int32_t>(s->size()));
  ------------------
  |  | 1879|  1.62M|#define ustr_hashICharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashICharsN)
  |  |  ------------------
  |  |  |  |  123|  1.62M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.62M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.62M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (952:12): [True: 0, False: 1.62M]
  ------------------
  953|  1.62M|}
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|   163k|uhash_compareChars(const UHashTok key1, const UHashTok key2) {
 1030|   163k|    const char *p1 = (const char*) key1.pointer;
 1031|   163k|    const char *p2 = (const char*) key2.pointer;
 1032|   163k|    if (p1 == p2) {
  ------------------
  |  Branch (1032:9): [True: 2, False: 163k]
  ------------------
 1033|      2|        return true;
 1034|      2|    }
 1035|   163k|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1035:9): [True: 0, False: 163k]
  |  Branch (1035:26): [True: 0, False: 163k]
  ------------------
 1036|      0|        return false;
 1037|      0|    }
 1038|  2.32M|    while (*p1 != 0 && *p1 == *p2) {
  ------------------
  |  Branch (1038:12): [True: 2.16M, False: 160k]
  |  Branch (1038:24): [True: 2.16M, False: 3.61k]
  ------------------
 1039|  2.16M|        ++p1;
 1040|  2.16M|        ++p2;
 1041|  2.16M|    }
 1042|   163k|    return *p1 == *p2;
 1043|   163k|}
uhash_compareIStringView_78:
 1063|   716k|uhash_compareIStringView(const UHashTok key1, const UHashTok key2) {
 1064|   716k|    const std::string_view* p1 = static_cast<std::string_view*>(key1.pointer);
 1065|   716k|    const std::string_view* p2 = static_cast<std::string_view*>(key2.pointer);
 1066|   716k|    if (p1 == p2) {
  ------------------
  |  Branch (1066:9): [True: 0, False: 716k]
  ------------------
 1067|      0|        return true;
 1068|      0|    }
 1069|   716k|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1069:9): [True: 0, False: 716k]
  |  Branch (1069:26): [True: 0, False: 716k]
  ------------------
 1070|      0|        return false;
 1071|      0|    }
 1072|   716k|    const std::string_view& v1 = *p1;
 1073|   716k|    const std::string_view& v2 = *p2;
 1074|   716k|    if (v1.size() != v2.size()) {
  ------------------
  |  Branch (1074:9): [True: 0, False: 716k]
  ------------------
 1075|      0|        return false;
 1076|      0|    }
 1077|   749k|    for (size_t i = 0; i < v1.size(); ++i) {
  ------------------
  |  Branch (1077:24): [True: 741k, False: 8.61k]
  ------------------
 1078|   741k|        if (uprv_tolower(v1[i]) != uprv_tolower(v2[i])) {
  ------------------
  |  |   68|   741k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   741k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   741k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   741k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   741k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      if (uprv_tolower(v1[i]) != uprv_tolower(v2[i])) {
  ------------------
  |  |   68|   741k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   741k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   741k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   741k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   741k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1078:13): [True: 707k, False: 33.3k]
  ------------------
 1079|   707k|            return false;
 1080|   707k|        }
 1081|   741k|    }
 1082|  8.61k|    return true;
 1083|   716k|}
uhash.cpp:_ZL13_uhash_createPFi8UElementEPFaS_S_ES3_iP10UErrorCode:
  287|     47|              UErrorCode *status) {
  288|     47|    UHashtable *result;
  289|       |
  290|     47|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (290:9): [True: 0, False: 47]
  ------------------
  291|       |
  292|     47|    result = static_cast<UHashtable*>(uprv_malloc(sizeof(UHashtable)));
  ------------------
  |  | 1524|     47|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     47|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     47|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     47|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|     47|    if (result == nullptr) {
  ------------------
  |  Branch (293:9): [True: 0, False: 47]
  ------------------
  294|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  295|      0|        return nullptr;
  296|      0|    }
  297|       |
  298|     47|    _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status);
  299|     47|    result->allocated       = true;
  300|       |
  301|     47|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (301:9): [True: 0, False: 47]
  ------------------
  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|     47|    return result;
  307|     47|}
uhash.cpp:_ZL11_uhash_initP10UHashtablePFi8UElementEPFaS1_S1_ES5_iP10UErrorCode:
  260|     49|{
  261|     49|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (261:9): [True: 0, False: 49]
  ------------------
  262|     49|    U_ASSERT(keyHash != nullptr);
  ------------------
  |  |   35|     49|#   define U_ASSERT(exp) (void)0
  ------------------
  263|     49|    U_ASSERT(keyComp != nullptr);
  ------------------
  |  |   35|     49|#   define U_ASSERT(exp) (void)0
  ------------------
  264|       |
  265|     49|    result->keyHasher       = keyHash;
  266|     49|    result->keyComparator   = keyComp;
  267|     49|    result->valueComparator = valueComp;
  268|     49|    result->keyDeleter      = nullptr;
  269|     49|    result->valueDeleter    = nullptr;
  270|     49|    result->allocated       = false;
  271|     49|    _uhash_internalSetResizePolicy(result, U_GROW);
  272|       |
  273|     49|    _uhash_allocate(result, primeIndex, status);
  274|       |
  275|     49|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (275:9): [True: 0, False: 49]
  ------------------
  276|      0|        return nullptr;
  277|      0|    }
  278|       |
  279|     49|    return result;
  280|     49|}
uhash.cpp:_ZL15_uhash_allocateP10UHashtableiP10UErrorCode:
  217|     84|                UErrorCode *status) {
  218|       |
  219|     84|    UHashElement *p, *limit;
  220|     84|    UHashTok emptytok;
  221|       |
  222|     84|    if (U_FAILURE(*status)) return;
  ------------------
  |  Branch (222:9): [True: 0, False: 84]
  ------------------
  223|       |
  224|     84|    U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH);
  ------------------
  |  |   35|     84|#   define U_ASSERT(exp) (void)0
  ------------------
  225|       |
  226|     84|    hash->primeIndex = static_cast<int8_t>(primeIndex);
  227|     84|    hash->length = PRIMES[primeIndex];
  228|       |
  229|     84|    p = hash->elements = static_cast<UHashElement*>(
  230|     84|        uprv_malloc(sizeof(UHashElement) * hash->length));
  ------------------
  |  | 1524|     84|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     84|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     84|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     84|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|     84|    if (hash->elements == nullptr) {
  ------------------
  |  Branch (232:9): [True: 0, False: 84]
  ------------------
  233|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  234|      0|        return;
  235|      0|    }
  236|       |
  237|     84|    emptytok.pointer = nullptr; /* Only one of these two is needed */
  238|     84|    emptytok.integer = 0;    /* but we don't know which one. */
  239|       |
  240|     84|    limit = p + hash->length;
  241|  94.8k|    while (p < limit) {
  ------------------
  |  Branch (241:12): [True: 94.7k, False: 84]
  ------------------
  242|  94.7k|        p->key = emptytok;
  243|  94.7k|        p->value = emptytok;
  244|  94.7k|        p->hashcode = HASH_EMPTY;
  ------------------
  |  |  118|  94.7k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  94.7k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  245|  94.7k|        ++p;
  246|  94.7k|    }
  247|       |
  248|     84|    hash->count = 0;
  249|     84|    hash->lowWaterMark = static_cast<int32_t>(hash->length * hash->lowWaterRatio);
  250|     84|    hash->highWaterMark = static_cast<int32_t>(hash->length * hash->highWaterRatio);
  251|     84|}
uhash.cpp:_ZL30_uhash_internalSetResizePolicyP10UHashtable17UHashResizePolicy:
  197|     49|_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
  198|     49|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|     49|#   define U_ASSERT(exp) (void)0
  ------------------
  199|     49|    U_ASSERT(((int32_t)policy) >= 0);
  ------------------
  |  |   35|     49|#   define U_ASSERT(exp) (void)0
  ------------------
  200|     49|    U_ASSERT(((int32_t)policy) < 3);
  ------------------
  |  |   35|     49|#   define U_ASSERT(exp) (void)0
  ------------------
  201|     49|    hash->lowWaterRatio  = RESIZE_POLICY_RATIO_TABLE[policy * 2];
  202|     49|    hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1];
  203|     49|}
uhash.cpp:_ZL13_uhash_rehashP10UHashtableP10UErrorCode:
  399|     35|_uhash_rehash(UHashtable *hash, UErrorCode *status) {
  400|       |
  401|     35|    UHashElement *old = hash->elements;
  402|     35|    int32_t oldLength = hash->length;
  403|     35|    int32_t newPrimeIndex = hash->primeIndex;
  404|     35|    int32_t i;
  405|       |
  406|     35|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (406:9): [True: 35, False: 0]
  ------------------
  407|     35|        if (++newPrimeIndex >= PRIMES_LENGTH) {
  ------------------
  |  |   90|     35|#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES)
  |  |  ------------------
  |  |  |  |   99|     35|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  |  |  ------------------
  ------------------
  |  Branch (407:13): [True: 0, False: 35]
  ------------------
  408|      0|            return;
  409|      0|        }
  410|     35|    } 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|     35|    _uhash_allocate(hash, newPrimeIndex, status);
  419|       |
  420|     35|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (420:9): [True: 0, False: 35]
  ------------------
  421|      0|        hash->elements = old;
  422|      0|        hash->length = oldLength;
  423|      0|        return;
  424|      0|    }
  425|       |
  426|  43.8k|    for (i = oldLength - 1; i >= 0; --i) {
  ------------------
  |  Branch (426:29): [True: 43.7k, False: 35]
  ------------------
  427|  43.7k|        if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) {
  ------------------
  |  |  120|  43.7k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (427:13): [True: 21.9k, False: 21.8k]
  ------------------
  428|  21.9k|            UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode);
  429|  21.9k|            U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  21.9k|#   define U_ASSERT(exp) (void)0
  ------------------
  430|  21.9k|            U_ASSERT(e->hashcode == HASH_EMPTY);
  ------------------
  |  |   35|  21.9k|#   define U_ASSERT(exp) (void)0
  ------------------
  431|  21.9k|            e->key = old[i].key;
  432|  21.9k|            e->value = old[i].value;
  433|  21.9k|            e->hashcode = old[i].hashcode;
  434|  21.9k|            ++hash->count;
  435|  21.9k|        }
  436|  43.7k|    }
  437|       |
  438|     35|    uprv_free(old);
  ------------------
  |  | 1503|     35|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     35|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     35|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     35|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  439|     35|}
uhash.cpp:_ZL11_uhash_findPK10UHashtable8UElementi:
  339|  1.78M|            int32_t hashcode) {
  340|       |
  341|  1.78M|    int32_t firstDeleted = -1;  /* assume invalid index */
  342|  1.78M|    int32_t theIndex, startIndex;
  343|  1.78M|    int32_t jump = 0; /* lazy evaluate */
  344|  1.78M|    int32_t tableHash;
  345|  1.78M|    UHashElement *elements = hash->elements;
  346|       |
  347|  1.78M|    hashcode &= 0x7FFFFFFF; /* must be positive */
  348|  1.78M|    startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length;
  349|       |
  350|  4.07M|    do {
  351|  4.07M|        tableHash = elements[theIndex].hashcode;
  352|  4.07M|        if (tableHash == hashcode) {          /* quick check */
  ------------------
  |  Branch (352:13): [True: 802k, False: 3.26M]
  ------------------
  353|   802k|            if ((*hash->keyComparator)(key, elements[theIndex].key)) {
  ------------------
  |  Branch (353:17): [True: 87.2k, False: 715k]
  ------------------
  354|  87.2k|                return &(elements[theIndex]);
  355|  87.2k|            }
  356|  3.26M|        } else if (!IS_EMPTY_OR_DELETED(tableHash)) {
  ------------------
  |  |  120|  3.26M|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (356:20): [True: 1.57M, False: 1.69M]
  ------------------
  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|  1.69M|        } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */
  ------------------
  |  |  118|  1.69M|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  1.69M|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (361:20): [True: 1.69M, False: 0]
  ------------------
  362|  1.69M|            break;
  363|  1.69M|        } else if (firstDeleted < 0) { /* remember first deleted */
  ------------------
  |  Branch (363:20): [True: 0, False: 0]
  ------------------
  364|      0|            firstDeleted = theIndex;
  365|      0|        }
  366|  2.28M|        if (jump == 0) { /* lazy compute jump */
  ------------------
  |  Branch (366:13): [True: 1.47M, False: 814k]
  ------------------
  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|  1.47M|            jump = (hashcode % (hash->length - 1)) + 1;
  372|  1.47M|        }
  373|  2.28M|        theIndex = (theIndex + jump) % hash->length;
  374|  2.28M|    } while (theIndex != startIndex);
  ------------------
  |  Branch (374:14): [True: 2.28M, False: 0]
  ------------------
  375|       |
  376|  1.69M|    if (firstDeleted >= 0) {
  ------------------
  |  Branch (376:9): [True: 0, False: 1.69M]
  ------------------
  377|      0|        theIndex = firstDeleted; /* reset if had deleted slot */
  378|  1.69M|    } else if (tableHash != HASH_EMPTY) {
  ------------------
  |  |  118|  1.69M|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  1.69M|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (378:16): [True: 0, False: 1.69M]
  ------------------
  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|  1.69M|    return &(elements[theIndex]);
  387|  1.69M|}
uhash.cpp:_ZL10_uhash_putP10UHashtable8UElementS1_aP10UErrorCode:
  471|  18.6k|           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|  18.6k|    int32_t hashcode;
  479|  18.6k|    UHashElement* e;
  480|  18.6k|    UHashTok emptytok;
  481|       |
  482|  18.6k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (482:9): [True: 0, False: 18.6k]
  ------------------
  483|      0|        goto err;
  484|      0|    }
  485|  18.6k|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|  18.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  486|  18.6k|    if ((hint & HINT_VALUE_POINTER) ?
  ------------------
  |  |  140|  18.6k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (486:9): [True: 17.0k, False: 1.59k]
  |  Branch (486:9): [True: 0, False: 18.6k]
  ------------------
  487|  17.0k|            value.pointer == nullptr :
  488|  18.6k|            value.integer == 0 && (hint & HINT_ALLOW_ZERO) == 0) {
  ------------------
  |  |  141|      0|#define HINT_ALLOW_ZERO    (4)
  ------------------
  |  Branch (488:13): [True: 0, False: 1.59k]
  |  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|  18.6k|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (494:9): [True: 35, False: 18.6k]
  ------------------
  495|     35|        _uhash_rehash(hash, status);
  496|     35|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (496:13): [True: 0, False: 35]
  ------------------
  497|      0|            goto err;
  498|      0|        }
  499|     35|    }
  500|       |
  501|  18.6k|    hashcode = (*hash->keyHasher)(key);
  502|  18.6k|    e = _uhash_find(hash, key, hashcode);
  503|  18.6k|    U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  18.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  504|       |
  505|  18.6k|    if (IS_EMPTY_OR_DELETED(e->hashcode)) {
  ------------------
  |  |  120|  18.6k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  |  |  ------------------
  |  |  |  Branch (120:32): [True: 18.6k, False: 7]
  |  |  ------------------
  ------------------
  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|  18.6k|        ++hash->count;
  514|  18.6k|        if (hash->count == hash->length) {
  ------------------
  |  Branch (514:13): [True: 0, False: 18.6k]
  ------------------
  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|  18.6k|    }
  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|  18.6k|    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|  18.6k|}
uhash.cpp:_ZL17_uhash_setElementP10UHashtableP12UHashElementi8UElementS3_a:
  150|  18.6k|                  UHashTok key, UHashTok value, int8_t hint) {
  151|       |
  152|  18.6k|    UHashTok oldValue = e->value;
  153|  18.6k|    if (hash->keyDeleter != nullptr && e->key.pointer != nullptr &&
  ------------------
  |  Branch (153:9): [True: 605, False: 18.0k]
  |  Branch (153:40): [True: 1, False: 604]
  ------------------
  154|  18.6k|        e->key.pointer != key.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (154:9): [True: 1, False: 0]
  ------------------
  155|      1|        (*hash->keyDeleter)(e->key.pointer);
  156|      1|    }
  157|  18.6k|    if (hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (157:9): [True: 1, False: 18.6k]
  ------------------
  158|      1|        if (oldValue.pointer != nullptr &&
  ------------------
  |  Branch (158:13): [True: 0, False: 1]
  ------------------
  159|      1|            oldValue.pointer != value.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (159:13): [True: 0, False: 0]
  ------------------
  160|      0|            (*hash->valueDeleter)(oldValue.pointer);
  161|      0|        }
  162|      1|        oldValue.pointer = nullptr;
  163|      1|    }
  164|       |    /* Compilers should copy the UHashTok union correctly, but even if
  165|       |     * they do, memory heap tools (e.g. BoundsChecker) can get
  166|       |     * confused when a pointer is cloaked in a union and then copied.
  167|       |     * TO ALLEVIATE THIS, we use hints (based on what API the user is
  168|       |     * calling) to copy pointers when we know the user thinks
  169|       |     * something is a pointer. */
  170|  18.6k|    if (hint & HINT_KEY_POINTER) {
  ------------------
  |  |  139|  18.6k|#define HINT_KEY_POINTER   (1)
  ------------------
  |  Branch (170:9): [True: 18.6k, False: 0]
  ------------------
  171|  18.6k|        e->key.pointer = key.pointer;
  172|  18.6k|    } else {
  173|      0|        e->key = key;
  174|      0|    }
  175|  18.6k|    if (hint & HINT_VALUE_POINTER) {
  ------------------
  |  |  140|  18.6k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (175:9): [True: 17.0k, False: 1.59k]
  ------------------
  176|  17.0k|        e->value.pointer = value.pointer;
  177|  17.0k|    } else {
  178|  1.59k|        e->value = value;
  179|  1.59k|    }
  180|  18.6k|    e->hashcode = hashcode;
  181|  18.6k|    return oldValue;
  182|  18.6k|}

u_UCharsToChars_78:
  204|  30.9k|u_UCharsToChars(const char16_t *us, char *cs, int32_t length) {
  205|  30.9k|    char16_t u;
  206|       |
  207|   157k|    while(length>0) {
  ------------------
  |  Branch (207:11): [True: 126k, False: 30.9k]
  ------------------
  208|   126k|        u=*us++;
  209|   126k|        if(!UCHAR_IS_INVARIANT(u)) {
  ------------------
  |  |  168|   126k|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 126k, False: 0]
  |  |  |  Branch (168:47): [True: 126k, False: 0]
  |  |  ------------------
  ------------------
  210|      0|            U_ASSERT(false); /* Variant characters were used. These are not portable in ICU. */
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  211|      0|            u=0;
  212|      0|        }
  213|   126k|        *cs++=(char)UCHAR_TO_CHAR(u);
  ------------------
  |  |  175|   126k|#define UCHAR_TO_CHAR(c) c
  ------------------
  214|   126k|        --length;
  215|   126k|    }
  216|  30.9k|}
uprv_isInvariantUString_78:
  263|  1.46k|uprv_isInvariantUString(const char16_t *s, int32_t length) {
  264|  1.46k|    char16_t c;
  265|       |
  266|  7.06k|    for(;;) {
  267|  7.06k|        if(length<0) {
  ------------------
  |  Branch (267:12): [True: 0, False: 7.06k]
  ------------------
  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|  7.06k|        } else {
  274|       |            /* count length */
  275|  7.06k|            if(length==0) {
  ------------------
  |  Branch (275:16): [True: 1.46k, False: 5.60k]
  ------------------
  276|  1.46k|                break;
  277|  1.46k|            }
  278|  5.60k|            --length;
  279|  5.60k|            c=*s++;
  280|  5.60k|        }
  281|       |
  282|       |        /*
  283|       |         * no assertions here because these functions are legitimately called
  284|       |         * for strings with variant characters
  285|       |         */
  286|  5.60k|        if(!UCHAR_IS_INVARIANT(c)) {
  ------------------
  |  |  168|  5.60k|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 5.60k, False: 0]
  |  |  |  Branch (168:47): [True: 5.60k, False: 0]
  |  |  ------------------
  ------------------
  287|      0|            return false; /* found a variant char */
  288|      0|        }
  289|  5.60k|    }
  290|  1.46k|    return true;
  291|  1.46k|}
uprv_compareInvAscii_78:
  460|  78.6k|                     const char16_t *localString, int32_t localLength) {
  461|  78.6k|    (void)ds;
  462|  78.6k|    int32_t minLength;
  463|  78.6k|    UChar32 c1, c2;
  464|  78.6k|    uint8_t c;
  465|       |
  466|  78.6k|    if(outString==nullptr || outLength<-1 || localString==nullptr || localLength<-1) {
  ------------------
  |  Branch (466:8): [True: 0, False: 78.6k]
  |  Branch (466:30): [True: 0, False: 78.6k]
  |  Branch (466:46): [True: 0, False: 78.6k]
  |  Branch (466:70): [True: 0, False: 78.6k]
  ------------------
  467|      0|        return 0;
  468|      0|    }
  469|       |
  470|  78.6k|    if(outLength<0) {
  ------------------
  |  Branch (470:8): [True: 0, False: 78.6k]
  ------------------
  471|      0|        outLength=(int32_t)uprv_strlen(outString);
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  472|      0|    }
  473|  78.6k|    if(localLength<0) {
  ------------------
  |  Branch (473:8): [True: 0, False: 78.6k]
  ------------------
  474|      0|        localLength=u_strlen(localString);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  475|      0|    }
  476|       |
  477|  78.6k|    minLength= outLength<localLength ? outLength : localLength;
  ------------------
  |  Branch (477:16): [True: 30.1k, False: 48.5k]
  ------------------
  478|       |
  479|   204k|    while(minLength>0) {
  ------------------
  |  Branch (479:11): [True: 203k, False: 413]
  ------------------
  480|   203k|        c=(uint8_t)*outString++;
  481|   203k|        if(UCHAR_IS_INVARIANT(c)) {
  ------------------
  |  |  168|   203k|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 203k, False: 0]
  |  |  |  Branch (168:47): [True: 203k, False: 0]
  |  |  ------------------
  ------------------
  482|   203k|            c1=c;
  483|   203k|        } else {
  484|      0|            c1=-1;
  485|      0|        }
  486|       |
  487|   203k|        c2=*localString++;
  488|   203k|        if(!UCHAR_IS_INVARIANT(c2)) {
  ------------------
  |  |  168|   203k|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 203k, False: 0]
  |  |  |  Branch (168:47): [True: 203k, False: 0]
  |  |  ------------------
  ------------------
  489|      0|            c2=-2;
  490|      0|        }
  491|       |
  492|   203k|        if((c1-=c2)!=0) {
  ------------------
  |  Branch (492:12): [True: 78.2k, False: 125k]
  ------------------
  493|  78.2k|            return c1;
  494|  78.2k|        }
  495|       |
  496|   125k|        --minLength;
  497|   125k|    }
  498|       |
  499|       |    /* strings start with same prefix, compare lengths */
  500|    413|    return outLength-localLength;
  501|  78.6k|}

locale_getKeywordsStart_78:
  526|  69.0k|locale_getKeywordsStart(std::string_view localeID) {
  527|  69.0k|    if (size_t pos = localeID.find('@'); pos != std::string_view::npos) {
  ------------------
  |  Branch (527:42): [True: 6.44k, False: 62.6k]
  ------------------
  528|  6.44k|        return localeID.data() + pos;
  529|  6.44k|    }
  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|  62.6k|    return nullptr;
  546|  69.0k|}
_Z22ulocimp_getKeywords_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEcRN6icu_788ByteSinkEbR10UErrorCode:
  614|  2.67k|{
  615|  2.67k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (615:9): [True: 0, False: 2.67k]
  ------------------
  616|       |
  617|  2.67k|    KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS];
  618|       |
  619|  2.67k|    int32_t maxKeywords = ULOC_MAX_NO_KEYWORDS;
  ------------------
  |  |  523|  2.67k|#define ULOC_MAX_NO_KEYWORDS 25
  ------------------
  620|  2.67k|    int32_t numKeywords = 0;
  621|  2.67k|    size_t equalSign = std::string_view::npos;
  622|  2.67k|    size_t semicolon = std::string_view::npos;
  623|  2.67k|    int32_t i = 0, j, n;
  624|       |
  625|  2.67k|    if(prev == '@') { /* start of keyword definition */
  ------------------
  |  Branch (625:8): [True: 2.67k, False: 0]
  ------------------
  626|       |        /* we will grab pairs, trim spaces, lowercase keywords, sort and return */
  627|  12.2k|        do {
  628|  12.2k|            bool duplicate = false;
  629|       |            /* skip leading spaces */
  630|  12.6k|            while (localeID.front() == ' ') {
  ------------------
  |  Branch (630:20): [True: 406, False: 12.2k]
  ------------------
  631|    406|                localeID.remove_prefix(1);
  632|    406|            }
  633|  12.2k|            if (localeID.empty()) { /* handle trailing "; " */
  ------------------
  |  Branch (633:17): [True: 12, False: 12.2k]
  ------------------
  634|     12|                break;
  635|     12|            }
  636|  12.2k|            if(numKeywords == maxKeywords) {
  ------------------
  |  Branch (636:16): [True: 6, False: 12.2k]
  ------------------
  637|      6|                status = U_INTERNAL_PROGRAM_ERROR;
  638|      6|                return;
  639|      6|            }
  640|  12.2k|            equalSign = localeID.find('=');
  641|  12.2k|            semicolon = localeID.find(';');
  642|       |            /* lack of '=' [foo@currency] is illegal */
  643|       |            /* ';' before '=' [foo@currency;collation=pinyin] is illegal */
  644|  12.2k|            if (equalSign == std::string_view::npos ||
  ------------------
  |  Branch (644:17): [True: 25, False: 12.2k]
  ------------------
  645|  12.2k|                (semicolon != std::string_view::npos && semicolon < equalSign)) {
  ------------------
  |  Branch (645:18): [True: 9.67k, False: 2.56k]
  |  Branch (645:57): [True: 6, False: 9.66k]
  ------------------
  646|     31|                status = U_INVALID_FORMAT_ERROR;
  647|     31|                return;
  648|     31|            }
  649|       |            /* zero-length keyword is an error. */
  650|  12.2k|            if (equalSign == 0) {
  ------------------
  |  Branch (650:17): [True: 36, False: 12.1k]
  ------------------
  651|     36|                status = U_INVALID_FORMAT_ERROR;
  652|     36|                return;
  653|     36|            }
  654|       |            /* need to normalize both keyword and keyword name */
  655|  12.1k|            if (equalSign >= ULOC_KEYWORD_BUFFER_LEN) {
  ------------------
  |  |  522|  12.1k|#define ULOC_KEYWORD_BUFFER_LEN 25
  ------------------
  |  Branch (655:17): [True: 60, False: 12.1k]
  ------------------
  656|       |                /* keyword name too long for internal buffer */
  657|     60|                status = U_INTERNAL_PROGRAM_ERROR;
  658|     60|                return;
  659|     60|            }
  660|  59.5k|            for (i = 0, n = 0; static_cast<size_t>(i) < equalSign; ++i) {
  ------------------
  |  Branch (660:32): [True: 47.3k, False: 12.1k]
  ------------------
  661|  47.3k|                if (localeID[i] != ' ') {
  ------------------
  |  Branch (661:21): [True: 47.1k, False: 210]
  ------------------
  662|  47.1k|                    keywordList[numKeywords].keyword[n++] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|  47.1k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  47.1k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  47.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  47.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  47.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  663|  47.1k|                }
  664|  47.3k|            }
  665|       |
  666|  12.1k|            keywordList[numKeywords].keyword[n] = 0;
  667|  12.1k|            keywordList[numKeywords].keywordLen = n;
  668|       |            /* now grab the value part. First we skip the '=' */
  669|  12.1k|            equalSign++;
  670|       |            /* then we leading spaces */
  671|  2.77M|            while (equalSign < localeID.length() && localeID[equalSign] == ' ') {
  ------------------
  |  Branch (671:20): [True: 2.77M, False: 31]
  |  Branch (671:53): [True: 2.76M, False: 12.1k]
  ------------------
  672|  2.76M|                equalSign++;
  673|  2.76M|            }
  674|       |
  675|       |            /* Premature end or zero-length value */
  676|  12.1k|            if (equalSign == localeID.length() || equalSign == semicolon) {
  ------------------
  |  Branch (676:17): [True: 31, False: 12.1k]
  |  Branch (676:51): [True: 3, False: 12.0k]
  ------------------
  677|     34|                status = U_INVALID_FORMAT_ERROR;
  678|     34|                return;
  679|     34|            }
  680|       |
  681|  12.0k|            keywordList[numKeywords].valueStart = localeID.data() + equalSign;
  682|       |
  683|  12.0k|            std::string_view value = localeID;
  684|  12.0k|            if (semicolon != std::string_view::npos) {
  ------------------
  |  Branch (684:17): [True: 9.63k, False: 2.46k]
  ------------------
  685|  9.63k|                value.remove_suffix(value.length() - semicolon);
  686|  9.63k|                localeID.remove_prefix(semicolon + 1);
  687|  9.63k|            } else {
  688|  2.46k|                localeID = {};
  689|  2.46k|            }
  690|  12.0k|            value.remove_prefix(equalSign);
  691|  12.0k|            if (size_t last = value.find_last_not_of(' '); last != std::string_view::npos) {
  ------------------
  |  Branch (691:60): [True: 12.0k, False: 0]
  ------------------
  692|  12.0k|                value.remove_suffix(value.length() - last - 1);
  693|  12.0k|            }
  694|  12.0k|            keywordList[numKeywords].valueLen = static_cast<int32_t>(value.length());
  695|       |
  696|       |            /* If this is a duplicate keyword, then ignore it */
  697|  77.7k|            for (j=0; j<numKeywords; ++j) {
  ------------------
  |  Branch (697:23): [True: 66.3k, False: 11.3k]
  ------------------
  698|  66.3k|                if (uprv_strcmp(keywordList[j].keyword, keywordList[numKeywords].keyword) == 0) {
  ------------------
  |  |   38|  66.3k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  66.3k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (698:21): [True: 709, False: 65.6k]
  ------------------
  699|    709|                    duplicate = true;
  700|    709|                    break;
  701|    709|                }
  702|  66.3k|            }
  703|  12.0k|            if (!duplicate) {
  ------------------
  |  Branch (703:17): [True: 11.3k, False: 709]
  ------------------
  704|  11.3k|                ++numKeywords;
  705|  11.3k|            }
  706|  12.0k|        } while (!localeID.empty());
  ------------------
  |  Branch (706:18): [True: 9.60k, False: 2.49k]
  ------------------
  707|       |
  708|       |        /* now we have a list of keywords */
  709|       |        /* we need to sort it */
  710|  2.50k|        uprv_sortArray(keywordList, numKeywords, sizeof(KeywordStruct), compareKeywordStructs, nullptr, false, &status);
  ------------------
  |  | 1538|  2.50k|#define uprv_sortArray U_ICU_ENTRY_POINT_RENAME(uprv_sortArray)
  |  |  ------------------
  |  |  |  |  123|  2.50k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.50k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.50k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  711|       |
  712|       |        /* Now construct the keyword part */
  713|  13.6k|        for(i = 0; i < numKeywords; i++) {
  ------------------
  |  Branch (713:20): [True: 11.1k, False: 2.50k]
  ------------------
  714|  11.1k|            sink.Append(keywordList[i].keyword, keywordList[i].keywordLen);
  715|  11.1k|            if(valuesToo) {
  ------------------
  |  Branch (715:16): [True: 11.1k, False: 0]
  ------------------
  716|  11.1k|                sink.Append("=", 1);
  717|  11.1k|                sink.Append(keywordList[i].valueStart, keywordList[i].valueLen);
  718|  11.1k|                if(i < numKeywords - 1) {
  ------------------
  |  Branch (718:20): [True: 8.63k, False: 2.50k]
  ------------------
  719|  8.63k|                    sink.Append(";", 1);
  720|  8.63k|                }
  721|  11.1k|            } else {
  722|      0|                sink.Append("\0", 1);
  723|      0|            }
  724|  11.1k|        }
  725|  2.50k|    }
  726|  2.67k|}
uloc_getKeywordValue_78:
  733|  2.00k|{
  734|  2.00k|    if (U_FAILURE(*status)) { return 0; }
  ------------------
  |  Branch (734:9): [True: 0, False: 2.00k]
  ------------------
  735|  2.00k|    if (keywordName == nullptr || *keywordName == '\0') {
  ------------------
  |  Branch (735:9): [True: 0, False: 2.00k]
  |  Branch (735:35): [True: 0, False: 2.00k]
  ------------------
  736|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
  737|      0|        return 0;
  738|      0|    }
  739|  2.00k|    return ByteSinkUtil::viaByteSinkToTerminatedChars(
  740|  2.00k|        buffer, bufferCapacity,
  741|  2.00k|        [&](ByteSink& sink, UErrorCode& status) {
  742|  2.00k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  743|  2.00k|        },
  744|  2.00k|        *status);
  745|  2.00k|}
_Z26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
  764|  5.54k|{
  765|  5.54k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (765:9): [True: 0, False: 5.54k]
  ------------------
  766|       |
  767|  5.54k|    if (localeID == nullptr || keywordName.empty()) {
  ------------------
  |  Branch (767:9): [True: 0, False: 5.54k]
  |  Branch (767:32): [True: 0, False: 5.54k]
  ------------------
  768|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  769|      0|        return;
  770|      0|    }
  771|       |
  772|  5.54k|    const char* startSearchHere = nullptr;
  773|  5.54k|    const char* nextSeparator = nullptr;
  774|       |
  775|  5.54k|    CharString tempBuffer;
  776|  5.54k|    const char* tmpLocaleID;
  777|       |
  778|  5.54k|    CharString canonKeywordName = locale_canonKeywordName(keywordName, status);
  779|  5.54k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (779:9): [True: 0, False: 5.54k]
  ------------------
  780|      0|      return;
  781|      0|    }
  782|       |
  783|  5.54k|    if (localeID != nullptr && _hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (783:9): [True: 5.54k, False: 0]
  |  Branch (783:32): [True: 405, False: 5.13k]
  ------------------
  784|    405|        tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, status);
  ------------------
  |  | 1198|    405|#define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag)
  |  |  ------------------
  |  |  |  |  123|    405|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    405|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    405|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  785|    405|        tmpLocaleID = U_SUCCESS(status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID;
  ------------------
  |  Branch (785:23): [True: 405, False: 0]
  |  Branch (785:44): [True: 64, False: 341]
  ------------------
  786|  5.13k|    } else {
  787|  5.13k|        tmpLocaleID=localeID;
  788|  5.13k|    }
  789|       |
  790|  5.54k|    startSearchHere = locale_getKeywordsStart(tmpLocaleID);
  ------------------
  |  |  138|  5.54k|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|  5.54k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.54k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.54k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|  5.54k|    if(startSearchHere == nullptr) {
  ------------------
  |  Branch (791:8): [True: 4.23k, False: 1.31k]
  ------------------
  792|       |        /* no keywords, return at once */
  793|  4.23k|        return;
  794|  4.23k|    }
  795|       |
  796|       |    /* find the first keyword */
  797|  3.87k|    while(startSearchHere) {
  ------------------
  |  Branch (797:11): [True: 3.32k, False: 549]
  ------------------
  798|  3.32k|        const char* keyValueTail;
  799|       |
  800|  3.32k|        startSearchHere++; /* skip @ or ; */
  801|  3.32k|        nextSeparator = uprv_strchr(startSearchHere, '=');
  ------------------
  |  |   40|  3.32k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  3.32k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  802|  3.32k|        if(!nextSeparator) {
  ------------------
  |  Branch (802:12): [True: 90, False: 3.23k]
  ------------------
  803|     90|            status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */
  804|     90|            return;
  805|     90|        }
  806|       |        /* strip leading & trailing spaces (TC decided to tolerate these) */
  807|  3.23k|        while(*startSearchHere == ' ') {
  ------------------
  |  Branch (807:15): [True: 0, False: 3.23k]
  ------------------
  808|      0|            startSearchHere++;
  809|      0|        }
  810|  3.23k|        keyValueTail = nextSeparator;
  811|  3.23k|        while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (811:16): [True: 3.23k, False: 0]
  |  Branch (811:50): [True: 0, False: 3.23k]
  ------------------
  812|      0|            keyValueTail--;
  813|      0|        }
  814|       |        /* now keyValueTail points to first char after the keyName */
  815|       |        /* copy & normalize keyName from locale */
  816|  3.23k|        if (startSearchHere == keyValueTail) {
  ------------------
  |  Branch (816:13): [True: 0, False: 3.23k]
  ------------------
  817|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */
  818|      0|            return;
  819|      0|        }
  820|  3.23k|        CharString localeKeywordName;
  821|  14.2k|        while (startSearchHere < keyValueTail) {
  ------------------
  |  Branch (821:16): [True: 11.1k, False: 3.06k]
  ------------------
  822|  11.1k|          if (!UPRV_ISALPHANUM(*startSearchHere)) {
  ------------------
  |  Branch (822:15): [True: 169, False: 11.0k]
  ------------------
  823|    169|            status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  824|    169|            return;
  825|    169|          }
  826|  11.0k|          localeKeywordName.append(uprv_tolower(*startSearchHere++), status);
  ------------------
  |  |   68|  11.0k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  11.0k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  827|  11.0k|        }
  828|  3.06k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (828:13): [True: 0, False: 3.06k]
  ------------------
  829|      0|            return;
  830|      0|        }
  831|       |
  832|  3.06k|        startSearchHere = uprv_strchr(nextSeparator, ';');
  ------------------
  |  |   40|  3.06k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  3.06k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|       |
  834|  3.06k|        if (canonKeywordName == localeKeywordName) {
  ------------------
  |  Branch (834:13): [True: 503, False: 2.56k]
  ------------------
  835|       |             /* current entry matches the keyword. */
  836|    503|           nextSeparator++; /* skip '=' */
  837|       |            /* First strip leading & trailing spaces (TC decided to tolerate these) */
  838|    503|            while(*nextSeparator == ' ') {
  ------------------
  |  Branch (838:19): [True: 0, False: 503]
  ------------------
  839|      0|              nextSeparator++;
  840|      0|            }
  841|    503|            keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator);
  ------------------
  |  |   37|    417|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|    417|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (841:28): [True: 86, False: 417]
  ------------------
  842|    503|            while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (842:19): [True: 503, False: 0]
  |  Branch (842:51): [True: 0, False: 503]
  ------------------
  843|      0|              keyValueTail--;
  844|      0|            }
  845|       |            /* Now copy the value, but check well-formedness */
  846|    503|            if (nextSeparator == keyValueTail) {
  ------------------
  |  Branch (846:17): [True: 0, False: 503]
  ------------------
  847|      0|              status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */
  848|      0|              return;
  849|      0|            }
  850|  14.9M|            while (nextSeparator < keyValueTail) {
  ------------------
  |  Branch (850:20): [True: 14.9M, False: 471]
  ------------------
  851|  14.9M|              if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) {
  ------------------
  |  Branch (851:19): [True: 1.51M, False: 13.4M]
  |  Branch (851:55): [True: 32, False: 1.51M]
  ------------------
  852|     32|                status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */
  853|     32|                return;
  854|     32|              }
  855|       |              /* Should we lowercase value to return here? Tests expect as-is. */
  856|  14.9M|              sink.Append(nextSeparator++, 1);
  857|  14.9M|            }
  858|    471|            return;
  859|    503|        }
  860|  3.06k|    }
  861|  1.31k|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_7810CharStringES6_S6_S6_PPKcR10UErrorCode:
 1514|  90.5k|        UErrorCode& status) {
 1515|  90.5k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1515:9): [True: 0, False: 90.5k]
  ------------------
 1516|       |
 1517|  90.5k|    std::optional<CharStringByteSink> languageSink;
 1518|  90.5k|    std::optional<CharStringByteSink> scriptSink;
 1519|  90.5k|    std::optional<CharStringByteSink> regionSink;
 1520|  90.5k|    std::optional<CharStringByteSink> variantSink;
 1521|       |
 1522|  90.5k|    if (language != nullptr) { languageSink.emplace(language); }
  ------------------
  |  Branch (1522:9): [True: 90.5k, False: 0]
  ------------------
 1523|  90.5k|    if (script != nullptr) { scriptSink.emplace(script); }
  ------------------
  |  Branch (1523:9): [True: 90.5k, False: 0]
  ------------------
 1524|  90.5k|    if (region != nullptr) { regionSink.emplace(region); }
  ------------------
  |  Branch (1524:9): [True: 85.4k, False: 5.14k]
  ------------------
 1525|  90.5k|    if (variant != nullptr) { variantSink.emplace(variant); }
  ------------------
  |  Branch (1525:9): [True: 64.8k, False: 25.6k]
  ------------------
 1526|       |
 1527|  90.5k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  90.5k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  90.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  90.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  90.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1528|  90.5k|            localeID,
 1529|  90.5k|            languageSink.has_value() ? &*languageSink : nullptr,
  ------------------
  |  Branch (1529:13): [True: 90.5k, False: 0]
  ------------------
 1530|  90.5k|            scriptSink.has_value() ? &*scriptSink : nullptr,
  ------------------
  |  Branch (1530:13): [True: 90.5k, False: 0]
  ------------------
 1531|  90.5k|            regionSink.has_value() ? &*regionSink : nullptr,
  ------------------
  |  Branch (1531:13): [True: 85.4k, False: 5.14k]
  ------------------
 1532|  90.5k|            variantSink.has_value() ? &*variantSink : nullptr,
  ------------------
  |  Branch (1532:13): [True: 64.8k, False: 25.6k]
  ------------------
 1533|  90.5k|            pEnd,
 1534|  90.5k|            status);
 1535|  90.5k|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_788ByteSinkES6_S6_S6_PPKcR10UErrorCode:
 1545|   119k|        UErrorCode& status) {
 1546|   119k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1546:9): [True: 0, False: 119k]
  ------------------
 1547|       |
 1548|   119k|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1548:9): [True: 64.8k, False: 54.6k]
  ------------------
 1549|  64.8k|        *pEnd = localeID.data();
 1550|  64.8k|    } else if (language == nullptr &&
  ------------------
  |  Branch (1550:16): [True: 28.9k, False: 25.6k]
  ------------------
 1551|  54.6k|               script == nullptr &&
  ------------------
  |  Branch (1551:16): [True: 28.9k, False: 0]
  ------------------
 1552|  54.6k|               region == nullptr &&
  ------------------
  |  Branch (1552:16): [True: 28.9k, False: 0]
  ------------------
 1553|  54.6k|               variant == nullptr) {
  ------------------
  |  Branch (1553:16): [True: 0, False: 28.9k]
  ------------------
 1554|      0|        return;
 1555|      0|    }
 1556|       |
 1557|   119k|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1557:9): [True: 43.2k, False: 76.3k]
  ------------------
 1558|       |
 1559|  76.3k|    bool hasRegion = false;
 1560|       |
 1561|  76.3k|    {
 1562|  76.3k|        size_t len = _getLanguage(localeID, language, status);
 1563|  76.3k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1563:13): [True: 1.84k, False: 74.4k]
  ------------------
 1564|  74.4k|        if (len > 0) {
  ------------------
  |  Branch (1564:13): [True: 65.8k, False: 8.59k]
  ------------------
 1565|  65.8k|            localeID.remove_prefix(len);
 1566|  65.8k|        }
 1567|  74.4k|    }
 1568|       |
 1569|  74.4k|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1569:9): [True: 19.7k, False: 54.6k]
  ------------------
 1570|  19.7k|        *pEnd = localeID.data();
 1571|  54.6k|    } else if (script == nullptr &&
  ------------------
  |  Branch (1571:16): [True: 28.9k, False: 25.6k]
  ------------------
 1572|  54.6k|               region == nullptr &&
  ------------------
  |  Branch (1572:16): [True: 28.9k, False: 0]
  ------------------
 1573|  54.6k|               variant == nullptr) {
  ------------------
  |  Branch (1573:16): [True: 0, False: 28.9k]
  ------------------
 1574|      0|        return;
 1575|      0|    }
 1576|       |
 1577|  74.4k|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1577:9): [True: 23.1k, False: 51.3k]
  ------------------
 1578|       |
 1579|  51.3k|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1579:9): [True: 46.5k, False: 4.78k]
  ------------------
 1580|  46.5k|        std::string_view sub = localeID;
 1581|  46.5k|        sub.remove_prefix(1);
 1582|  46.5k|        size_t len = _getScript(sub, script);
 1583|  46.5k|        if (len > 0) {
  ------------------
  |  Branch (1583:13): [True: 15.3k, False: 31.2k]
  ------------------
 1584|  15.3k|            localeID.remove_prefix(len + 1);
 1585|  15.3k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1585:17): [True: 1.44k, False: 13.9k]
  ------------------
 1586|  15.3k|        }
 1587|  46.5k|    }
 1588|       |
 1589|  51.3k|    if ((region == nullptr && variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1589:10): [True: 25.4k, False: 25.9k]
  |  Branch (1589:31): [True: 5.13k, False: 20.2k]
  |  Branch (1589:53): [True: 5.13k, False: 0]
  |  Branch (1589:73): [True: 12.1k, False: 34.0k]
  ------------------
 1590|       |
 1591|  34.0k|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1591:9): [True: 29.2k, False: 4.86k]
  ------------------
 1592|  29.2k|        std::string_view sub = localeID;
 1593|  29.2k|        sub.remove_prefix(1);
 1594|  29.2k|        size_t len = _getRegion(sub, region);
 1595|  29.2k|        if (len > 0) {
  ------------------
  |  Branch (1595:13): [True: 20.8k, False: 8.40k]
  ------------------
 1596|  20.8k|            hasRegion = true;
 1597|  20.8k|            localeID.remove_prefix(len + 1);
 1598|  20.8k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1598:17): [True: 6.59k, False: 14.2k]
  ------------------
 1599|  20.8k|        }
 1600|  29.2k|    }
 1601|       |
 1602|  34.0k|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1602:10): [True: 6.05k, False: 28.0k]
  |  Branch (1602:32): [True: 6.05k, False: 0]
  |  Branch (1602:52): [True: 11.6k, False: 16.3k]
  ------------------
 1603|       |
 1604|  16.3k|    bool hasVariant = false;
 1605|       |
 1606|  16.3k|    if (_isIDSeparator(localeID.front()) && !_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1606:9): [True: 11.4k, False: 4.93k]
  |  Branch (1606:45): [True: 11.3k, False: 144]
  ------------------
 1607|  11.3k|        std::string_view sub = localeID;
 1608|       |        /* If there was no country ID, skip a possible extra IDSeparator */
 1609|  11.3k|        size_t skip = !hasRegion && localeID.size() > 1 && _isIDSeparator(localeID[1]) ? 2 : 1;
  ------------------
  |  Branch (1609:23): [True: 8.28k, False: 3.01k]
  |  Branch (1609:37): [True: 8.23k, False: 46]
  |  Branch (1609:60): [True: 7.28k, False: 946]
  ------------------
 1610|  11.3k|        sub.remove_prefix(skip);
 1611|  11.3k|        size_t len = _getVariant(sub, localeID[0], variant, false, status);
 1612|  11.3k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1612:13): [True: 163, False: 11.1k]
  ------------------
 1613|  11.1k|        if (len > 0) {
  ------------------
  |  Branch (1613:13): [True: 11.0k, False: 76]
  ------------------
 1614|  11.0k|            hasVariant = true;
 1615|  11.0k|            localeID.remove_prefix(skip + len);
 1616|  11.0k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1616:17): [True: 2.62k, False: 8.43k]
  ------------------
 1617|  11.0k|        }
 1618|  11.1k|    }
 1619|       |
 1620|  16.2k|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1620:10): [True: 0, False: 16.2k]
  |  Branch (1620:32): [True: 0, False: 0]
  |  Branch (1620:52): [True: 9.89k, False: 6.31k]
  ------------------
 1621|       |
 1622|  6.31k|    if (_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1622:9): [True: 272, False: 6.04k]
  ------------------
 1623|    272|        localeID.remove_prefix(2);
 1624|    272|        constexpr char vaposix[] = "-va-posix";
 1625|    272|        constexpr size_t length = sizeof vaposix - 1;
 1626|   493k|        for (size_t next;; localeID.remove_prefix(next)) {
 1627|   493k|            next = localeID.find('-', 1);
 1628|   493k|            if (next == std::string_view::npos) { break; }
  ------------------
  |  Branch (1628:17): [True: 151, False: 493k]
  ------------------
 1629|   493k|            next = localeID.find('-', next + 1);
 1630|   493k|            bool finished = next == std::string_view::npos;
 1631|   493k|            std::string_view sub = localeID;
 1632|   493k|            if (!finished) { sub.remove_suffix(sub.length() - next); }
  ------------------
  |  Branch (1632:17): [True: 492k, False: 121]
  ------------------
 1633|       |
 1634|   493k|            if (sub.length() == length && uprv_strnicmp(sub.data(), vaposix, length) == 0) {
  ------------------
  |  | 1544|   163k|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|   163k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   163k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   163k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1634:17): [True: 163k, False: 329k]
  |  Branch (1634:43): [True: 79.5k, False: 83.5k]
  ------------------
 1635|  79.5k|                if (variant != nullptr) {
  ------------------
  |  Branch (1635:21): [True: 79.5k, False: 0]
  ------------------
 1636|  79.5k|                    if (hasVariant) { variant->Append("_", 1); }
  ------------------
  |  Branch (1636:25): [True: 74.9k, False: 4.56k]
  ------------------
 1637|  79.5k|                    constexpr char posix[] = "POSIX";
 1638|  79.5k|                    variant->Append(posix, sizeof posix - 1);
 1639|  79.5k|                }
 1640|  79.5k|                if (pEnd != nullptr) { *pEnd = localeID.data() + length; }
  ------------------
  |  Branch (1640:21): [True: 79.5k, False: 0]
  ------------------
 1641|  79.5k|            }
 1642|       |
 1643|   493k|            if (finished) { break; }
  ------------------
  |  Branch (1643:17): [True: 121, False: 492k]
  ------------------
 1644|   493k|        }
 1645|    272|    }
 1646|  6.31k|}
_Z18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2171|  8.40k|{
 2172|  8.40k|    _canonicalize(localeID, sink, 0, err);
 2173|  8.40k|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2195|  55.5k|{
 2196|  55.5k|    return ByteSinkUtil::viaByteSinkToCharString(
 2197|  55.5k|        [&](ByteSink& sink, UErrorCode& status) {
 2198|  55.5k|            ulocimp_getBaseName(localeID, sink, status);
 2199|  55.5k|        },
 2200|  55.5k|        err);
 2201|  55.5k|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2207|  55.5k|{
 2208|  55.5k|    _canonicalize(localeID, sink, _ULOC_STRIP_KEYWORDS, err);
  ------------------
  |  | 1785|  55.5k|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
 2209|  55.5k|}
_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|  57.9k|{
 2337|  57.9k|    return locale_get_default();
  ------------------
  |  |  139|  57.9k|#define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default)
  |  |  ------------------
  |  |  |  |  123|  57.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  57.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  57.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2338|  57.9k|}
_Z34ulocimp_toLegacyKeyWithFallback_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEE:
 2456|  1.60M|{
 2457|  1.60M|    std::optional<std::string_view> legacyKey = ulocimp_toLegacyKey(keyword);
  ------------------
  |  | 1219|  1.60M|#define ulocimp_toLegacyKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyKey)
  |  |  ------------------
  |  |  |  |  123|  1.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2458|  1.60M|    if (!legacyKey.has_value() && isWellFormedLegacyKey(keyword)) {
  ------------------
  |  Branch (2458:9): [True: 1.60M, False: 5.18k]
  |  Branch (2458:35): [True: 1.60M, False: 0]
  ------------------
 2459|       |        // Checks if the specified locale key is well-formed with the legacy locale syntax.
 2460|       |        //
 2461|       |        // Note:
 2462|       |        //  LDML/CLDR provides some definition of keyword syntax in
 2463|       |        //  * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier and
 2464|       |        //  * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax
 2465|       |        //  Keys can only consist of [0-9a-zA-Z].
 2466|  1.60M|        return keyword;
 2467|  1.60M|    }
 2468|  5.18k|    return legacyKey;
 2469|  1.60M|}
_Z35ulocimp_toLegacyTypeWithFallback_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEES3_:
 2482|  10.1k|{
 2483|  10.1k|    std::optional<std::string_view> legacyType = ulocimp_toLegacyType(keyword, value);
  ------------------
  |  | 1221|  10.1k|#define ulocimp_toLegacyType U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2484|  10.1k|    if (!legacyType.has_value() && isWellFormedLegacyType(value)) {
  ------------------
  |  Branch (2484:9): [True: 9.44k, False: 707]
  |  Branch (2484:36): [True: 9.44k, False: 0]
  ------------------
 2485|       |        // Checks if the specified locale type is well-formed with the legacy locale syntax.
 2486|       |        //
 2487|       |        // Note:
 2488|       |        //  LDML/CLDR provides some definition of keyword syntax in
 2489|       |        //  * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier and
 2490|       |        //  * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax
 2491|       |        //  Values (types) can only consist of [0-9a-zA-Z], plus for legacy values
 2492|       |        //  we allow [/_-+] in the middle (e.g. "Etc/GMT+1", "Asia/Tel_Aviv")
 2493|  9.44k|        return value;
 2494|  9.44k|    }
 2495|    707|    return legacyType;
 2496|  10.1k|}
uloc.cpp:_ZN12_GLOBAL__N_121compareKeywordStructsEPKvS1_S1_:
  583|  33.0k|compareKeywordStructs(const void * /*context*/, const void *left, const void *right) {
  584|  33.0k|    const char* leftString = static_cast<const KeywordStruct*>(left)->keyword;
  585|  33.0k|    const char* rightString = static_cast<const KeywordStruct*>(right)->keyword;
  586|  33.0k|    return uprv_strcmp(leftString, rightString);
  ------------------
  |  |   38|  33.0k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  33.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  587|  33.0k|}
uloc.cpp:_ZN12_GLOBAL__N_123locale_canonKeywordNameENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEER10UErrorCode:
  556|  5.54k|{
  557|  5.54k|  if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (557:7): [True: 0, False: 5.54k]
  ------------------
  558|  5.54k|  CharString result;
  559|       |
  560|  11.0k|  for (char c : keywordName) {
  ------------------
  |  Branch (560:15): [True: 11.0k, False: 5.54k]
  ------------------
  561|  11.0k|    if (!UPRV_ISALPHANUM(c)) {
  ------------------
  |  Branch (561:9): [True: 0, False: 11.0k]
  ------------------
  562|      0|      status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  563|      0|      return {};
  564|      0|    }
  565|  11.0k|    result.append(uprv_tolower(c), status);
  ------------------
  |  |   68|  11.0k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  11.0k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  566|  11.0k|  }
  567|  5.54k|  if (result.isEmpty()) {
  ------------------
  |  Branch (567:7): [True: 0, False: 5.54k]
  ------------------
  568|      0|    status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */
  569|      0|    return {};
  570|      0|  }
  571|       |
  572|  5.54k|  return result;
  573|  5.54k|}
uloc.cpp:_ZN12_GLOBAL__N_118_hasBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  510|  70.4k|inline bool _hasBCP47Extension(std::string_view id) {
  511|  70.4k|    return id.find('@') == std::string_view::npos && getShortestSubtagLength(id) == 1;
  ------------------
  |  Branch (511:12): [True: 65.2k, False: 5.16k]
  |  Branch (511:54): [True: 3.93k, False: 61.3k]
  ------------------
  512|  70.4k|}
uloc.cpp:_ZN12_GLOBAL__N_123getShortestSubtagLengthENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  485|  65.2k|int32_t getShortestSubtagLength(std::string_view localeID) {
  486|  65.2k|    int32_t localeIDLength = static_cast<int32_t>(localeID.length());
  487|  65.2k|    int32_t length = localeIDLength;
  488|  65.2k|    int32_t tmpLength = 0;
  489|  65.2k|    int32_t i;
  490|  65.2k|    bool reset = true;
  491|       |
  492|   133M|    for (i = 0; i < localeIDLength; i++) {
  ------------------
  |  Branch (492:17): [True: 133M, False: 65.2k]
  ------------------
  493|   133M|        if (localeID[i] != '_' && localeID[i] != '-') {
  ------------------
  |  Branch (493:13): [True: 133M, False: 247k]
  |  Branch (493:35): [True: 123M, False: 9.71M]
  ------------------
  494|   123M|            if (reset) {
  ------------------
  |  Branch (494:17): [True: 9.93M, False: 113M]
  ------------------
  495|  9.93M|                tmpLength = 0;
  496|  9.93M|                reset = false;
  497|  9.93M|            }
  498|   123M|            tmpLength++;
  499|   123M|        } else {
  500|  9.95M|            if (tmpLength != 0 && tmpLength < length) {
  ------------------
  |  Branch (500:17): [True: 9.95M, False: 3.75k]
  |  Branch (500:35): [True: 15.8k, False: 9.93M]
  ------------------
  501|  15.8k|                length = tmpLength;
  502|  15.8k|            }
  503|  9.95M|            reset = true;
  504|  9.95M|        }
  505|   133M|    }
  506|       |
  507|  65.2k|    return length;
  508|  65.2k|}
uloc.cpp:_ZN12_GLOBAL__N_115UPRV_ISALPHANUMEc:
  516|  40.5M|inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); }
  ------------------
  |  | 1514|  40.5M|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|  40.5M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (516:46): [True: 39.0M, False: 1.54M]
  |  Branch (516:71): [True: 24.1k, False: 1.51M]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_112UPRV_ISDIGITEc:
  515|  1.54M|inline bool UPRV_ISDIGIT(char c) { return c >= '0' && c <= '9'; }
  ------------------
  |  Branch (515:43): [True: 25.1k, False: 1.51M]
  |  Branch (515:55): [True: 24.1k, False: 985]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_125UPRV_OK_VALUE_PUNCTUATIONEc:
  518|  1.51M|inline bool UPRV_OK_VALUE_PUNCTUATION(char c) { return c == '_' || c == '-' || c == '+' || c == '/'; }
  ------------------
  |  Branch (518:56): [True: 959, False: 1.51M]
  |  Branch (518:68): [True: 1.51M, False: 893]
  |  Branch (518:80): [True: 215, False: 678]
  |  Branch (518:92): [True: 646, False: 32]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_110_findIndexEPKPKcS1_:
 1178|  8.75k|{
 1179|  8.75k|    const char* const* anchor = list;
 1180|  8.75k|    int32_t pass = 0;
 1181|       |
 1182|       |    /* Make two passes through two nullptr-terminated arrays at 'list' */
 1183|  11.7k|    while (pass++ < 2) {
  ------------------
  |  Branch (1183:12): [True: 10.2k, False: 1.51k]
  ------------------
 1184|  3.14M|        while (*list) {
  ------------------
  |  Branch (1184:16): [True: 3.14M, False: 3.04k]
  ------------------
 1185|  3.14M|            if (uprv_strcmp(key, *list) == 0) {
  ------------------
  |  |   38|  3.14M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  3.14M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1185:17): [True: 7.24k, False: 3.13M]
  ------------------
 1186|  7.24k|                return static_cast<int16_t>(list - anchor);
 1187|  7.24k|            }
 1188|  3.13M|            list++;
 1189|  3.13M|        }
 1190|  3.04k|        ++list;     /* skip final nullptr *CWB*/
 1191|  3.04k|    }
 1192|  1.51k|    return std::nullopt;
 1193|  8.75k|}
uloc.cpp:_ZN12_GLOBAL__N_112_getLanguageENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkER10UErrorCode:
 1219|  76.3k|size_t _getLanguage(std::string_view localeID, ByteSink* sink, UErrorCode& status) {
 1220|  76.3k|    size_t skip = 0;
 1221|  76.3k|    if (localeID.size() == 4 && uprv_strnicmp(localeID.data(), "root", 4) == 0) {
  ------------------
  |  | 1544|  2.39k|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|  2.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1221:9): [True: 2.39k, False: 73.9k]
  |  Branch (1221:33): [True: 314, False: 2.07k]
  ------------------
 1222|    314|        skip = 4;
 1223|    314|        localeID.remove_prefix(skip);
 1224|  76.0k|    } else if (localeID.size() >= 3 && uprv_strnicmp(localeID.data(), "und", 3) == 0 &&
  ------------------
  |  | 1544|  63.9k|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|  63.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  63.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  63.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1224:16): [True: 63.9k, False: 12.1k]
  |  Branch (1224:40): [True: 1.44k, False: 62.4k]
  ------------------
 1225|  76.0k|               (localeID.size() == 3 ||
  ------------------
  |  Branch (1225:17): [True: 955, False: 487]
  ------------------
 1226|  1.44k|                localeID[3] == '-' ||
  ------------------
  |  Branch (1226:17): [True: 6, False: 481]
  ------------------
 1227|  1.44k|                localeID[3] == '_' ||
  ------------------
  |  Branch (1227:17): [True: 5, False: 476]
  ------------------
 1228|  1.44k|                localeID[3] == '@')) {
  ------------------
  |  Branch (1228:17): [True: 4, False: 472]
  ------------------
 1229|    970|        skip = 3;
 1230|    970|        localeID.remove_prefix(skip);
 1231|    970|    }
 1232|       |
 1233|  76.3k|    constexpr int32_t MAXLEN = ULOC_LANG_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  251|  76.3k|#define ULOC_LANG_CAPACITY 12
  ------------------
 1234|       |
 1235|       |    /* if it starts with i- or x- then copy that prefix */
 1236|  76.3k|    size_t len = _isIDPrefix(localeID) ? 2 : 0;
  ------------------
  |  Branch (1236:18): [True: 943, False: 75.3k]
  ------------------
 1237|   266k|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1237:12): [True: 243k, False: 23.1k]
  |  Branch (1237:37): [True: 238k, False: 4.78k]
  |  Branch (1237:70): [True: 192k, False: 46.5k]
  ------------------
 1238|   192k|        if (len == MAXLEN) {
  ------------------
  |  Branch (1238:13): [True: 1.84k, False: 190k]
  ------------------
 1239|  1.84k|            status = U_ILLEGAL_ARGUMENT_ERROR;
 1240|  1.84k|            return 0;
 1241|  1.84k|        }
 1242|   190k|        len++;
 1243|   190k|    }
 1244|       |
 1245|  74.4k|    if (sink == nullptr || len == 0) { return skip + len; }
  ------------------
  |  Branch (1245:9): [True: 28.9k, False: 45.4k]
  |  Branch (1245:28): [True: 4.56k, False: 40.9k]
  ------------------
 1246|       |
 1247|  40.9k|    int32_t minCapacity = uprv_max(static_cast<int32_t>(len), 4);  // Minimum 3 letters plus NUL.
  ------------------
  |  | 1526|  40.9k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|  40.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1248|  40.9k|    char scratch[MAXLEN];
 1249|  40.9k|    int32_t capacity = 0;
 1250|  40.9k|    char* buffer = sink->GetAppendBuffer(
 1251|  40.9k|            minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|  40.9k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1252|       |
 1253|   149k|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1253:24): [True: 108k, False: 40.9k]
  ------------------
 1254|   108k|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|   108k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   108k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   108k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   108k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   108k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|   108k|    }
 1256|  40.9k|    if (localeID.size() >= 2 && _isIDSeparator(localeID[1])) {
  ------------------
  |  Branch (1256:9): [True: 40.4k, False: 455]
  |  Branch (1256:33): [True: 948, False: 39.5k]
  ------------------
 1257|    948|        buffer[1] = '-';
 1258|    948|    }
 1259|       |
 1260|  40.9k|    if (len == 3) {
  ------------------
  |  Branch (1260:9): [True: 8.26k, False: 32.6k]
  ------------------
 1261|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1262|  8.26k|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|  8.26k|#   define U_ASSERT(exp) (void)0
  ------------------
 1263|  8.26k|        buffer[3] = '\0';
 1264|  8.26k|        std::optional<int16_t> offset = _findIndex(LANGUAGES_3, buffer);
 1265|  8.26k|        if (offset.has_value()) {
  ------------------
  |  Branch (1265:13): [True: 7.23k, False: 1.02k]
  ------------------
 1266|  7.23k|            const char* const alias = LANGUAGES[*offset];
 1267|  7.23k|            sink->Append(alias, static_cast<int32_t>(uprv_strlen(alias)));
  ------------------
  |  |   37|  7.23k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  7.23k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1268|  7.23k|            return skip + len;
 1269|  7.23k|        }
 1270|  8.26k|    }
 1271|       |
 1272|  33.6k|    sink->Append(buffer, static_cast<int32_t>(len));
 1273|  33.6k|    return skip + len;
 1274|  40.9k|}
uloc.cpp:_ZN12_GLOBAL__N_111_isIDPrefixENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1152|  76.3k|inline bool _isIDPrefix(std::string_view s) {
 1153|  76.3k|    return s.size() >= 2 && _isPrefixLetter(s[0]) && _isIDSeparator(s[1]);
  ------------------
  |  Branch (1153:12): [True: 74.2k, False: 2.05k]
  |  Branch (1153:29): [True: 2.74k, False: 71.5k]
  |  Branch (1153:54): [True: 943, False: 1.80k]
  ------------------
 1154|  76.3k|}
uloc.cpp:_ZN12_GLOBAL__N_115_isPrefixLetterEc:
 1148|  74.2k|inline bool _isPrefixLetter(char a) { return a == 'x' || a == 'X' || a == 'i' || a == 'I'; }
  ------------------
  |  Branch (1148:46): [True: 1.22k, False: 73.0k]
  |  Branch (1148:58): [True: 32, False: 73.0k]
  |  Branch (1148:70): [True: 1.48k, False: 71.5k]
  |  Branch (1148:82): [True: 7, False: 71.5k]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_113_isTerminatorEc:
 1159|   595k|inline bool _isTerminator(char a) { return a == '.' || a == '@'; }
  ------------------
  |  Branch (1159:44): [True: 1.06k, False: 594k]
  |  Branch (1159:56): [True: 5.55k, False: 588k]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_110_getScriptENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1276|  46.5k|size_t _getScript(std::string_view localeID, ByteSink* sink) {
 1277|  46.5k|    constexpr int32_t LENGTH = 4;
 1278|       |
 1279|  46.5k|    size_t len = 0;
 1280|   151k|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) &&
  ------------------
  |  Branch (1280:12): [True: 120k, False: 31.1k]
  |  Branch (1280:37): [True: 120k, False: 331]
  |  Branch (1280:70): [True: 108k, False: 11.9k]
  ------------------
 1281|   151k|            uprv_isASCIILetter(localeID[len])) {
  ------------------
  |  | 1514|   108k|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|   108k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   108k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   108k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1281:13): [True: 105k, False: 3.09k]
  ------------------
 1282|   105k|        if (len == LENGTH) { return 0; }
  ------------------
  |  Branch (1282:13): [True: 74, False: 105k]
  ------------------
 1283|   105k|        len++;
 1284|   105k|    }
 1285|  46.5k|    if (len != LENGTH) { return 0; }
  ------------------
  |  Branch (1285:9): [True: 31.1k, False: 15.3k]
  ------------------
 1286|       |
 1287|  15.3k|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1287:9): [True: 6.99k, False: 8.36k]
  ------------------
 1288|       |
 1289|  8.36k|    char scratch[LENGTH];
 1290|  8.36k|    int32_t capacity = 0;
 1291|  8.36k|    char* buffer = sink->GetAppendBuffer(
 1292|  8.36k|            LENGTH, LENGTH, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|  8.36k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1293|       |
 1294|  8.36k|    buffer[0] = uprv_toupper(localeID[0]);
  ------------------
  |  | 1547|  8.36k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  8.36k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.36k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.36k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1295|  33.4k|    for (int32_t i = 1; i < LENGTH; ++i) {
  ------------------
  |  Branch (1295:25): [True: 25.0k, False: 8.36k]
  ------------------
 1296|  25.0k|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|  25.0k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  25.0k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  25.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  25.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  25.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1297|  25.0k|    }
 1298|       |
 1299|  8.36k|    sink->Append(buffer, LENGTH);
 1300|  8.36k|    return len;
 1301|  15.3k|}
uloc.cpp:_ZN12_GLOBAL__N_110_getRegionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1303|  29.2k|size_t _getRegion(std::string_view localeID, ByteSink* sink) {
 1304|  29.2k|    constexpr int32_t MINLEN = 2;
 1305|  29.2k|    constexpr int32_t MAXLEN = ULOC_COUNTRY_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  258|  29.2k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1306|       |
 1307|  29.2k|    size_t len = 0;
 1308|  73.9k|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1308:12): [True: 56.3k, False: 17.6k]
  |  Branch (1308:37): [True: 55.8k, False: 439]
  |  Branch (1308:70): [True: 45.0k, False: 10.7k]
  ------------------
 1309|  45.0k|        if (len == MAXLEN) { return 0; }
  ------------------
  |  Branch (1309:13): [True: 402, False: 44.6k]
  ------------------
 1310|  44.6k|        len++;
 1311|  44.6k|    }
 1312|  28.8k|    if (len < MINLEN) { return 0; }
  ------------------
  |  Branch (1312:9): [True: 8.00k, False: 20.8k]
  ------------------
 1313|       |
 1314|  20.8k|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1314:9): [True: 8.39k, False: 12.4k]
  ------------------
 1315|       |
 1316|  12.4k|    char scratch[ULOC_COUNTRY_CAPACITY];
 1317|  12.4k|    int32_t capacity = 0;
 1318|  12.4k|    char* buffer = sink->GetAppendBuffer(
 1319|  12.4k|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|  12.4k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1320|  12.4k|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|  12.4k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1321|  12.4k|            scratch,
 1322|  12.4k|            UPRV_LENGTHOF(scratch),
  ------------------
  |  |   99|  12.4k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1323|  12.4k|            &capacity);
 1324|       |
 1325|  37.8k|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1325:24): [True: 25.3k, False: 12.4k]
  ------------------
 1326|  25.3k|        buffer[i] = uprv_toupper(localeID[i]);
  ------------------
  |  | 1547|  25.3k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  25.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  25.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  25.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1327|  25.3k|    }
 1328|       |
 1329|  12.4k|    if (len == 3) {
  ------------------
  |  Branch (1329:9): [True: 495, False: 11.9k]
  ------------------
 1330|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1331|    495|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|    495|#   define U_ASSERT(exp) (void)0
  ------------------
 1332|    495|        buffer[3] = '\0';
 1333|    495|        std::optional<int16_t> offset = _findIndex(COUNTRIES_3, buffer);
 1334|    495|        if (offset.has_value()) {
  ------------------
  |  Branch (1334:13): [True: 7, False: 488]
  ------------------
 1335|      7|            const char* const alias = COUNTRIES[*offset];
 1336|      7|            sink->Append(alias, static_cast<int32_t>(uprv_strlen(alias)));
  ------------------
  |  |   37|      7|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      7|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1337|      7|            return len;
 1338|      7|        }
 1339|    495|    }
 1340|       |
 1341|  12.4k|    sink->Append(buffer, static_cast<int32_t>(len));
 1342|  12.4k|    return len;
 1343|  12.4k|}
uloc.cpp:_ZN12_GLOBAL__N_117_isBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1161|   191k|inline bool _isBCP47Extension(std::string_view p) {
 1162|   191k|    return p.size() >= 3 &&
  ------------------
  |  Branch (1162:12): [True: 185k, False: 5.81k]
  ------------------
 1163|   191k|           p[0] == '-' &&
  ------------------
  |  Branch (1163:12): [True: 14.7k, False: 170k]
  ------------------
 1164|   191k|           (p[1] == 't' || p[1] == 'T' ||
  ------------------
  |  Branch (1164:13): [True: 142, False: 14.6k]
  |  Branch (1164:28): [True: 349, False: 14.2k]
  ------------------
 1165|  14.7k|            p[1] == 'u' || p[1] == 'U' ||
  ------------------
  |  Branch (1165:13): [True: 374, False: 13.9k]
  |  Branch (1165:28): [True: 473, False: 13.4k]
  ------------------
 1166|  14.7k|            p[1] == 'x' || p[1] == 'X') &&
  ------------------
  |  Branch (1166:13): [True: 245, False: 13.1k]
  |  Branch (1166:28): [True: 282, False: 12.9k]
  ------------------
 1167|   191k|           p[2] == '-';
  ------------------
  |  Branch (1167:12): [True: 545, False: 1.32k]
  ------------------
 1168|   191k|}
uloc.cpp:_ZN12_GLOBAL__N_111_getVariantENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEcPN6icu_788ByteSinkEbR10UErrorCode:
 1354|  11.3k|            UErrorCode& status) {
 1355|  11.3k|    if (U_FAILURE(status) || localeID.empty()) return 0;
  ------------------
  |  Branch (1355:9): [True: 0, False: 11.3k]
  |  Branch (1355:30): [True: 53, False: 11.2k]
  ------------------
 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|  11.2k|    constexpr int32_t MAX_VARIANTS_LENGTH = 179;
 1366|       |
 1367|       |    /* get one or more variant tags and separate them with '_' */
 1368|  11.2k|    size_t index = 0;
 1369|  11.2k|    if (_isIDSeparator(prev)) {
  ------------------
  |  Branch (1369:9): [True: 11.2k, False: 0]
  ------------------
 1370|       |        /* get a variant string after a '-' or '_' */
 1371|   184k|        for (std::string_view sub = localeID;;) {
 1372|   184k|            size_t next = sub.find_first_of(".@_-");
 1373|       |            // For historical reasons, a trailing separator is included in the variant.
 1374|   184k|            bool finished = next == std::string_view::npos || next + 1 == sub.length();
  ------------------
  |  Branch (1374:29): [True: 9.29k, False: 175k]
  |  Branch (1374:63): [True: 651, False: 174k]
  ------------------
 1375|   184k|            size_t limit = finished ? sub.length() : next;
  ------------------
  |  Branch (1375:28): [True: 9.94k, False: 174k]
  ------------------
 1376|   184k|            index += limit;
 1377|   184k|            if (index > MAX_VARIANTS_LENGTH) {
  ------------------
  |  Branch (1377:17): [True: 163, False: 184k]
  ------------------
 1378|    163|                status = U_ILLEGAL_ARGUMENT_ERROR;
 1379|    163|                return 0;
 1380|    163|            }
 1381|       |
 1382|   184k|            if (sink != nullptr) {
  ------------------
  |  Branch (1382:17): [True: 184k, False: 0]
  ------------------
 1383|   184k|                if (needSeparator) {
  ------------------
  |  Branch (1383:21): [True: 173k, False: 11.1k]
  ------------------
 1384|   173k|                    sink->Append("_", 1);
 1385|   173k|                } else {
 1386|  11.1k|                    needSeparator = true;
 1387|  11.1k|                }
 1388|       |
 1389|   184k|                int32_t length = static_cast<int32_t>(limit);
 1390|   184k|                int32_t minCapacity = uprv_min(length, MAX_VARIANTS_LENGTH);
  ------------------
  |  | 1529|   184k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   184k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   184k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   184k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1391|   184k|                char scratch[MAX_VARIANTS_LENGTH];
 1392|   184k|                int32_t capacity = 0;
 1393|   184k|                char* buffer = sink->GetAppendBuffer(
 1394|   184k|                        minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|   184k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1395|       |
 1396|   501k|                for (size_t i = 0; i < limit; ++i) {
  ------------------
  |  Branch (1396:36): [True: 316k, False: 184k]
  ------------------
 1397|   316k|                    buffer[i] = uprv_toupper(sub[i]);
  ------------------
  |  | 1547|   316k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|   316k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   316k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   316k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1398|   316k|                }
 1399|   184k|                sink->Append(buffer, length);
 1400|   184k|            }
 1401|       |
 1402|   184k|            if (finished) { return index; }
  ------------------
  |  Branch (1402:17): [True: 9.89k, False: 174k]
  ------------------
 1403|   174k|            sub.remove_prefix(next);
 1404|   174k|            if (_isTerminator(sub.front()) || _isBCP47Extension(sub)) { return index; }
  ------------------
  |  Branch (1404:17): [True: 1.05k, False: 173k]
  |  Branch (1404:47): [True: 129, False: 173k]
  ------------------
 1405|   173k|            sub.remove_prefix(1);
 1406|   173k|            index++;
 1407|   173k|        }
 1408|  11.2k|    }
 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|  64.8k|              UErrorCode& err) {
 1807|  64.8k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1807:9): [True: 0, False: 64.8k]
  ------------------
 1808|      0|        return;
 1809|      0|    }
 1810|       |
 1811|  64.8k|    int32_t j, fieldCount=0;
 1812|  64.8k|    CharString tempBuffer;  // if localeID has a BCP47 extension, tmpLocaleID points to this
 1813|  64.8k|    CharString localeIDWithHyphens;  // if localeID has a BPC47 extension and have _, tmpLocaleID points to this
 1814|  64.8k|    std::string_view origLocaleID;
 1815|  64.8k|    std::string_view tmpLocaleID;
 1816|  64.8k|    size_t keywordAssign = std::string_view::npos;
 1817|  64.8k|    size_t separatorIndicator = std::string_view::npos;
 1818|       |
 1819|  64.8k|    if (_hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (1819:9): [True: 3.53k, False: 61.3k]
  ------------------
 1820|  3.53k|        std::string_view localeIDPtr = localeID;
 1821|       |
 1822|       |        // convert all underbars to hyphens, unless the "BCP47 extension" comes at the beginning of the string
 1823|  3.53k|        if (localeID.size() >= 2 && localeID.find('_') != std::string_view::npos && localeID[1] != '-' && localeID[1] != '_') {
  ------------------
  |  Branch (1823:13): [True: 3.30k, False: 226]
  |  Branch (1823:37): [True: 2.17k, False: 1.13k]
  |  Branch (1823:85): [True: 2.04k, False: 129]
  |  Branch (1823:107): [True: 1.65k, False: 394]
  ------------------
 1824|  1.65k|            localeIDWithHyphens.append(localeID, err);
 1825|  1.65k|            if (U_SUCCESS(err)) {
  ------------------
  |  Branch (1825:17): [True: 1.65k, False: 0]
  ------------------
 1826|  55.9M|                for (char* p = localeIDWithHyphens.data(); *p != '\0'; ++p) {
  ------------------
  |  Branch (1826:60): [True: 55.9M, False: 1.65k]
  ------------------
 1827|  55.9M|                    if (*p == '_') {
  ------------------
  |  Branch (1827:25): [True: 48.8k, False: 55.8M]
  ------------------
 1828|  48.8k|                        *p = '-';
 1829|  48.8k|                    }
 1830|  55.9M|                }
 1831|  1.65k|                localeIDPtr = localeIDWithHyphens.toStringPiece();
 1832|  1.65k|            }
 1833|  1.65k|        }
 1834|       |
 1835|  3.53k|        tempBuffer = ulocimp_forLanguageTag(localeIDPtr.data(), static_cast<int32_t>(localeIDPtr.size()), nullptr, err);
  ------------------
  |  | 1198|  3.53k|#define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag)
  |  |  ------------------
  |  |  |  |  123|  3.53k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.53k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.53k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1836|  3.53k|        tmpLocaleID = U_SUCCESS(err) && !tempBuffer.isEmpty() ? static_cast<std::string_view>(tempBuffer.toStringPiece()) : localeIDPtr;
  ------------------
  |  Branch (1836:23): [True: 3.53k, False: 0]
  |  Branch (1836:41): [True: 1.78k, False: 1.74k]
  ------------------
 1837|  61.3k|    } else {
 1838|  61.3k|        tmpLocaleID=localeID;
 1839|  61.3k|    }
 1840|       |
 1841|  64.8k|    origLocaleID=tmpLocaleID;
 1842|       |
 1843|       |    /* get all pieces, one after another, and separate with '_' */
 1844|  64.8k|    CharString tag;
 1845|  64.8k|    CharString script;
 1846|  64.8k|    CharString country;
 1847|  64.8k|    CharString variant;
 1848|  64.8k|    const char* end = nullptr;
 1849|  64.8k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  64.8k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  64.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  64.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  64.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1850|  64.8k|            tmpLocaleID,
 1851|  64.8k|            &tag,
 1852|  64.8k|            &script,
 1853|  64.8k|            &country,
 1854|  64.8k|            &variant,
 1855|  64.8k|            &end,
 1856|  64.8k|            err);
 1857|  64.8k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1857:9): [True: 2.00k, False: 62.8k]
  ------------------
 1858|  2.00k|        return;
 1859|  2.00k|    }
 1860|  62.8k|    U_ASSERT(end != nullptr);
  ------------------
  |  |   35|  62.8k|#   define U_ASSERT(exp) (void)0
  ------------------
 1861|  62.8k|    if (end > tmpLocaleID.data()) {
  ------------------
  |  Branch (1861:9): [True: 17.6k, False: 45.2k]
  ------------------
 1862|  17.6k|        tmpLocaleID.remove_prefix(end - tmpLocaleID.data());
 1863|  17.6k|    }
 1864|       |
 1865|  62.8k|    if (tag.length() == I_DEFAULT_LENGTH && origLocaleID.length() >= I_DEFAULT_LENGTH &&
  ------------------
  |  Branch (1865:9): [True: 178, False: 62.6k]
  |  Branch (1865:45): [True: 178, False: 0]
  ------------------
 1866|  62.8k|            uprv_strncmp(origLocaleID.data(), i_default, I_DEFAULT_LENGTH) == 0) {
  ------------------
  |  |   44|    178|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|    178|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1866:13): [True: 10, False: 168]
  ------------------
 1867|     10|        tag.clear();
 1868|     10|        tag.append(uloc_getDefault(), err);
  ------------------
  |  | 1118|     10|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1869|  62.8k|    } else {
 1870|  62.8k|        if (!script.isEmpty()) {
  ------------------
  |  Branch (1870:13): [True: 1.44k, False: 61.3k]
  ------------------
 1871|  1.44k|            ++fieldCount;
 1872|  1.44k|            tag.append('_', err);
 1873|  1.44k|            tag.append(script, err);
 1874|  1.44k|        }
 1875|  62.8k|        if (!country.isEmpty()) {
  ------------------
  |  Branch (1875:13): [True: 6.58k, False: 56.2k]
  ------------------
 1876|  6.58k|            ++fieldCount;
 1877|  6.58k|            tag.append('_', err);
 1878|  6.58k|            tag.append(country, err);
 1879|  6.58k|        }
 1880|  62.8k|        if (!variant.isEmpty()) {
  ------------------
  |  Branch (1880:13): [True: 2.63k, False: 60.2k]
  ------------------
 1881|  2.63k|            ++fieldCount;
 1882|  2.63k|            if (country.isEmpty()) {
  ------------------
  |  Branch (1882:17): [True: 2.19k, False: 440]
  ------------------
 1883|  2.19k|                tag.append('_', err);
 1884|  2.19k|            }
 1885|  2.63k|            tag.append('_', err);
 1886|  2.63k|            tag.append(variant, err);
 1887|  2.63k|        }
 1888|  62.8k|    }
 1889|       |
 1890|       |    /* Copy POSIX-style charset specifier, if any [mr.utf8] */
 1891|  62.8k|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) && !tmpLocaleID.empty() && tmpLocaleID.front() == '.') {
  ------------------
  |  | 1786|  62.8k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1891:9): [True: 61.9k, False: 886]
  |  Branch (1891:53): [True: 5.74k, False: 56.2k]
  |  Branch (1891:77): [True: 497, False: 5.25k]
  ------------------
 1892|    497|        tag.append('.', err);
 1893|    497|        tmpLocaleID.remove_prefix(1);
 1894|    497|        size_t length;
 1895|    497|        if (size_t atPos = tmpLocaleID.find('@'); atPos != std::string_view::npos) {
  ------------------
  |  Branch (1895:51): [True: 114, False: 383]
  ------------------
 1896|    114|            length = atPos;
 1897|    383|        } else {
 1898|    383|            length = tmpLocaleID.length();
 1899|    383|        }
 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|    497|        constexpr size_t kMaxCharsetLength = 64;
 1906|    497|        if (length > kMaxCharsetLength) {
  ------------------
  |  Branch (1906:13): [True: 63, False: 434]
  ------------------
 1907|     63|           err = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
 1908|     63|           return;
 1909|     63|        }
 1910|    434|        if (length > 0) {
  ------------------
  |  Branch (1910:13): [True: 370, False: 64]
  ------------------
 1911|    370|            tag.append(tmpLocaleID.data(), static_cast<int32_t>(length), err);
 1912|    370|            tmpLocaleID.remove_prefix(length);
 1913|    370|        }
 1914|    434|    }
 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|  62.7k|    if (const char* start = locale_getKeywordsStart(tmpLocaleID); start != nullptr) {
  ------------------
  |  |  138|  62.7k|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|  62.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  62.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  62.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1918:67): [True: 5.13k, False: 57.6k]
  ------------------
 1919|  5.13k|        if (start > tmpLocaleID.data()) {
  ------------------
  |  Branch (1919:13): [True: 150, False: 4.98k]
  ------------------
 1920|    150|            tmpLocaleID.remove_prefix(start - tmpLocaleID.data());
 1921|    150|        }
 1922|  5.13k|        keywordAssign = tmpLocaleID.find('=');
 1923|  5.13k|        separatorIndicator = tmpLocaleID.find(';');
 1924|  57.6k|    } else {
 1925|  57.6k|        tmpLocaleID = {};
 1926|  57.6k|    }
 1927|       |
 1928|       |    /* Copy POSIX-style variant, if any [mr@FOO] */
 1929|  62.7k|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) &&
  ------------------
  |  | 1786|  62.7k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1929:9): [True: 61.9k, False: 886]
  ------------------
 1930|  62.7k|        !tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1930:9): [True: 5.13k, False: 56.7k]
  |  Branch (1930:33): [True: 426, False: 4.70k]
  ------------------
 1931|    426|        tag.append(tmpLocaleID, err);
 1932|    426|        tmpLocaleID = {};
 1933|    426|    }
 1934|       |
 1935|  62.7k|    if (OPTION_SET(options, _ULOC_CANONICALIZE)) {
  ------------------
  |  | 1786|  62.7k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1935:9): [True: 886, False: 61.9k]
  ------------------
 1936|       |        /* Handle @FOO variant if @ is present and not followed by = */
 1937|    886|        if (!tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1937:13): [True: 0, False: 886]
  |  Branch (1937:37): [True: 0, False: 0]
  ------------------
 1938|       |            /* Add missing '_' if needed */
 1939|      0|            if (fieldCount < 2 || (fieldCount < 3 && !script.isEmpty())) {
  ------------------
  |  Branch (1939:17): [True: 0, False: 0]
  |  Branch (1939:36): [True: 0, False: 0]
  |  Branch (1939:54): [True: 0, False: 0]
  ------------------
 1940|      0|                do {
 1941|      0|                    tag.append('_', err);
 1942|      0|                    ++fieldCount;
 1943|      0|                } while(fieldCount<2);
  ------------------
  |  Branch (1943:25): [True: 0, False: 0]
  ------------------
 1944|      0|            }
 1945|       |
 1946|      0|            CharStringByteSink s(&tag);
 1947|      0|            std::string_view sub = tmpLocaleID;
 1948|      0|            sub.remove_prefix(1);
 1949|      0|            _getVariant(sub, '@', &s, !variant.isEmpty(), err);
 1950|      0|            if (U_FAILURE(err)) { return; }
  ------------------
  |  Branch (1950:17): [True: 0, False: 0]
  ------------------
 1951|      0|        }
 1952|       |
 1953|       |        /* Look up the ID in the canonicalization map */
 1954|  9.74k|        for (j=0; j<UPRV_LENGTHOF(CANONICALIZE_MAP); j++) {
  ------------------
  |  |   99|  9.74k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1954:19): [True: 8.86k, False: 886]
  ------------------
 1955|  8.86k|            StringPiece id(CANONICALIZE_MAP[j].id);
 1956|  8.86k|            if (tag == id) {
  ------------------
  |  Branch (1956:17): [True: 0, False: 8.86k]
  ------------------
 1957|      0|                if (id.empty() && !tmpLocaleID.empty()) {
  ------------------
  |  Branch (1957:21): [True: 0, False: 0]
  |  Branch (1957:35): [True: 0, False: 0]
  ------------------
 1958|      0|                    break; /* Don't remap "" if keywords present */
 1959|      0|                }
 1960|      0|                tag.clear();
 1961|      0|                tag.append(CANONICALIZE_MAP[j].canonicalID, err);
 1962|      0|                break;
 1963|      0|            }
 1964|  8.86k|        }
 1965|    886|    }
 1966|       |
 1967|  62.7k|    sink.Append(tag.data(), tag.length());
 1968|       |
 1969|  62.7k|    if (!OPTION_SET(options, _ULOC_STRIP_KEYWORDS)) {
  ------------------
  |  | 1785|  62.7k|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
  |  Branch (1969:9): [True: 7.25k, False: 55.5k]
  ------------------
 1970|  7.25k|        if (!tmpLocaleID.empty() && keywordAssign != std::string_view::npos &&
  ------------------
  |  Branch (1970:13): [True: 2.70k, False: 4.55k]
  |  Branch (1970:37): [True: 2.70k, False: 0]
  ------------------
 1971|  7.25k|            (separatorIndicator == std::string_view::npos || separatorIndicator > keywordAssign)) {
  ------------------
  |  Branch (1971:14): [True: 1.32k, False: 1.37k]
  |  Branch (1971:62): [True: 1.34k, False: 31]
  ------------------
 1972|  2.67k|            sink.Append("@", 1);
 1973|  2.67k|            ++fieldCount;
 1974|  2.67k|            tmpLocaleID.remove_prefix(1);
 1975|  2.67k|            ulocimp_getKeywords(tmpLocaleID, '@', sink, true, err);
  ------------------
  |  | 1201|  2.67k|#define ulocimp_getKeywords U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywords)
  |  |  ------------------
  |  |  |  |  123|  2.67k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.67k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.67k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1976|  2.67k|        }
 1977|  7.25k|    }
 1978|  62.7k|}
uloc.cpp:_ZN12_GLOBAL__N_110OPTION_SETEjj:
 1790|   251k|inline bool OPTION_SET(uint32_t options, uint32_t mask) { return (options & mask) != 0; }
uloc.cpp:_ZN12_GLOBAL__N_121isWellFormedLegacyKeyENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 2421|  1.60M|{
 2422|  1.60M|    return std::all_of(key.begin(), key.end(), UPRV_ISALPHANUM);
 2423|  1.60M|}
uloc.cpp:_ZN12_GLOBAL__N_122isWellFormedLegacyTypeENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 2427|  9.44k|{
 2428|  9.44k|    int32_t alphaNumLen = 0;
 2429|  26.1M|    for (char c : legacyType) {
  ------------------
  |  Branch (2429:17): [True: 26.1M, False: 9.44k]
  ------------------
 2430|  26.1M|        if (c == '_' || c == '/' || c == '-') {
  ------------------
  |  Branch (2430:13): [True: 0, False: 26.1M]
  |  Branch (2430:25): [True: 0, False: 26.1M]
  |  Branch (2430:37): [True: 3.72M, False: 22.4M]
  ------------------
 2431|  3.72M|            if (alphaNumLen == 0) {
  ------------------
  |  Branch (2431:17): [True: 0, False: 3.72M]
  ------------------
 2432|      0|                return false;
 2433|      0|            }
 2434|  3.72M|            alphaNumLen = 0;
 2435|  22.4M|        } else if (UPRV_ISALPHANUM(c)) {
  ------------------
  |  Branch (2435:20): [True: 22.4M, False: 0]
  ------------------
 2436|  22.4M|            alphaNumLen++;
 2437|  22.4M|        } else {
 2438|      0|            return false;
 2439|      0|        }
 2440|  26.1M|    }
 2441|  9.44k|    return alphaNumLen != 0;
 2442|  9.44k|}
uloc.cpp:_ZZ23uloc_getKeywordValue_78ENK3$_0clERN6icu_788ByteSinkER10UErrorCode:
  741|  2.00k|        [&](ByteSink& sink, UErrorCode& status) {
  742|  2.00k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  ------------------
  |  | 1200|  2.00k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  2.00k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.00k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.00k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  743|  2.00k|        },
uloc.cpp:_ZZ22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2197|  55.5k|        [&](ByteSink& sink, UErrorCode& status) {
 2198|  55.5k|            ulocimp_getBaseName(localeID, sink, status);
  ------------------
  |  | 1199|  55.5k|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|  55.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2199|  55.5k|        },
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|        },

_Z22ulocimp_toLegacyKey_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEE:
  462|  1.60M|ulocimp_toLegacyKey(std::string_view key) {
  463|  1.60M|    if (!init()) {
  ------------------
  |  Branch (463:9): [True: 0, False: 1.60M]
  ------------------
  464|      0|        return std::nullopt;
  465|      0|    }
  466|       |
  467|  1.60M|    LocExtKeyData* keyData = static_cast<LocExtKeyData*>(uhash_get(gLocExtKeyMap, &key));
  ------------------
  |  | 1007|  1.60M|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  1.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  468|  1.60M|    if (keyData != nullptr) {
  ------------------
  |  Branch (468:9): [True: 5.18k, False: 1.60M]
  ------------------
  469|  5.18k|        return keyData->legacyId;
  470|  5.18k|    }
  471|       |
  472|  1.60M|    return std::nullopt;
  473|  1.60M|}
_Z23ulocimp_toLegacyType_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEES3_:
  509|  10.1k|ulocimp_toLegacyType(std::string_view key, std::string_view type) {
  510|  10.1k|    if (!init()) {
  ------------------
  |  Branch (510:9): [True: 0, False: 10.1k]
  ------------------
  511|      0|        return std::nullopt;
  512|      0|    }
  513|       |
  514|  10.1k|    LocExtKeyData* keyData = static_cast<LocExtKeyData*>(uhash_get(gLocExtKeyMap, &key));
  ------------------
  |  | 1007|  10.1k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|  10.1k|    if (keyData != nullptr) {
  ------------------
  |  Branch (515:9): [True: 3.16k, False: 6.98k]
  ------------------
  516|  3.16k|        LocExtType* t = static_cast<LocExtType*>(uhash_get(keyData->typeMap.getAlias(), &type));
  ------------------
  |  | 1007|  3.16k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  3.16k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.16k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.16k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  517|  3.16k|        if (t != nullptr) {
  ------------------
  |  Branch (517:13): [True: 253, False: 2.91k]
  ------------------
  518|    253|            return t->legacyId;
  519|    253|        }
  520|  2.91k|        if (keyData->specialTypes != SPECIALTYPE_NONE) {
  ------------------
  |  Branch (520:13): [True: 2.43k, False: 475]
  ------------------
  521|  2.43k|            bool matched = false;
  522|  2.43k|            if (keyData->specialTypes & SPECIALTYPE_CODEPOINTS) {
  ------------------
  |  Branch (522:17): [True: 1.07k, False: 1.36k]
  ------------------
  523|  1.07k|                matched = isSpecialTypeCodepoints(type);
  524|  1.07k|            }
  525|  2.43k|            if (!matched && keyData->specialTypes & SPECIALTYPE_REORDER_CODE) {
  ------------------
  |  Branch (525:17): [True: 2.22k, False: 207]
  |  Branch (525:29): [True: 463, False: 1.76k]
  ------------------
  526|    463|                matched = isSpecialTypeReorderCode(type);
  527|    463|            }
  528|  2.43k|            if (!matched && keyData->specialTypes & SPECIALTYPE_RG_KEY_VALUE) {
  ------------------
  |  Branch (528:17): [True: 2.00k, False: 430]
  |  Branch (528:29): [True: 903, False: 1.10k]
  ------------------
  529|    903|                matched = isSpecialTypeRgKeyValue(type);
  530|    903|            }
  531|  2.43k|            if (matched) {
  ------------------
  |  Branch (531:17): [True: 454, False: 1.98k]
  ------------------
  532|    454|                return type;
  533|    454|            }
  534|  2.43k|        }
  535|  2.91k|    }
  536|       |
  537|  9.44k|    return std::nullopt;
  538|  10.1k|}
uloc_keytype.cpp:_ZN12_GLOBAL__N_14initEv:
  384|  1.61M|init() {
  385|  1.61M|    UErrorCode sts = U_ZERO_ERROR;
  386|  1.61M|    umtx_initOnce(gLocExtKeyMapInitOnce, &initFromResourceBundle, sts);
  387|  1.61M|    if (U_FAILURE(sts)) {
  ------------------
  |  Branch (387:9): [True: 0, False: 1.61M]
  ------------------
  388|      0|        return false;
  389|      0|    }
  390|  1.61M|    return true;
  391|  1.61M|}
uloc_keytype.cpp:_ZN12_GLOBAL__N_122initFromResourceBundleER10UErrorCode:
   91|      1|initFromResourceBundle(UErrorCode& sts) {
   92|      1|    U_NAMESPACE_USE
  ------------------
  |  |  112|      1|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
   93|      1|    ucln_common_registerCleanup(UCLN_COMMON_LOCALE_KEY_TYPE, uloc_key_type_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   94|       |
   95|      1|    gLocExtKeyMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  gLocExtKeyMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts);
  ------------------
  |  | 1013|      1|#define uhash_hashIStringView U_ICU_ENTRY_POINT_RENAME(uhash_hashIStringView)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  gLocExtKeyMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts);
  ------------------
  |  |  995|      1|#define uhash_compareIStringView U_ICU_ENTRY_POINT_RENAME(uhash_compareIStringView)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|       |
   97|      1|    LocalUResourceBundlePointer keyTypeDataRes(ures_openDirect(nullptr, "keyTypeData", &sts));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|      1|    LocalUResourceBundlePointer keyMapRes(ures_getByKey(keyTypeDataRes.getAlias(), "keyMap", nullptr, &sts));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|      1|    LocalUResourceBundlePointer typeMapRes(ures_getByKey(keyTypeDataRes.getAlias(), "typeMap", nullptr, &sts));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  100|       |
  101|      1|    if (U_FAILURE(sts)) {
  ------------------
  |  Branch (101:9): [True: 0, False: 1]
  ------------------
  102|      0|        return;
  103|      0|    }
  104|       |
  105|      1|    UErrorCode tmpSts = U_ZERO_ERROR;
  106|      1|    LocalUResourceBundlePointer typeAliasRes(ures_getByKey(keyTypeDataRes.getAlias(), "typeAlias", nullptr, &tmpSts));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|      1|    tmpSts = U_ZERO_ERROR;
  108|      1|    LocalUResourceBundlePointer bcpTypeAliasRes(ures_getByKey(keyTypeDataRes.getAlias(), "bcpTypeAlias", nullptr, &tmpSts));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  109|       |
  110|       |    // initialize pools storing dynamically allocated objects
  111|      1|    gKeyTypeStringPool = new icu::MemoryPool<icu::CharString>;
  112|      1|    if (gKeyTypeStringPool == nullptr) {
  ------------------
  |  Branch (112:9): [True: 0, False: 1]
  ------------------
  113|      0|        sts = U_MEMORY_ALLOCATION_ERROR;
  114|      0|        return;
  115|      0|    }
  116|      1|    gLocExtKeyDataEntries = new icu::MemoryPool<LocExtKeyData>;
  117|      1|    if (gLocExtKeyDataEntries == nullptr) {
  ------------------
  |  Branch (117:9): [True: 0, False: 1]
  ------------------
  118|      0|        sts = U_MEMORY_ALLOCATION_ERROR;
  119|      0|        return;
  120|      0|    }
  121|      1|    gLocExtTypeEntries = new icu::MemoryPool<LocExtType>;
  122|      1|    if (gLocExtTypeEntries == nullptr) {
  ------------------
  |  Branch (122:9): [True: 0, False: 1]
  ------------------
  123|      0|        sts = U_MEMORY_ALLOCATION_ERROR;
  124|      0|        return;
  125|      0|    }
  126|      1|    gTypeAliasEntries = new icu::MemoryPool<TypeAlias>;
  127|      1|    if (gTypeAliasEntries == nullptr) {
  ------------------
  |  Branch (127:9): [True: 0, False: 1]
  ------------------
  128|      0|        sts = U_MEMORY_ALLOCATION_ERROR;
  129|      0|        return;
  130|      0|    }
  131|       |
  132|       |    // iterate through keyMap resource
  133|      1|    LocalUResourceBundlePointer keyMapEntry;
  134|       |
  135|     38|    while (ures_hasNext(keyMapRes.getAlias())) {
  ------------------
  |  | 1689|     38|#define ures_hasNext U_ICU_ENTRY_POINT_RENAME(ures_hasNext)
  |  |  ------------------
  |  |  |  |  123|     38|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     38|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     38|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (135:12): [True: 37, False: 1]
  ------------------
  136|     37|        keyMapEntry.adoptInstead(ures_getNextResource(keyMapRes.getAlias(), keyMapEntry.orphan(), &sts));
  ------------------
  |  | 1672|     37|#define ures_getNextResource U_ICU_ENTRY_POINT_RENAME(ures_getNextResource)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|     37|        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (137:13): [True: 0, False: 37]
  ------------------
  138|      0|            break;
  139|      0|        }
  140|     37|        const char* legacyKeyId = ures_getKey(keyMapEntry.getAlias());
  ------------------
  |  | 1666|     37|#define ures_getKey U_ICU_ENTRY_POINT_RENAME(ures_getKey)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  141|     37|        UnicodeString uBcpKeyId = ures_getUnicodeString(keyMapEntry.getAlias(), &sts);
  142|     37|        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (142:13): [True: 0, False: 37]
  ------------------
  143|      0|            break;
  144|      0|        }
  145|       |
  146|       |        // empty value indicates that BCP key is same with the legacy key.
  147|     37|        const char* bcpKeyId = legacyKeyId;
  148|     37|        if (!uBcpKeyId.isEmpty()) {
  ------------------
  |  Branch (148:13): [True: 17, False: 20]
  ------------------
  149|     17|            icu::CharString* bcpKeyIdBuf = gKeyTypeStringPool->create();
  150|     17|            if (bcpKeyIdBuf == nullptr) {
  ------------------
  |  Branch (150:17): [True: 0, False: 17]
  ------------------
  151|      0|                sts = U_MEMORY_ALLOCATION_ERROR;
  152|      0|                break;
  153|      0|            }
  154|     17|            bcpKeyIdBuf->appendInvariantChars(uBcpKeyId, sts);
  155|     17|            if (U_FAILURE(sts)) {
  ------------------
  |  Branch (155:17): [True: 0, False: 17]
  ------------------
  156|      0|                break;
  157|      0|            }
  158|     17|            bcpKeyId = bcpKeyIdBuf->data();
  159|     17|        }
  160|       |
  161|     37|        bool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0;
  ------------------
  |  |   38|     37|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     37|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  162|       |
  163|     37|        UHashtable* typeDataMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts);
  ------------------
  |  | 1030|     37|#define uhash_open U_ICU_ENTRY_POINT_RENAME(uhash_open)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      UHashtable* typeDataMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts);
  ------------------
  |  | 1013|     37|#define uhash_hashIStringView U_ICU_ENTRY_POINT_RENAME(uhash_hashIStringView)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      UHashtable* typeDataMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts);
  ------------------
  |  |  995|     37|#define uhash_compareIStringView U_ICU_ENTRY_POINT_RENAME(uhash_compareIStringView)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|     37|        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (164:13): [True: 0, False: 37]
  ------------------
  165|      0|            break;
  166|      0|        }
  167|     37|        uint32_t specialTypes = SPECIALTYPE_NONE;
  168|       |
  169|     37|        LocalUResourceBundlePointer typeAliasResByKey;
  170|     37|        LocalUResourceBundlePointer bcpTypeAliasResByKey;
  171|       |
  172|     37|        if (typeAliasRes.isValid()) {
  ------------------
  |  Branch (172:13): [True: 37, False: 0]
  ------------------
  173|     37|            tmpSts = U_ZERO_ERROR;
  174|     37|            typeAliasResByKey.adoptInstead(ures_getByKey(typeAliasRes.getAlias(), legacyKeyId, nullptr, &tmpSts));
  ------------------
  |  | 1661|     37|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|     37|            if (U_FAILURE(tmpSts)) {
  ------------------
  |  Branch (175:17): [True: 35, False: 2]
  ------------------
  176|     35|                typeAliasResByKey.orphan();
  177|     35|            }
  178|     37|        }
  179|     37|        if (bcpTypeAliasRes.isValid()) {
  ------------------
  |  Branch (179:13): [True: 37, False: 0]
  ------------------
  180|     37|            tmpSts = U_ZERO_ERROR;
  181|     37|            bcpTypeAliasResByKey.adoptInstead(ures_getByKey(bcpTypeAliasRes.getAlias(), bcpKeyId, nullptr, &tmpSts));
  ------------------
  |  | 1661|     37|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  182|     37|            if (U_FAILURE(tmpSts)) {
  ------------------
  |  Branch (182:17): [True: 35, False: 2]
  ------------------
  183|     35|                bcpTypeAliasResByKey.orphan();
  184|     35|            }
  185|     37|        }
  186|       |
  187|       |        // look up type map for the key, and walk through the mapping data
  188|     37|        LocalUResourceBundlePointer typeMapResByKey(ures_getByKey(typeMapRes.getAlias(), legacyKeyId, nullptr, &sts));
  ------------------
  |  | 1661|     37|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|     37|        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (189:13): [True: 0, False: 37]
  ------------------
  190|       |            // We fail here if typeMap does not have an entry corresponding to every entry in keyMap (should
  191|       |            // not happen for valid keyTypeData), or if ures_getByKeyfails fails for some other reason
  192|       |            // (e.g. data file cannot be loaded, using stubdata, over-aggressive data filtering has removed
  193|       |            // something like timezoneTypes.res, etc.). Error code is already set. See ICU-21669.
  194|      0|            UPRV_UNREACHABLE_ASSERT;
  ------------------
  |  |   55|      0|#   define UPRV_UNREACHABLE_ASSERT (void)0
  ------------------
  195|     37|        } else {
  196|     37|            LocalUResourceBundlePointer typeMapEntry;
  197|       |
  198|  1.09k|            while (ures_hasNext(typeMapResByKey.getAlias())) {
  ------------------
  |  | 1689|  1.09k|#define ures_hasNext U_ICU_ENTRY_POINT_RENAME(ures_hasNext)
  |  |  ------------------
  |  |  |  |  123|  1.09k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.09k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.09k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (198:20): [True: 1.05k, False: 37]
  ------------------
  199|  1.05k|                typeMapEntry.adoptInstead(ures_getNextResource(typeMapResByKey.getAlias(), typeMapEntry.orphan(), &sts));
  ------------------
  |  | 1672|  1.05k|#define ures_getNextResource U_ICU_ENTRY_POINT_RENAME(ures_getNextResource)
  |  |  ------------------
  |  |  |  |  123|  1.05k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.05k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.05k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|  1.05k|                if (U_FAILURE(sts)) {
  ------------------
  |  Branch (200:21): [True: 0, False: 1.05k]
  ------------------
  201|      0|                    break;
  202|      0|                }
  203|  1.05k|                const char* legacyTypeId = ures_getKey(typeMapEntry.getAlias());
  ------------------
  |  | 1666|  1.05k|#define ures_getKey U_ICU_ENTRY_POINT_RENAME(ures_getKey)
  |  |  ------------------
  |  |  |  |  123|  1.05k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.05k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.05k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  204|       |
  205|       |                // special types
  206|  1.05k|                if (uprv_strcmp(legacyTypeId, "CODEPOINTS") == 0) {
  ------------------
  |  |   38|  1.05k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.05k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (206:21): [True: 1, False: 1.05k]
  ------------------
  207|      1|                    specialTypes |= SPECIALTYPE_CODEPOINTS;
  208|      1|                    continue;
  209|      1|                }
  210|  1.05k|                if (uprv_strcmp(legacyTypeId, "REORDER_CODE") == 0) {
  ------------------
  |  |   38|  1.05k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.05k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (210:21): [True: 1, False: 1.05k]
  ------------------
  211|      1|                    specialTypes |= SPECIALTYPE_REORDER_CODE;
  212|      1|                    continue;
  213|      1|                }
  214|  1.05k|                if (uprv_strcmp(legacyTypeId, "RG_KEY_VALUE") == 0) {
  ------------------
  |  |   38|  1.05k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.05k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (214:21): [True: 1, False: 1.05k]
  ------------------
  215|      1|                    specialTypes |= SPECIALTYPE_RG_KEY_VALUE;
  216|      1|                    continue;
  217|      1|                }
  218|       |
  219|  1.05k|                if (isTZ) {
  ------------------
  |  Branch (219:21): [True: 447, False: 604]
  ------------------
  220|       |                    // a timezone key uses a colon instead of a slash in the resource.
  221|       |                    // e.g. America:Los_Angeles
  222|    447|                    if (uprv_strchr(legacyTypeId, ':') != nullptr) {
  ------------------
  |  |   40|    447|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|    447|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (222:25): [True: 447, False: 0]
  ------------------
  223|    447|                        icu::CharString* legacyTypeIdBuf =
  224|    447|                                gKeyTypeStringPool->create(legacyTypeId, sts);
  225|    447|                        if (legacyTypeIdBuf == nullptr) {
  ------------------
  |  Branch (225:29): [True: 0, False: 447]
  ------------------
  226|      0|                            sts = U_MEMORY_ALLOCATION_ERROR;
  227|      0|                            break;
  228|      0|                        }
  229|    447|                        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (229:29): [True: 0, False: 447]
  ------------------
  230|      0|                            break;
  231|      0|                        }
  232|    447|                        std::replace(
  233|    447|                                legacyTypeIdBuf->data(),
  234|    447|                                legacyTypeIdBuf->data() + legacyTypeIdBuf->length(),
  235|    447|                                ':', '/');
  236|    447|                        legacyTypeId = legacyTypeIdBuf->data();
  237|    447|                    }
  238|    447|                }
  239|       |
  240|  1.05k|                UnicodeString uBcpTypeId = ures_getUnicodeString(typeMapEntry.getAlias(), &sts);
  241|  1.05k|                if (U_FAILURE(sts)) {
  ------------------
  |  Branch (241:21): [True: 0, False: 1.05k]
  ------------------
  242|      0|                    break;
  243|      0|                }
  244|       |
  245|       |                // empty value indicates that BCP type is same with the legacy type.
  246|  1.05k|                const char* bcpTypeId = legacyTypeId;
  247|  1.05k|                if (!uBcpTypeId.isEmpty()) {
  ------------------
  |  Branch (247:21): [True: 484, False: 567]
  ------------------
  248|    484|                    icu::CharString* bcpTypeIdBuf = gKeyTypeStringPool->create();
  249|    484|                    if (bcpTypeIdBuf == nullptr) {
  ------------------
  |  Branch (249:25): [True: 0, False: 484]
  ------------------
  250|      0|                        sts = U_MEMORY_ALLOCATION_ERROR;
  251|      0|                        break;
  252|      0|                    }
  253|    484|                    bcpTypeIdBuf->appendInvariantChars(uBcpTypeId, sts);
  254|    484|                    if (U_FAILURE(sts)) {
  ------------------
  |  Branch (254:25): [True: 0, False: 484]
  ------------------
  255|      0|                        break;
  256|      0|                    }
  257|    484|                    bcpTypeId = bcpTypeIdBuf->data();
  258|    484|                }
  259|       |
  260|       |                // Note: legacy type value should never be
  261|       |                // equivalent to bcp type value of a different
  262|       |                // type under the same key. So we use a single
  263|       |                // map for lookup.
  264|  1.05k|                LocExtType* t = gLocExtTypeEntries->create();
  265|  1.05k|                if (t == nullptr) {
  ------------------
  |  Branch (265:21): [True: 0, False: 1.05k]
  ------------------
  266|      0|                    sts = U_MEMORY_ALLOCATION_ERROR;
  267|      0|                    break;
  268|      0|                }
  269|  1.05k|                t->bcpId = bcpTypeId;
  270|  1.05k|                t->legacyId = legacyTypeId;
  271|       |
  272|  1.05k|                uhash_put(typeDataMap, &t->legacyId, t, &sts);
  ------------------
  |  | 1032|  1.05k|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|  1.05k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.05k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.05k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|  1.05k|                if (bcpTypeId != legacyTypeId) {
  ------------------
  |  Branch (273:21): [True: 484, False: 567]
  ------------------
  274|       |                    // different type value
  275|    484|                    uhash_put(typeDataMap, &t->bcpId, t, &sts);
  ------------------
  |  | 1032|    484|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|    484|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    484|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    484|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  276|    484|                }
  277|  1.05k|                if (U_FAILURE(sts)) {
  ------------------
  |  Branch (277:21): [True: 0, False: 1.05k]
  ------------------
  278|      0|                    break;
  279|      0|                }
  280|       |
  281|       |                // also put aliases in the map
  282|  1.05k|                if (typeAliasResByKey.isValid()) {
  ------------------
  |  Branch (282:21): [True: 452, False: 599]
  ------------------
  283|    452|                    LocalUResourceBundlePointer typeAliasDataEntry;
  284|       |
  285|    452|                    ures_resetIterator(typeAliasResByKey.getAlias());
  ------------------
  |  | 1698|    452|#define ures_resetIterator U_ICU_ENTRY_POINT_RENAME(ures_resetIterator)
  |  |  ------------------
  |  |  |  |  123|    452|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    452|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    452|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  286|  69.2k|                    while (ures_hasNext(typeAliasResByKey.getAlias()) && U_SUCCESS(sts)) {
  ------------------
  |  | 1689|  69.2k|#define ures_hasNext U_ICU_ENTRY_POINT_RENAME(ures_hasNext)
  |  |  ------------------
  |  |  |  |  123|  69.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  69.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  69.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (286:28): [True: 68.8k, False: 452]
  |  Branch (286:74): [True: 68.8k, False: 0]
  ------------------
  287|  68.8k|                        int32_t toLen;
  288|  68.8k|                        typeAliasDataEntry.adoptInstead(ures_getNextResource(typeAliasResByKey.getAlias(), typeAliasDataEntry.orphan(), &sts));
  ------------------
  |  | 1672|  68.8k|#define ures_getNextResource U_ICU_ENTRY_POINT_RENAME(ures_getNextResource)
  |  |  ------------------
  |  |  |  |  123|  68.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  68.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  68.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  289|  68.8k|                        const char16_t* to = ures_getString(typeAliasDataEntry.getAlias(), &toLen, &sts);
  ------------------
  |  | 1675|  68.8k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  68.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  68.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  68.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  290|  68.8k|                        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (290:29): [True: 0, False: 68.8k]
  ------------------
  291|      0|                            break;
  292|      0|                        }
  293|       |                        // check if this is an alias of canonical legacy type
  294|  68.8k|                        if (uprv_compareInvWithUChar(
  ------------------
  |  |  329|  68.8k|#   define uprv_compareInvWithUChar uprv_compareInvAscii
  |  |  ------------------
  |  |  |  | 1402|  68.8k|#define uprv_compareInvAscii U_ICU_ENTRY_POINT_RENAME(uprv_compareInvAscii)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  68.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  68.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  68.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (294:29): [True: 155, False: 68.6k]
  ------------------
  295|  68.8k|                                nullptr,
  296|  68.8k|                                t->legacyId.data(),
  297|  68.8k|                                static_cast<int32_t>(t->legacyId.size()),
  298|  68.8k|                                to,
  299|  68.8k|                                toLen) == 0) {
  300|    155|                            const char* from = ures_getKey(typeAliasDataEntry.getAlias());
  ------------------
  |  | 1666|    155|#define ures_getKey U_ICU_ENTRY_POINT_RENAME(ures_getKey)
  |  |  ------------------
  |  |  |  |  123|    155|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    155|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    155|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|    155|                            TypeAlias* alias = gTypeAliasEntries->create(TypeAlias{{}, from});
  302|    155|                            if (isTZ) {
  ------------------
  |  Branch (302:33): [True: 154, False: 1]
  ------------------
  303|       |                                // replace colon with slash if necessary
  304|    154|                                if (uprv_strchr(from, ':') != nullptr) {
  ------------------
  |  |   40|    154|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|    154|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (304:37): [True: 109, False: 45]
  ------------------
  305|    109|                                    icu::CharString* fromBuf =
  306|    109|                                            gKeyTypeStringPool->create(from, sts);
  307|    109|                                    if (fromBuf == nullptr) {
  ------------------
  |  Branch (307:41): [True: 0, False: 109]
  ------------------
  308|      0|                                        sts = U_MEMORY_ALLOCATION_ERROR;
  309|      0|                                        break;
  310|      0|                                    }
  311|    109|                                    if (U_FAILURE(sts)) {
  ------------------
  |  Branch (311:41): [True: 0, False: 109]
  ------------------
  312|      0|                                        break;
  313|      0|                                    }
  314|    109|                                    std::replace(
  315|    109|                                            fromBuf->data(),
  316|    109|                                            fromBuf->data() + fromBuf->length(),
  317|    109|                                            ':', '/');
  318|    109|                                    alias->from = fromBuf->toStringPiece();
  319|    109|                                }
  320|    154|                            }
  321|    155|                            uhash_put(typeDataMap, &alias->from, t, &sts);
  ------------------
  |  | 1032|    155|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|    155|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    155|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    155|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  322|    155|                        }
  323|  68.8k|                    }
  324|    452|                    if (U_FAILURE(sts)) {
  ------------------
  |  Branch (324:25): [True: 0, False: 452]
  ------------------
  325|      0|                        break;
  326|      0|                    }
  327|    452|                }
  328|       |
  329|  1.05k|                if (bcpTypeAliasResByKey.isValid()) {
  ------------------
  |  Branch (329:21): [True: 465, False: 586]
  ------------------
  330|    465|                    LocalUResourceBundlePointer bcpTypeAliasDataEntry;
  331|       |
  332|    465|                    ures_resetIterator(bcpTypeAliasResByKey.getAlias());
  ------------------
  |  | 1698|    465|#define ures_resetIterator U_ICU_ENTRY_POINT_RENAME(ures_resetIterator)
  |  |  ------------------
  |  |  |  |  123|    465|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    465|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    465|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  333|  10.3k|                    while (ures_hasNext(bcpTypeAliasResByKey.getAlias()) && U_SUCCESS(sts)) {
  ------------------
  |  | 1689|  10.3k|#define ures_hasNext U_ICU_ENTRY_POINT_RENAME(ures_hasNext)
  |  |  ------------------
  |  |  |  |  123|  10.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  10.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  10.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (333:28): [True: 9.85k, False: 465]
  |  Branch (333:77): [True: 9.85k, False: 0]
  ------------------
  334|  9.85k|                        int32_t toLen;
  335|  9.85k|                        bcpTypeAliasDataEntry.adoptInstead(ures_getNextResource(bcpTypeAliasResByKey.getAlias(), bcpTypeAliasDataEntry.orphan(), &sts));
  ------------------
  |  | 1672|  9.85k|#define ures_getNextResource U_ICU_ENTRY_POINT_RENAME(ures_getNextResource)
  |  |  ------------------
  |  |  |  |  123|  9.85k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.85k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.85k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  9.85k|                        const char16_t* to = ures_getString(bcpTypeAliasDataEntry.getAlias(), &toLen, &sts);
  ------------------
  |  | 1675|  9.85k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  9.85k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.85k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.85k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  337|  9.85k|                        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (337:29): [True: 0, False: 9.85k]
  ------------------
  338|      0|                            break;
  339|      0|                        }
  340|       |                        // check if this is an alias of bcp type
  341|  9.85k|                        if (uprv_compareInvWithUChar(
  ------------------
  |  |  329|  9.85k|#   define uprv_compareInvWithUChar uprv_compareInvAscii
  |  |  ------------------
  |  |  |  | 1402|  9.85k|#define uprv_compareInvAscii U_ICU_ENTRY_POINT_RENAME(uprv_compareInvAscii)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  9.85k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  9.85k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  9.85k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (341:29): [True: 23, False: 9.82k]
  ------------------
  342|  9.85k|                                nullptr,
  343|  9.85k|                                t->bcpId.data(),
  344|  9.85k|                                static_cast<int32_t>(t->bcpId.size()),
  345|  9.85k|                                to,
  346|  9.85k|                                toLen) == 0) {
  347|     23|                            const char* from = ures_getKey(bcpTypeAliasDataEntry.getAlias());
  ------------------
  |  | 1666|     23|#define ures_getKey U_ICU_ENTRY_POINT_RENAME(ures_getKey)
  |  |  ------------------
  |  |  |  |  123|     23|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     23|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     23|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  348|     23|                            TypeAlias* alias = gTypeAliasEntries->create(TypeAlias{{}, from});
  349|     23|                            uhash_put(typeDataMap, &alias->from, t, &sts);
  ------------------
  |  | 1032|     23|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|     23|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     23|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     23|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  350|     23|                        }
  351|  9.85k|                    }
  352|    465|                    if (U_FAILURE(sts)) {
  ------------------
  |  Branch (352:25): [True: 0, False: 465]
  ------------------
  353|      0|                        break;
  354|      0|                    }
  355|    465|                }
  356|  1.05k|            }
  357|     37|        }
  358|     37|        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (358:13): [True: 0, False: 37]
  ------------------
  359|      0|            break;
  360|      0|        }
  361|       |
  362|     37|        LocExtKeyData* keyData = gLocExtKeyDataEntries->create();
  363|     37|        if (keyData == nullptr) {
  ------------------
  |  Branch (363:13): [True: 0, False: 37]
  ------------------
  364|      0|            sts = U_MEMORY_ALLOCATION_ERROR;
  365|      0|            break;
  366|      0|        }
  367|     37|        keyData->bcpId = bcpKeyId;
  368|     37|        keyData->legacyId = legacyKeyId;
  369|     37|        keyData->specialTypes = specialTypes;
  370|     37|        keyData->typeMap.adoptInstead(typeDataMap);
  371|       |
  372|     37|        uhash_put(gLocExtKeyMap, &keyData->legacyId, keyData, &sts);
  ------------------
  |  | 1032|     37|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|     37|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     37|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     37|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  373|     37|        if (legacyKeyId != bcpKeyId) {
  ------------------
  |  Branch (373:13): [True: 17, False: 20]
  ------------------
  374|       |            // different key value
  375|     17|            uhash_put(gLocExtKeyMap, &keyData->bcpId, keyData, &sts);
  ------------------
  |  | 1032|     17|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|     17|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     17|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     17|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  376|     17|        }
  377|     37|        if (U_FAILURE(sts)) {
  ------------------
  |  Branch (377:13): [True: 0, False: 37]
  ------------------
  378|      0|            break;
  379|      0|        }
  380|     37|    }
  381|      1|}
uloc_keytype.cpp:_ZN12_GLOBAL__N_123isSpecialTypeCodepointsENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  394|  1.07k|isSpecialTypeCodepoints(std::string_view val) {
  395|  1.07k|    int32_t subtagLen = 0;
  396|  5.85k|    for (char c : val) {
  ------------------
  |  Branch (396:17): [True: 5.85k, False: 452]
  ------------------
  397|  5.85k|        if (c == '-') {
  ------------------
  |  Branch (397:13): [True: 719, False: 5.13k]
  ------------------
  398|    719|            if (subtagLen < 4 || subtagLen > 6) {
  ------------------
  |  Branch (398:17): [True: 204, False: 515]
  |  Branch (398:34): [True: 195, False: 320]
  ------------------
  399|    399|                return false;
  400|    399|            }
  401|    320|            subtagLen = 0;
  402|  5.13k|        } else if ((c >= '0' && c <= '9') ||
  ------------------
  |  Branch (402:21): [True: 5.13k, False: 0]
  |  Branch (402:33): [True: 3.22k, False: 1.91k]
  ------------------
  403|  5.13k|                    (c >= 'A' && c <= 'F') || // A-F/a-f are contiguous
  ------------------
  |  Branch (403:22): [True: 1.91k, False: 0]
  |  Branch (403:34): [True: 0, False: 1.91k]
  ------------------
  404|  5.13k|                    (c >= 'a' && c <= 'f')) { // also in EBCDIC
  ------------------
  |  Branch (404:22): [True: 1.91k, False: 0]
  |  Branch (404:34): [True: 1.69k, False: 219]
  ------------------
  405|  4.91k|            subtagLen++;
  406|  4.91k|        } else {
  407|    219|            return false;
  408|    219|        }
  409|  5.85k|    }
  410|    452|    return subtagLen >= 4 && subtagLen <= 6;
  ------------------
  |  Branch (410:12): [True: 209, False: 243]
  |  Branch (410:30): [True: 207, False: 2]
  ------------------
  411|  1.07k|}
uloc_keytype.cpp:_ZN12_GLOBAL__N_124isSpecialTypeReorderCodeENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  414|    463|isSpecialTypeReorderCode(std::string_view val) {
  415|    463|    int32_t subtagLen = 0;
  416|  15.7k|    for (char c : val) {
  ------------------
  |  Branch (416:17): [True: 15.7k, False: 223]
  ------------------
  417|  15.7k|        if (c == '-') {
  ------------------
  |  Branch (417:13): [True: 2.25k, False: 13.5k]
  ------------------
  418|  2.25k|            if (subtagLen < 3 || subtagLen > 8) {
  ------------------
  |  Branch (418:17): [True: 0, False: 2.25k]
  |  Branch (418:34): [True: 0, False: 2.25k]
  ------------------
  419|      0|                return false;
  420|      0|            }
  421|  2.25k|            subtagLen = 0;
  422|  13.5k|        } else if (uprv_isASCIILetter(c)) {
  ------------------
  |  | 1514|  13.5k|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|  13.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  13.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  13.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (422:20): [True: 13.2k, False: 240]
  ------------------
  423|  13.2k|            subtagLen++;
  424|  13.2k|        } else {
  425|    240|            return false;
  426|    240|        }
  427|  15.7k|    }
  428|    223|    return subtagLen >= 3 && subtagLen <= 8;
  ------------------
  |  Branch (428:12): [True: 223, False: 0]
  |  Branch (428:30): [True: 223, False: 0]
  ------------------
  429|    463|}
uloc_keytype.cpp:_ZN12_GLOBAL__N_123isSpecialTypeRgKeyValueENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  432|    903|isSpecialTypeRgKeyValue(std::string_view val) {
  433|    903|    int32_t subtagLen = 0;
  434|  2.90k|    for (char c : val) {
  ------------------
  |  Branch (434:17): [True: 2.90k, False: 422]
  ------------------
  435|  2.90k|        if ((subtagLen < 2 && uprv_isASCIILetter(c)) ||
  ------------------
  |  | 1514|  1.77k|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (435:14): [True: 1.77k, False: 1.13k]
  |  Branch (435:31): [True: 1.57k, False: 200]
  ------------------
  436|  2.90k|            (subtagLen >= 2 && (c == 'Z' || c == 'z'))) {
  ------------------
  |  Branch (436:14): [True: 1.13k, False: 200]
  |  Branch (436:33): [True: 0, False: 1.13k]
  |  Branch (436:45): [True: 850, False: 281]
  ------------------
  437|  2.42k|            subtagLen++;
  438|  2.42k|        } else {
  439|    481|            return false;
  440|    481|        }
  441|  2.90k|    }
  442|    422|    return subtagLen == 6;
  443|    903|}

_Z25ultag_isLanguageSubtag_78PKci:
  431|  3.66k|ultag_isLanguageSubtag(const char* s, int32_t len) {
  432|       |    /*
  433|       |     * unicode_language_subtag = alpha{2,3} | alpha{5,8};
  434|       |     * NOTE: Per ICUTC 2019/01/23- accepting alpha 4
  435|       |     * See ICU-20372
  436|       |     */
  437|  3.66k|    if (len < 0) {
  ------------------
  |  Branch (437:9): [True: 0, False: 3.66k]
  ------------------
  438|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  439|      0|    }
  440|  3.66k|    if (len >= 2 && len <= 8 && _isAlphaString(s, len)) {
  ------------------
  |  Branch (440:9): [True: 2.64k, False: 1.01k]
  |  Branch (440:21): [True: 2.24k, False: 405]
  |  Branch (440:33): [True: 1.74k, False: 503]
  ------------------
  441|  1.74k|        return true;
  442|  1.74k|    }
  443|  1.92k|    return false;
  444|  3.66k|}
_Z23ultag_isScriptSubtag_78PKci:
  466|  1.73k|ultag_isScriptSubtag(const char* s, int32_t len) {
  467|       |    /*
  468|       |     * script        = 4ALPHA              ; ISO 15924 code
  469|       |     */
  470|  1.73k|    if (len < 0) {
  ------------------
  |  Branch (470:9): [True: 0, False: 1.73k]
  ------------------
  471|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  472|      0|    }
  473|  1.73k|    if (len == 4 && _isAlphaString(s, len)) {
  ------------------
  |  Branch (473:9): [True: 98, False: 1.63k]
  |  Branch (473:21): [True: 41, False: 57]
  ------------------
  474|     41|        return true;
  475|     41|    }
  476|  1.69k|    return false;
  477|  1.73k|}
_Z23ultag_isRegionSubtag_78PKci:
  480|  1.73k|ultag_isRegionSubtag(const char* s, int32_t len) {
  481|       |    /*
  482|       |     * region        = 2ALPHA              ; ISO 3166-1 code
  483|       |     *               / 3DIGIT              ; UN M.49 code
  484|       |     */
  485|  1.73k|    if (len < 0) {
  ------------------
  |  Branch (485:9): [True: 0, False: 1.73k]
  ------------------
  486|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  487|      0|    }
  488|  1.73k|    if (len == 2 && _isAlphaString(s, len)) {
  ------------------
  |  Branch (488:9): [True: 137, False: 1.59k]
  |  Branch (488:21): [True: 124, False: 13]
  ------------------
  489|    124|        return true;
  490|    124|    }
  491|  1.60k|    if (len == 3 && _isNumericString(s, len)) {
  ------------------
  |  Branch (491:9): [True: 29, False: 1.58k]
  |  Branch (491:21): [True: 6, False: 23]
  ------------------
  492|      6|        return true;
  493|      6|    }
  494|  1.60k|    return false;
  495|  1.60k|}
_Z27ultag_isUnicodeLocaleKey_78PKci:
  631|  5.49M|ultag_isUnicodeLocaleKey(const char* s, int32_t len) {
  632|       |    /*
  633|       |     * key = alphanum alpha ;
  634|       |     */
  635|  5.49M|    if (len < 0) {
  ------------------
  |  Branch (635:9): [True: 0, False: 5.49M]
  ------------------
  636|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  637|      0|    }
  638|  5.49M|    if (len == 2 && (ISALPHA(*s) || ISNUMERIC(*s)) && ISALPHA(s[1])) {
  ------------------
  |  Branch (638:9): [True: 1.63M, False: 3.86M]
  |  Branch (638:22): [True: 1.63M, False: 3.46k]
  |  Branch (638:37): [True: 3.46k, False: 0]
  |  Branch (638:55): [True: 1.60M, False: 27.9k]
  ------------------
  639|  1.60M|        return true;
  640|  1.60M|    }
  641|  3.88M|    return false;
  642|  5.49M|}
_Z25ulocimp_forLanguageTag_78PKciPiR10UErrorCode:
 2675|  3.93k|                       UErrorCode& status) {
 2676|  3.93k|    return icu::ByteSinkUtil::viaByteSinkToCharString(
 2677|  3.93k|        [&](icu::ByteSink& sink, UErrorCode& status) {
 2678|  3.93k|            ulocimp_forLanguageTag(langtag, tagLen, sink, parsedLength, status);
 2679|  3.93k|        },
 2680|  3.93k|        status);
 2681|  3.93k|}
_Z25ulocimp_forLanguageTag_78PKciRN6icu_788ByteSinkEPiR10UErrorCode:
 2688|  3.93k|                       UErrorCode& status) {
 2689|  3.93k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (2689:9): [True: 0, False: 3.93k]
  ------------------
 2690|       |
 2691|  3.93k|    bool isEmpty = true;
 2692|  3.93k|    const char *subtag, *p;
 2693|  3.93k|    int32_t len;
 2694|  3.93k|    int32_t i, n;
 2695|  3.93k|    bool noRegion = true;
 2696|       |
 2697|  3.93k|    icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status));
 2698|  3.93k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2698:9): [True: 0, False: 3.93k]
  ------------------
 2699|      0|        return;
 2700|      0|    }
 2701|       |
 2702|       |    /* language */
 2703|  3.93k|    subtag = ultag_getExtlangSize(lt.getAlias()) > 0 ? ultag_getExtlang(lt.getAlias(), 0) : ultag_getLanguage(lt.getAlias());
  ------------------
  |  Branch (2703:14): [True: 92, False: 3.84k]
  ------------------
 2704|  3.93k|    if (uprv_compareInvCharsAsAscii(subtag, LANG_UND) != 0) {
  ------------------
  |  |  153|  3.93k|#   define uprv_compareInvCharsAsAscii(s1, s2) uprv_strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |   38|  3.93k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  3.93k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2704:9): [True: 3.84k, False: 95]
  ------------------
 2705|  3.84k|        len = static_cast<int32_t>(uprv_strlen(subtag));
  ------------------
  |  |   37|  3.84k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  3.84k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2706|  3.84k|        if (len > 0) {
  ------------------
  |  Branch (2706:13): [True: 1.64k, False: 2.19k]
  ------------------
 2707|  1.64k|            sink.Append(subtag, len);
 2708|  1.64k|            isEmpty = false;
 2709|  1.64k|        }
 2710|  3.84k|    }
 2711|       |
 2712|       |    /* script */
 2713|  3.93k|    subtag = ultag_getScript(lt.getAlias());
 2714|  3.93k|    len = static_cast<int32_t>(uprv_strlen(subtag));
  ------------------
  |  |   37|  3.93k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  3.93k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2715|  3.93k|    if (len > 0) {
  ------------------
  |  Branch (2715:9): [True: 41, False: 3.89k]
  ------------------
 2716|     41|        sink.Append("_", 1);
 2717|     41|        isEmpty = false;
 2718|       |
 2719|       |        /* write out the script in title case */
 2720|     41|        char c = uprv_toupper(*subtag);
  ------------------
  |  | 1547|     41|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|     41|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     41|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     41|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2721|     41|        sink.Append(&c, 1);
 2722|     41|        sink.Append(subtag + 1, len - 1);
 2723|     41|    }
 2724|       |
 2725|       |    /* region */
 2726|  3.93k|    subtag = ultag_getRegion(lt.getAlias());
 2727|  3.93k|    len = static_cast<int32_t>(uprv_strlen(subtag));
  ------------------
  |  |   37|  3.93k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  3.93k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2728|  3.93k|    if (len > 0) {
  ------------------
  |  Branch (2728:9): [True: 130, False: 3.80k]
  ------------------
 2729|    130|        sink.Append("_", 1);
 2730|    130|        isEmpty = false;
 2731|       |
 2732|       |        /* write out the region in upper case */
 2733|    130|        p = subtag;
 2734|    396|        while (*p) {
  ------------------
  |  Branch (2734:16): [True: 266, False: 130]
  ------------------
 2735|    266|            char c = uprv_toupper(*p);
  ------------------
  |  | 1547|    266|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|    266|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    266|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    266|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2736|    266|            sink.Append(&c, 1);
 2737|    266|            p++;
 2738|    266|        }
 2739|    130|        noRegion = false;
 2740|    130|    }
 2741|       |
 2742|       |    /* variants */
 2743|  3.93k|    _sortVariants(lt.getAlias()->variants);
 2744|  3.93k|    n = ultag_getVariantsSize(lt.getAlias());
 2745|  3.93k|    if (n > 0) {
  ------------------
  |  Branch (2745:9): [True: 310, False: 3.62k]
  ------------------
 2746|    310|        if (noRegion) {
  ------------------
  |  Branch (2746:13): [True: 281, False: 29]
  ------------------
 2747|    281|            sink.Append("_", 1);
 2748|    281|            isEmpty = false;
 2749|    281|        }
 2750|       |
 2751|  2.90k|        for (i = 0; i < n; i++) {
  ------------------
  |  Branch (2751:21): [True: 2.59k, False: 310]
  ------------------
 2752|  2.59k|            subtag = ultag_getVariant(lt.getAlias(), i);
 2753|  2.59k|            sink.Append("_", 1);
 2754|       |
 2755|       |            /* write out the variant in upper case */
 2756|  2.59k|            p = subtag;
 2757|  9.73k|            while (*p) {
  ------------------
  |  Branch (2757:20): [True: 7.13k, False: 2.59k]
  ------------------
 2758|  7.13k|                char c = uprv_toupper(*p);
  ------------------
  |  | 1547|  7.13k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  7.13k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.13k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.13k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2759|  7.13k|                sink.Append(&c, 1);
 2760|  7.13k|                p++;
 2761|  7.13k|            }
 2762|  2.59k|        }
 2763|    310|    }
 2764|       |
 2765|       |    /* keywords */
 2766|  3.93k|    n = ultag_getExtensionsSize(lt.getAlias());
 2767|  3.93k|    subtag = ultag_getPrivateUse(lt.getAlias());
 2768|  3.93k|    if (n > 0 || uprv_strlen(subtag) > 0) {
  ------------------
  |  |   37|  2.69k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  2.69k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2768:9): [True: 1.24k, False: 2.69k]
  |  Branch (2768:18): [True: 174, False: 2.52k]
  ------------------
 2769|  1.41k|        if (isEmpty && n > 0) {
  ------------------
  |  Branch (2769:13): [True: 76, False: 1.33k]
  |  Branch (2769:24): [True: 5, False: 71]
  ------------------
 2770|       |            /* need a language */
 2771|      5|            sink.Append(LANG_UND, LANG_UND_LEN);
  ------------------
  |  |   87|      5|#define LANG_UND_LEN 3
  ------------------
 2772|      5|        }
 2773|  1.41k|        _appendKeywords(lt.getAlias(), sink, status);
 2774|  1.41k|    }
 2775|  3.93k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_114_isAlphaStringEPKci:
  385|  2.62k|_isAlphaString(const char* s, int32_t len) {
  386|  2.62k|    int32_t i;
  387|  7.52k|    for (i = 0; i < len; i++) {
  ------------------
  |  Branch (387:17): [True: 5.51k, False: 2.01k]
  ------------------
  388|  5.51k|        if (!ISALPHA(*(s + i))) {
  ------------------
  |  Branch (388:13): [True: 602, False: 4.90k]
  ------------------
  389|    602|            return false;
  390|    602|        }
  391|  5.51k|    }
  392|  2.01k|    return true;
  393|  2.62k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_116_isNumericStringEPKci:
  396|     29|_isNumericString(const char* s, int32_t len) {
  397|     29|    int32_t i;
  398|     65|    for (i = 0; i < len; i++) {
  ------------------
  |  Branch (398:17): [True: 59, False: 6]
  ------------------
  399|     59|        if (!ISNUMERIC(*(s + i))) {
  ------------------
  |  Branch (399:13): [True: 23, False: 36]
  ------------------
  400|     23|            return false;
  401|     23|        }
  402|     59|    }
  403|      6|    return true;
  404|     29|}
uloc_tag.cpp:_ZN12_GLOBAL__N_116_isVariantSubtagEPKci:
  500|  4.47k|_isVariantSubtag(const char* s, int32_t len) {
  501|       |    /*
  502|       |     * variant       = 5*8alphanum         ; registered variants
  503|       |     *               / (DIGIT 3alphanum)
  504|       |     */
  505|  4.47k|    if (len < 0) {
  ------------------
  |  Branch (505:9): [True: 0, False: 4.47k]
  ------------------
  506|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  507|      0|    }
  508|  4.47k|    if (_isAlphaNumericStringLimitedLength(s, len, 5, 8)) {
  ------------------
  |  Branch (508:9): [True: 478, False: 3.99k]
  ------------------
  509|    478|        return true;
  510|    478|    }
  511|  3.99k|    if (len == 4 && ISNUMERIC(*s) && _isAlphaNumericString(s + 1, 3)) {
  ------------------
  |  Branch (511:9): [True: 460, False: 3.53k]
  |  Branch (511:21): [True: 310, False: 150]
  |  Branch (511:38): [True: 288, False: 22]
  ------------------
  512|    288|        return true;
  513|    288|    }
  514|  3.70k|    return false;
  515|  3.99k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_121_isAlphaNumericStringEPKci:
  407|  7.19M|_isAlphaNumericString(const char* s, int32_t len) {
  408|  7.19M|    int32_t i;
  409|  38.3M|    for (i = 0; i < len; i++) {
  ------------------
  |  Branch (409:17): [True: 31.1M, False: 7.19M]
  ------------------
  410|  31.1M|        if (!ISALPHA(*(s + i)) && !ISNUMERIC(*(s + i))) {
  ------------------
  |  Branch (410:13): [True: 40.6k, False: 31.1M]
  |  Branch (410:35): [True: 412, False: 40.2k]
  ------------------
  411|    412|            return false;
  412|    412|        }
  413|  31.1M|    }
  414|  7.19M|    return true;
  415|  7.19M|}
uloc_tag.cpp:_ZN12_GLOBAL__N_118_isExtensionSubtagEPKci:
  586|  6.12M|_isExtensionSubtag(const char* s, int32_t len) {
  587|       |    /*
  588|       |     * extension     = singleton 1*("-" (2*8alphanum))
  589|       |     */
  590|  6.12M|    return _isAlphaNumericStringLimitedLength(s, len, 2, 8);
  591|  6.12M|}
uloc_tag.cpp:_ZN12_GLOBAL__N_124_isPrivateuseValueSubtagEPKci:
  603|  1.06M|_isPrivateuseValueSubtag(const char* s, int32_t len) {
  604|       |    /*
  605|       |     * privateuse    = "x" 1*("-" (1*8alphanum))
  606|       |     */
  607|  1.06M|    return _isAlphaNumericStringLimitedLength(s, len, 1, 8);
  608|  1.06M|}
uloc_tag.cpp:_ZN12_GLOBAL__N_134_isAlphaNumericStringLimitedLengthEPKciii:
  418|  7.19M|_isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int32_t max) {
  419|  7.19M|    if (len < 0) {
  ------------------
  |  Branch (419:9): [True: 0, False: 7.19M]
  ------------------
  420|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  421|      0|    }
  422|  7.19M|    if (len >= min && len <= max && _isAlphaNumericString(s, len)) {
  ------------------
  |  Branch (422:9): [True: 7.19M, False: 4.18k]
  |  Branch (422:23): [True: 7.19M, False: 307]
  |  Branch (422:37): [True: 7.19M, False: 390]
  ------------------
  423|  7.19M|        return true;
  424|  7.19M|    }
  425|  4.87k|    return false;
  426|  7.19M|}
uloc_tag.cpp:_ZN12_GLOBAL__N_19ISNUMERICEc:
   75|  44.9k|inline bool ISNUMERIC(char c) { return c >= '0' && c <= '9'; }
  ------------------
  |  Branch (75:40): [True: 44.6k, False: 358]
  |  Branch (75:52): [True: 44.3k, False: 284]
  ------------------
uloc_tag.cpp:_ZN12_GLOBAL__N_117_addVariantToListEPPNS_16VariantListEntryEN6icu_7812LocalPointerIS0_EE:
  872|  2.61k|_addVariantToList(VariantListEntry **first, icu::LocalPointer<VariantListEntry> var) {
  873|  2.61k|    if (*first == nullptr) {
  ------------------
  |  Branch (873:9): [True: 310, False: 2.30k]
  ------------------
  874|    310|        var->next = nullptr;
  875|    310|        *first = var.orphan();
  876|  2.30k|    } else {
  877|  2.30k|        VariantListEntry *prev, *cur;
  878|  2.30k|        int32_t cmp;
  879|       |
  880|       |        /* variants order should be preserved */
  881|  2.30k|        prev = nullptr;
  882|  2.30k|        cur = *first;
  883|  42.0k|        while (true) {
  ------------------
  |  Branch (883:16): [Folded - Ignored]
  ------------------
  884|  42.0k|            if (cur == nullptr) {
  ------------------
  |  Branch (884:17): [True: 2.28k, False: 39.7k]
  ------------------
  885|  2.28k|                var->next = nullptr;
  886|  2.28k|                prev->next = var.orphan();
  887|  2.28k|                break;
  888|  2.28k|            }
  889|       |
  890|       |            /* Checking for duplicate variant */
  891|  39.7k|            cmp = uprv_compareInvCharsAsAscii(var->variant, cur->variant);
  ------------------
  |  |  153|  39.7k|#   define uprv_compareInvCharsAsAscii(s1, s2) uprv_strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |   38|  39.7k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  39.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  892|  39.7k|            if (cmp == 0) {
  ------------------
  |  Branch (892:17): [True: 14, False: 39.7k]
  ------------------
  893|       |                /* duplicated variant */
  894|     14|                return false;
  895|     14|            }
  896|  39.7k|            prev = cur;
  897|  39.7k|            cur = cur->next;
  898|  39.7k|        }
  899|  2.30k|    }
  900|       |
  901|  2.59k|    return true;
  902|  2.61k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_119_addAttributeToListEPPNS_18AttributeListEntryES1_:
  905|   149k|_addAttributeToList(AttributeListEntry **first, AttributeListEntry *attr) {
  906|   149k|    bool bAdded = true;
  907|       |
  908|   149k|    if (*first == nullptr) {
  ------------------
  |  Branch (908:9): [True: 420, False: 148k]
  ------------------
  909|    420|        attr->next = nullptr;
  910|    420|        *first = attr;
  911|   148k|    } else {
  912|   148k|        AttributeListEntry *prev, *cur;
  913|   148k|        int32_t cmp;
  914|       |
  915|       |        /* reorder variants in alphabetical order */
  916|   148k|        prev = nullptr;
  917|   148k|        cur = *first;
  918|  1.75M|        while (true) {
  ------------------
  |  Branch (918:16): [Folded - Ignored]
  ------------------
  919|  1.75M|            if (cur == nullptr) {
  ------------------
  |  Branch (919:17): [True: 362, False: 1.75M]
  ------------------
  920|    362|                prev->next = attr;
  921|    362|                attr->next = nullptr;
  922|    362|                break;
  923|    362|            }
  924|  1.75M|            cmp = uprv_compareInvCharsAsAscii(attr->attribute, cur->attribute);
  ------------------
  |  |  153|  1.75M|#   define uprv_compareInvCharsAsAscii(s1, s2) uprv_strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |   38|  1.75M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  1.75M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  925|  1.75M|            if (cmp < 0) {
  ------------------
  |  Branch (925:17): [True: 1.81k, False: 1.75M]
  ------------------
  926|  1.81k|                if (prev == nullptr) {
  ------------------
  |  Branch (926:21): [True: 402, False: 1.40k]
  ------------------
  927|    402|                    *first = attr;
  928|  1.40k|                } else {
  929|  1.40k|                    prev->next = attr;
  930|  1.40k|                }
  931|  1.81k|                attr->next = cur;
  932|  1.81k|                break;
  933|  1.81k|            }
  934|  1.75M|            if (cmp == 0) {
  ------------------
  |  Branch (934:17): [True: 146k, False: 1.60M]
  ------------------
  935|       |                /* duplicated variant */
  936|   146k|                bAdded = false;
  937|   146k|                break;
  938|   146k|            }
  939|  1.60M|            prev = cur;
  940|  1.60M|            cur = cur->next;
  941|  1.60M|        }
  942|   148k|    }
  943|       |
  944|   149k|    return bAdded;
  945|   149k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_121_isExtensionSingletonEPKci:
  566|  6.12M|_isExtensionSingleton(const char* s, int32_t len) {
  567|       |    /*
  568|       |     * extension     = singleton 1*("-" (2*8alphanum))
  569|       |     *
  570|       |     * singleton     = DIGIT               ; 0 - 9
  571|       |     *               / %x41-57             ; A - W
  572|       |     *               / %x59-5A             ; Y - Z
  573|       |     *               / %x61-77             ; a - w
  574|       |     *               / %x79-7A             ; y - z
  575|       |     */
  576|  6.12M|    if (len < 0) {
  ------------------
  |  Branch (576:9): [True: 0, False: 6.12M]
  ------------------
  577|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  578|      0|    }
  579|  6.12M|    if (len == 1 && (ISALPHA(*s) || ISNUMERIC(*s)) && (uprv_tolower(*s) != PRIVATEUSE)) {
  ------------------
  |  |   68|  2.48k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  2.48k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  2.48k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  2.48k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  2.48k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  if (len == 1 && (ISALPHA(*s) || ISNUMERIC(*s)) && (uprv_tolower(*s) != PRIVATEUSE)) {
  ------------------
  |  |   66|  2.48k|#define PRIVATEUSE 'x'
  ------------------
  |  Branch (579:9): [True: 2.54k, False: 6.12M]
  |  Branch (579:22): [True: 2.23k, False: 309]
  |  Branch (579:37): [True: 252, False: 57]
  |  Branch (579:55): [True: 2.27k, False: 212]
  ------------------
  580|  2.27k|        return true;
  581|  2.27k|    }
  582|  6.12M|    return false;
  583|  6.12M|}
uloc_tag.cpp:_ZN12_GLOBAL__N_119_addExtensionToListEPPNS_18ExtensionListEntryES1_b:
  948|  1.61M|_addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, bool localeToBCP) {
  949|  1.61M|    bool bAdded = true;
  950|       |
  951|  1.61M|    if (*first == nullptr) {
  ------------------
  |  Branch (951:9): [True: 3.84k, False: 1.61M]
  ------------------
  952|  3.84k|        ext->next = nullptr;
  953|  3.84k|        *first = ext;
  954|  1.61M|    } else {
  955|  1.61M|        ExtensionListEntry *prev, *cur;
  956|  1.61M|        int32_t cmp;
  957|       |
  958|       |        /* reorder variants in alphabetical order */
  959|  1.61M|        prev = nullptr;
  960|  1.61M|        cur = *first;
  961|  19.8M|        while (true) {
  ------------------
  |  Branch (961:16): [Folded - Ignored]
  ------------------
  962|  19.8M|            if (cur == nullptr) {
  ------------------
  |  Branch (962:17): [True: 7.27k, False: 19.8M]
  ------------------
  963|  7.27k|                prev->next = ext;
  964|  7.27k|                ext->next = nullptr;
  965|  7.27k|                break;
  966|  7.27k|            }
  967|  19.8M|            if (localeToBCP) {
  ------------------
  |  Branch (967:17): [True: 0, False: 19.8M]
  ------------------
  968|       |                /* special handling for locale to bcp conversion */
  969|      0|                int32_t len, curlen;
  970|       |
  971|      0|                len = static_cast<int32_t>(uprv_strlen(ext->key));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  972|      0|                curlen = static_cast<int32_t>(uprv_strlen(cur->key));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  973|       |
  974|      0|                if (len == 1 && curlen == 1) {
  ------------------
  |  Branch (974:21): [True: 0, False: 0]
  |  Branch (974:33): [True: 0, False: 0]
  ------------------
  975|      0|                    if (*(ext->key) == *(cur->key)) {
  ------------------
  |  Branch (975:25): [True: 0, False: 0]
  ------------------
  976|      0|                        cmp = 0;
  977|      0|                    } else if (*(ext->key) == PRIVATEUSE) {
  ------------------
  |  |   66|      0|#define PRIVATEUSE 'x'
  ------------------
  |  Branch (977:32): [True: 0, False: 0]
  ------------------
  978|      0|                        cmp = 1;
  979|      0|                    } else if (*(cur->key) == PRIVATEUSE) {
  ------------------
  |  |   66|      0|#define PRIVATEUSE 'x'
  ------------------
  |  Branch (979:32): [True: 0, False: 0]
  ------------------
  980|      0|                        cmp = -1;
  981|      0|                    } else {
  982|      0|                        cmp = *(ext->key) - *(cur->key);
  983|      0|                    }
  984|      0|                } else if (len == 1) {
  ------------------
  |  Branch (984:28): [True: 0, False: 0]
  ------------------
  985|      0|                    cmp = *(ext->key) - LDMLEXT; 
  ------------------
  |  |   67|      0|#define LDMLEXT 'u'
  ------------------
  986|      0|                } else if (curlen == 1) {
  ------------------
  |  Branch (986:28): [True: 0, False: 0]
  ------------------
  987|      0|                    cmp = LDMLEXT - *(cur->key);
  ------------------
  |  |   67|      0|#define LDMLEXT 'u'
  ------------------
  988|      0|                } else {
  989|      0|                    cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key);
  ------------------
  |  |  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        ::
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  990|       |                    /* Both are u extension keys - we need special handling for 'attribute' */
  991|      0|                    if (cmp != 0) {
  ------------------
  |  Branch (991:25): [True: 0, False: 0]
  ------------------
  992|      0|                        if (uprv_strcmp(cur->key, LOCALE_ATTRIBUTE_KEY) == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (992:29): [True: 0, False: 0]
  ------------------
  993|      0|                            cmp = 1;
  994|      0|                        } else if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (994:36): [True: 0, False: 0]
  ------------------
  995|      0|                            cmp = -1;
  996|      0|                        }
  997|      0|                    }
  998|      0|                }
  999|  19.8M|            } else {
 1000|  19.8M|                cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key);
  ------------------
  |  |  153|  19.8M|#   define uprv_compareInvCharsAsAscii(s1, s2) uprv_strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |   38|  19.8M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  19.8M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1001|  19.8M|            }
 1002|  19.8M|            if (cmp < 0) {
  ------------------
  |  Branch (1002:17): [True: 6.18k, False: 19.8M]
  ------------------
 1003|  6.18k|                if (prev == nullptr) {
  ------------------
  |  Branch (1003:21): [True: 1.26k, False: 4.91k]
  ------------------
 1004|  1.26k|                    *first = ext;
 1005|  4.91k|                } else {
 1006|  4.91k|                    prev->next = ext;
 1007|  4.91k|                }
 1008|  6.18k|                ext->next = cur;
 1009|  6.18k|                break;
 1010|  6.18k|            }
 1011|  19.8M|            if (cmp == 0) {
  ------------------
  |  Branch (1011:17): [True: 1.59M, False: 18.2M]
  ------------------
 1012|       |                /* duplicated extension key */
 1013|  1.59M|                bAdded = false;
 1014|  1.59M|                break;
 1015|  1.59M|            }
 1016|  18.2M|            prev = cur;
 1017|  18.2M|            cur = cur->next;
 1018|  18.2M|        }
 1019|  1.61M|    }
 1020|       |
 1021|  1.61M|    return bAdded;
 1022|  1.61M|}
uloc_tag.cpp:_ZN12_GLOBAL__N_111ultag_parseEPKciPiR10UErrorCode:
 1979|  3.93k|ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& status) {
 1980|  3.93k|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (1980:9): [True: 0, False: 3.93k]
  ------------------
 1981|       |
 1982|  3.93k|    char *tagBuf;
 1983|  3.93k|    int16_t next;
 1984|  3.93k|    char *pSubtag, *pNext, *pLastGoodPosition;
 1985|  3.93k|    int32_t subtagLen;
 1986|  3.93k|    int32_t extlangIdx;
 1987|  3.93k|    icu::LocalPointer<ExtensionListEntry> pExtension;
 1988|  3.93k|    char *pExtValueSubtag, *pExtValueSubtagEnd;
 1989|  3.93k|    int32_t i;
 1990|  3.93k|    bool privateuseVar = false;
 1991|  3.93k|    int32_t legacyLen = 0;
 1992|       |
 1993|  3.93k|    if (parsedLen != nullptr) {
  ------------------
  |  Branch (1993:9): [True: 0, False: 3.93k]
  ------------------
 1994|      0|        *parsedLen = 0;
 1995|      0|    }
 1996|       |
 1997|  3.93k|    if (tagLen < 0) {
  ------------------
  |  Branch (1997:9): [True: 405, False: 3.53k]
  ------------------
 1998|    405|        tagLen = static_cast<int32_t>(uprv_strlen(tag));
  ------------------
  |  |   37|    405|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|    405|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1999|    405|    }
 2000|       |
 2001|       |    /* copy the entire string */
 2002|  3.93k|    tagBuf = static_cast<char*>(uprv_malloc(tagLen + 1));
  ------------------
  |  | 1524|  3.93k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  3.93k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.93k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.93k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2003|  3.93k|    if (tagBuf == nullptr) {
  ------------------
  |  Branch (2003:9): [True: 0, False: 3.93k]
  ------------------
 2004|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 2005|      0|        return nullptr;
 2006|      0|    }
 2007|       |    
 2008|  3.93k|    if (tagLen > 0) {
  ------------------
  |  Branch (2008:9): [True: 3.93k, False: 0]
  ------------------
 2009|  3.93k|        uprv_memcpy(tagBuf, tag, tagLen);
  ------------------
  |  |   42|  3.93k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  3.93k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  3.93k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  3.93k|    _Pragma("clang diagnostic push") \
  |  |   45|  3.93k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  3.93k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  3.93k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  3.93k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  3.93k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  3.93k|    _Pragma("clang diagnostic pop") \
  |  |   49|  3.93k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  3.93k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  3.93k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  3.93k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2010|  3.93k|    }
 2011|  3.93k|    *(tagBuf + tagLen) = 0;
 2012|       |
 2013|       |    /* create a ULanguageTag */
 2014|  3.93k|    icu::LocalULanguageTagPointer t(
 2015|  3.93k|            static_cast<ULanguageTag*>(uprv_malloc(sizeof(ULanguageTag))));
  ------------------
  |  | 1524|  3.93k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  3.93k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.93k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.93k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2016|  3.93k|    if (t.isNull()) {
  ------------------
  |  Branch (2016:9): [True: 0, False: 3.93k]
  ------------------
 2017|      0|        uprv_free(tagBuf);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2018|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 2019|      0|        return nullptr;
 2020|      0|    }
 2021|  3.93k|    _initializeULanguageTag(t.getAlias());
 2022|  3.93k|    t->buf = tagBuf;
 2023|       |
 2024|  3.93k|    if (tagLen < MINLEN) {
  ------------------
  |  |   64|  3.93k|#define MINLEN 2
  ------------------
  |  Branch (2024:9): [True: 272, False: 3.66k]
  ------------------
 2025|       |        /* the input tag is too short - return empty ULanguageTag */
 2026|    272|        return t.orphan();
 2027|    272|    }
 2028|       |
 2029|  3.66k|    size_t parsedLenDelta = 0;
 2030|       |    // Legacy tag will be consider together. Legacy tag with intervening
 2031|       |    // script and region such as art-DE-lojban or art-Latn-lojban won't be
 2032|       |    // matched.
 2033|       |    /* check if the tag is legacy */
 2034|  94.1k|    for (i = 0; i < UPRV_LENGTHOF(LEGACY); i += 2) {
  ------------------
  |  |   99|  94.1k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (2034:17): [True: 90.6k, False: 3.53k]
  ------------------
 2035|  90.6k|        int32_t checkLegacyLen = static_cast<int32_t>(uprv_strlen(LEGACY[i]));
  ------------------
  |  |   37|  90.6k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  90.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2036|  90.6k|        if (tagLen < checkLegacyLen) {
  ------------------
  |  Branch (2036:13): [True: 12.7k, False: 77.8k]
  ------------------
 2037|  12.7k|            continue;
 2038|  12.7k|        }
 2039|  77.8k|        if (tagLen > checkLegacyLen && tagBuf[checkLegacyLen] != '-') {
  ------------------
  |  Branch (2039:13): [True: 74.9k, False: 2.92k]
  |  Branch (2039:40): [True: 62.8k, False: 12.0k]
  ------------------
 2040|       |            // make sure next char is '-'.
 2041|  62.8k|            continue;
 2042|  62.8k|        }
 2043|  14.9k|        if (uprv_strnicmp(LEGACY[i], tagBuf, checkLegacyLen) == 0) {
  ------------------
  |  | 1544|  14.9k|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|  14.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2043:13): [True: 133, False: 14.8k]
  ------------------
 2044|    133|            int32_t newTagLength;
 2045|       |
 2046|    133|            legacyLen = checkLegacyLen;  /* back up for output parsedLen */
 2047|    133|            int32_t replacementLen = static_cast<int32_t>(uprv_strlen(LEGACY[i+1]));
  ------------------
  |  |   37|    133|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|    133|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2048|    133|            newTagLength = replacementLen + tagLen - checkLegacyLen;
 2049|    133|            int32_t oldTagLength = tagLen;
 2050|    133|            if (tagLen < newTagLength) {
  ------------------
  |  Branch (2050:17): [True: 100, False: 33]
  ------------------
 2051|    100|                uprv_free(tagBuf);
  ------------------
  |  | 1503|    100|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    100|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    100|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    100|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2052|       |                // Change t->buf after the free and before return to avoid the second double free in
 2053|       |                // the destructor of t when t is out of scope.
 2054|    100|                t->buf = tagBuf = static_cast<char*>(uprv_malloc(newTagLength + 1));
  ------------------
  |  | 1524|    100|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    100|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    100|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    100|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2055|    100|                if (tagBuf == nullptr) {
  ------------------
  |  Branch (2055:21): [True: 0, False: 100]
  ------------------
 2056|      0|                    status = U_MEMORY_ALLOCATION_ERROR;
 2057|      0|                    return nullptr;
 2058|      0|                }
 2059|    100|                tagLen = newTagLength;
 2060|    100|            }
 2061|    133|            parsedLenDelta = checkLegacyLen - replacementLen;
 2062|    133|            uprv_strcpy(t->buf, LEGACY[i + 1]);
  ------------------
  |  |   36|    133|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|    133|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2063|    133|            if (checkLegacyLen != tagLen) {
  ------------------
  |  Branch (2063:17): [True: 127, False: 6]
  ------------------
 2064|    127|                uprv_memcpy(t->buf + replacementLen, tag + checkLegacyLen,
  ------------------
  |  |   42|    127|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    127|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    127|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    127|    _Pragma("clang diagnostic push") \
  |  |   45|    127|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    127|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    127|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    127|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    127|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    127|    _Pragma("clang diagnostic pop") \
  |  |   49|    127|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    127|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    127|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    127|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2065|    127|                            oldTagLength - checkLegacyLen);
 2066|       |                // NUL-terminate after memcpy().
 2067|    127|                t->buf[replacementLen + oldTagLength - checkLegacyLen] = 0;
 2068|    127|            }
 2069|    133|            break;
 2070|    133|        }
 2071|  14.9k|    }
 2072|       |
 2073|  3.66k|    if (legacyLen == 0) {
  ------------------
  |  Branch (2073:9): [True: 3.53k, False: 133]
  ------------------
 2074|  95.1k|        for (i = 0; i < UPRV_LENGTHOF(REDUNDANT); i += 2) {
  ------------------
  |  |   99|  95.1k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (2074:21): [True: 91.5k, False: 3.52k]
  ------------------
 2075|  91.5k|            const char* redundantTag = REDUNDANT[i];
 2076|  91.5k|            size_t redundantTagLen = uprv_strlen(redundantTag);
  ------------------
  |  |   37|  91.5k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  91.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2077|       |            // The preferred tag for a redundant tag is always shorter than redundant
 2078|       |            // tag. A redundant tag may or may not be followed by other subtags.
 2079|       |            // (i.e. "zh-yue" or "zh-yue-u-co-pinyin").
 2080|  91.5k|            if (uprv_strnicmp(redundantTag, tagBuf, static_cast<uint32_t>(redundantTagLen)) == 0) {
  ------------------
  |  | 1544|  91.5k|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|  91.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  91.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  91.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2080:17): [True: 16, False: 91.5k]
  ------------------
 2081|     16|                const char* redundantTagEnd = tagBuf + redundantTagLen;
 2082|     16|                if (*redundantTagEnd  == '\0' || *redundantTagEnd == SEP) {
  ------------------
  |  |   65|     16|#define SEP '-'
  ------------------
  |  Branch (2082:21): [True: 0, False: 16]
  |  Branch (2082:50): [True: 10, False: 6]
  ------------------
 2083|     10|                    const char* preferredTag = REDUNDANT[i + 1];
 2084|     10|                    size_t preferredTagLen = uprv_strlen(preferredTag);
  ------------------
  |  |   37|     10|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2085|     10|                    uprv_memcpy(t->buf, preferredTag, preferredTagLen);
  ------------------
  |  |   42|     10|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     10|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     10|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     10|    _Pragma("clang diagnostic push") \
  |  |   45|     10|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     10|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     10|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     10|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     10|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     10|    _Pragma("clang diagnostic pop") \
  |  |   49|     10|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     10|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     10|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2086|     10|                    if (*redundantTagEnd == SEP) {
  ------------------
  |  |   65|     10|#define SEP '-'
  ------------------
  |  Branch (2086:25): [True: 10, False: 0]
  ------------------
 2087|     10|                        uprv_memmove(tagBuf + preferredTagLen,
  ------------------
  |  |   51|     10|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     10|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|     10|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|     10|    _Pragma("clang diagnostic push") \
  |  |   54|     10|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|     10|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     10|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|     10|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     10|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|     10|    _Pragma("clang diagnostic pop") \
  |  |   58|     10|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|     10|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     10|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2088|     10|                                     redundantTagEnd,
 2089|     10|                                     tagLen - redundantTagLen + 1);
 2090|     10|                    } else {
 2091|      0|                        tagBuf[preferredTagLen] = '\0';
 2092|      0|                    }
 2093|       |                    // parsedLen should be the length of the input
 2094|       |                    // before redundantTag is replaced by preferredTag.
 2095|       |                    // Save the delta to add it back later.
 2096|     10|                    parsedLenDelta = redundantTagLen - preferredTagLen;
 2097|     10|                    break;
 2098|     10|                }
 2099|     16|            }
 2100|  91.5k|        }
 2101|  3.53k|    }
 2102|       |
 2103|       |    /*
 2104|       |     * langtag      =   language
 2105|       |     *                  ["-" script]
 2106|       |     *                  ["-" region]
 2107|       |     *                  *("-" variant)
 2108|       |     *                  *("-" extension)
 2109|       |     *                  ["-" privateuse]
 2110|       |     */
 2111|       |
 2112|  3.66k|    next = LANG | PRIV;
  ------------------
  |  | 1959|  3.66k|#define LANG 0x0001
  ------------------
                  next = LANG | PRIV;
  ------------------
  |  | 1966|  3.66k|#define PRIV 0x0080
  ------------------
 2113|  3.66k|    pNext = pLastGoodPosition = tagBuf;
 2114|  3.66k|    extlangIdx = 0;
 2115|  3.66k|    pExtValueSubtag = nullptr;
 2116|  3.66k|    pExtValueSubtagEnd = nullptr;
 2117|       |
 2118|  6.13M|    while (pNext) {
  ------------------
  |  Branch (2118:12): [True: 6.13M, False: 1.15k]
  ------------------
 2119|  6.13M|        char *pSep;
 2120|       |
 2121|  6.13M|        pSubtag = pNext;
 2122|       |
 2123|       |        /* locate next separator char */
 2124|  6.13M|        pSep = pSubtag;
 2125|  50.8M|        while (*pSep) {
  ------------------
  |  Branch (2125:16): [True: 50.8M, False: 1.90k]
  ------------------
 2126|  50.8M|            if (*pSep == SEP) {
  ------------------
  |  |   65|  50.8M|#define SEP '-'
  ------------------
  |  Branch (2126:17): [True: 6.12M, False: 44.7M]
  ------------------
 2127|  6.12M|                break;
 2128|  6.12M|            }
 2129|  44.7M|            pSep++;
 2130|  44.7M|        }
 2131|  6.13M|        if (*pSep == 0) {
  ------------------
  |  Branch (2131:13): [True: 1.90k, False: 6.12M]
  ------------------
 2132|       |            /* last subtag */
 2133|  1.90k|            pNext = nullptr;
 2134|  6.12M|        } else {
 2135|  6.12M|            pNext = pSep + 1;
 2136|  6.12M|        }
 2137|  6.13M|        subtagLen = static_cast<int32_t>(pSep - pSubtag);
 2138|       |
 2139|  6.13M|        if (next & LANG) {
  ------------------
  |  | 1959|  6.13M|#define LANG 0x0001
  ------------------
  |  Branch (2139:13): [True: 3.66k, False: 6.12M]
  ------------------
 2140|  3.66k|            if (ultag_isLanguageSubtag(pSubtag, subtagLen)) {
  ------------------
  |  | 1225|  3.66k|#define ultag_isLanguageSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isLanguageSubtag)
  |  |  ------------------
  |  |  |  |  123|  3.66k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.66k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.66k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2140:17): [True: 1.74k, False: 1.92k]
  ------------------
 2141|  1.74k|                *pSep = 0;  /* terminate */
 2142|       |                // TODO: move deprecated language code handling here.
 2143|  1.74k|                t->language = T_CString_toLowerCase(pSubtag);
  ------------------
  |  |   69|  1.74k|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2144|       |
 2145|  1.74k|                pLastGoodPosition = pSep;
 2146|  1.74k|                next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1961|  1.74k|#define SCRT 0x0004
  ------------------
                              next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1962|  1.74k|#define REGN 0x0008
  ------------------
                              next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1963|  1.74k|#define VART 0x0010
  ------------------
                              next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1964|  1.74k|#define EXTS 0x0020
  ------------------
                              next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1966|  1.74k|#define PRIV 0x0080
  ------------------
 2147|  1.74k|                if (subtagLen <= 3)
  ------------------
  |  Branch (2147:21): [True: 1.68k, False: 57]
  ------------------
 2148|  1.68k|                  next |= EXTL;
  ------------------
  |  | 1960|  1.68k|#define EXTL 0x0002
  ------------------
 2149|  1.74k|                continue;
 2150|  1.74k|            }
 2151|  3.66k|        }
 2152|  6.12M|        if (next & EXTL) {
  ------------------
  |  | 1960|  6.12M|#define EXTL 0x0002
  ------------------
  |  Branch (2152:13): [True: 1.78k, False: 6.12M]
  ------------------
 2153|  1.78k|            if (_isExtlangSubtag(pSubtag, subtagLen)) {
  ------------------
  |  Branch (2153:17): [True: 113, False: 1.67k]
  ------------------
 2154|    113|                *pSep = 0;
 2155|    113|                t->extlang[extlangIdx++] = T_CString_toLowerCase(pSubtag);
  ------------------
  |  |   69|    113|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  123|    113|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    113|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    113|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2156|       |
 2157|    113|                pLastGoodPosition = pSep;
 2158|    113|                if (extlangIdx < 3) {
  ------------------
  |  Branch (2158:21): [True: 107, False: 6]
  ------------------
 2159|    107|                    next = EXTL | SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1960|    107|#define EXTL 0x0002
  ------------------
                                  next = EXTL | SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1961|    107|#define SCRT 0x0004
  ------------------
                                  next = EXTL | SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1962|    107|#define REGN 0x0008
  ------------------
                                  next = EXTL | SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1963|    107|#define VART 0x0010
  ------------------
                                  next = EXTL | SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1964|    107|#define EXTS 0x0020
  ------------------
                                  next = EXTL | SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1966|    107|#define PRIV 0x0080
  ------------------
 2160|    107|                } else {
 2161|      6|                    next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1961|      6|#define SCRT 0x0004
  ------------------
                                  next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1962|      6|#define REGN 0x0008
  ------------------
                                  next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1963|      6|#define VART 0x0010
  ------------------
                                  next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1964|      6|#define EXTS 0x0020
  ------------------
                                  next = SCRT | REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1966|      6|#define PRIV 0x0080
  ------------------
 2162|      6|                }
 2163|    113|                continue;
 2164|    113|            }
 2165|  1.78k|        }
 2166|  6.12M|        if (next & SCRT) {
  ------------------
  |  | 1961|  6.12M|#define SCRT 0x0004
  ------------------
  |  Branch (2166:13): [True: 1.73k, False: 6.12M]
  ------------------
 2167|  1.73k|            if (ultag_isScriptSubtag(pSubtag, subtagLen)) {
  ------------------
  |  | 1228|  1.73k|#define ultag_isScriptSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isScriptSubtag)
  |  |  ------------------
  |  |  |  |  123|  1.73k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.73k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.73k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2167:17): [True: 41, False: 1.69k]
  ------------------
 2168|     41|                char *p = pSubtag;
 2169|       |
 2170|     41|                *pSep = 0;
 2171|       |
 2172|       |                /* to title case */
 2173|     41|                *p = uprv_toupper(*p);
  ------------------
  |  | 1547|     41|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|     41|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     41|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     41|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2174|     41|                p++;
 2175|    164|                for (; *p; p++) {
  ------------------
  |  Branch (2175:24): [True: 123, False: 41]
  ------------------
 2176|    123|                    *p = uprv_tolower(*p);
  ------------------
  |  |   68|    123|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|    123|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|    123|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|    123|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|    123|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2177|    123|                }
 2178|       |
 2179|     41|                t->script = pSubtag;
 2180|       |
 2181|     41|                pLastGoodPosition = pSep;
 2182|     41|                next = REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1962|     41|#define REGN 0x0008
  ------------------
                              next = REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1963|     41|#define VART 0x0010
  ------------------
                              next = REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1964|     41|#define EXTS 0x0020
  ------------------
                              next = REGN | VART | EXTS | PRIV;
  ------------------
  |  | 1966|     41|#define PRIV 0x0080
  ------------------
 2183|     41|                continue;
 2184|     41|            }
 2185|  1.73k|        }
 2186|  6.12M|        if (next & REGN) {
  ------------------
  |  | 1962|  6.12M|#define REGN 0x0008
  ------------------
  |  Branch (2186:13): [True: 1.73k, False: 6.12M]
  ------------------
 2187|  1.73k|            if (ultag_isRegionSubtag(pSubtag, subtagLen)) {
  ------------------
  |  | 1227|  1.73k|#define ultag_isRegionSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isRegionSubtag)
  |  |  ------------------
  |  |  |  |  123|  1.73k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.73k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.73k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2187:17): [True: 130, False: 1.60k]
  ------------------
 2188|    130|                *pSep = 0;
 2189|       |                // TODO: move deprecated region code handling here.
 2190|    130|                t->region = T_CString_toUpperCase(pSubtag);
  ------------------
  |  |   70|    130|#define T_CString_toUpperCase U_ICU_ENTRY_POINT_RENAME(T_CString_toUpperCase)
  |  |  ------------------
  |  |  |  |  123|    130|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    130|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    130|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2191|       |
 2192|    130|                pLastGoodPosition = pSep;
 2193|    130|                next = VART | EXTS | PRIV;
  ------------------
  |  | 1963|    130|#define VART 0x0010
  ------------------
                              next = VART | EXTS | PRIV;
  ------------------
  |  | 1964|    130|#define EXTS 0x0020
  ------------------
                              next = VART | EXTS | PRIV;
  ------------------
  |  | 1966|    130|#define PRIV 0x0080
  ------------------
 2194|    130|                continue;
 2195|    130|            }
 2196|  1.73k|        }
 2197|  6.12M|        if (next & VART) {
  ------------------
  |  | 1963|  6.12M|#define VART 0x0010
  ------------------
  |  Branch (2197:13): [True: 4.47k, False: 6.12M]
  ------------------
 2198|  4.47k|            if (_isVariantSubtag(pSubtag, subtagLen) ||
  ------------------
  |  Branch (2198:17): [True: 766, False: 3.70k]
  ------------------
 2199|  4.47k|               (privateuseVar && _isPrivateuseVariantSubtag(pSubtag, subtagLen))) {
  ------------------
  |  Branch (2199:17): [True: 1.97k, False: 1.73k]
  |  Branch (2199:34): [True: 1.84k, False: 132]
  ------------------
 2200|  2.61k|                icu::LocalPointer<VariantListEntry> var(new VariantListEntry, status);
 2201|  2.61k|                if (U_FAILURE(status)) {
  ------------------
  |  Branch (2201:21): [True: 0, False: 2.61k]
  ------------------
 2202|      0|                    return nullptr;
 2203|      0|                }
 2204|  2.61k|                *pSep = 0;
 2205|  2.61k|                var->variant = T_CString_toUpperCase(pSubtag);
  ------------------
  |  |   70|  2.61k|#define T_CString_toUpperCase U_ICU_ENTRY_POINT_RENAME(T_CString_toUpperCase)
  |  |  ------------------
  |  |  |  |  123|  2.61k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.61k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.61k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2206|  2.61k|                if (!_addVariantToList(&(t->variants), std::move(var))) {
  ------------------
  |  Branch (2206:21): [True: 14, False: 2.59k]
  ------------------
 2207|       |                    /* duplicated variant entry */
 2208|     14|                    break;
 2209|     14|                }
 2210|  2.59k|                pLastGoodPosition = pSep;
 2211|  2.59k|                next = VART | EXTS | PRIV;
  ------------------
  |  | 1963|  2.59k|#define VART 0x0010
  ------------------
                              next = VART | EXTS | PRIV;
  ------------------
  |  | 1964|  2.59k|#define EXTS 0x0020
  ------------------
                              next = VART | EXTS | PRIV;
  ------------------
  |  | 1966|  2.59k|#define PRIV 0x0080
  ------------------
 2212|  2.59k|                continue;
 2213|  2.61k|            }
 2214|  4.47k|        }
 2215|  6.12M|        if (next & EXTS) {
  ------------------
  |  | 1964|  6.12M|#define EXTS 0x0020
  ------------------
  |  Branch (2215:13): [True: 6.12M, False: 4.23k]
  ------------------
 2216|  6.12M|            if (_isExtensionSingleton(pSubtag, subtagLen)) {
  ------------------
  |  Branch (2216:17): [True: 2.27k, False: 6.12M]
  ------------------
 2217|  2.27k|                if (pExtension.isValid()) {
  ------------------
  |  Branch (2217:21): [True: 915, False: 1.35k]
  ------------------
 2218|    915|                    if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) {
  ------------------
  |  Branch (2218:25): [True: 0, False: 915]
  |  Branch (2218:55): [True: 0, False: 915]
  ------------------
 2219|       |                        /* the previous extension is incomplete */
 2220|      0|                        delete pExtension.orphan();
 2221|      0|                        break;
 2222|      0|                    }
 2223|       |
 2224|       |                    /* terminate the previous extension value */
 2225|    915|                    *pExtValueSubtagEnd = 0;
 2226|    915|                    pExtension->value = T_CString_toLowerCase(pExtValueSubtag);
  ------------------
  |  |   69|    915|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  123|    915|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    915|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    915|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2227|       |
 2228|       |                    /* insert the extension to the list */
 2229|    915|                    if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) {
  ------------------
  |  Branch (2229:25): [True: 911, False: 4]
  ------------------
 2230|    911|                        pExtension.orphan();
 2231|    911|                        pLastGoodPosition = pExtValueSubtagEnd;
 2232|    911|                    } else {
 2233|       |                        /* stop parsing here */
 2234|      4|                        delete pExtension.orphan();
 2235|      4|                        break;
 2236|      4|                    }
 2237|    915|                }
 2238|       |
 2239|       |                /* create a new extension */
 2240|  2.26k|                pExtension.adoptInsteadAndCheckErrorCode(new ExtensionListEntry, status);
 2241|  2.26k|                if (U_FAILURE(status)) {
  ------------------
  |  Branch (2241:21): [True: 0, False: 2.26k]
  ------------------
 2242|      0|                    return nullptr;
 2243|      0|                }
 2244|  2.26k|                *pSep = 0;
 2245|  2.26k|                pExtension->key = T_CString_toLowerCase(pSubtag);
  ------------------
  |  |   69|  2.26k|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2246|  2.26k|                pExtension->value = nullptr;   /* will be set later */
 2247|       |
 2248|       |                /*
 2249|       |                 * reset the start and the end location of extension value
 2250|       |                 * subtags for this extension
 2251|       |                 */
 2252|  2.26k|                pExtValueSubtag = nullptr;
 2253|  2.26k|                pExtValueSubtagEnd = nullptr;
 2254|       |
 2255|  2.26k|                next = EXTV;
  ------------------
  |  | 1965|  2.26k|#define EXTV 0x0040
  ------------------
 2256|  2.26k|                continue;
 2257|  2.26k|            }
 2258|  6.12M|        }
 2259|  6.12M|        if (next & EXTV) {
  ------------------
  |  | 1965|  6.12M|#define EXTV 0x0040
  ------------------
  |  Branch (2259:13): [True: 6.12M, False: 2.42k]
  ------------------
 2260|  6.12M|            if (_isExtensionSubtag(pSubtag, subtagLen)) {
  ------------------
  |  Branch (2260:17): [True: 6.12M, False: 373]
  ------------------
 2261|  6.12M|                if (pExtValueSubtag == nullptr) {
  ------------------
  |  Branch (2261:21): [True: 2.09k, False: 6.11M]
  ------------------
 2262|       |                    /* if the start position of this extension's value is not yet,
 2263|       |                        this one is the first value subtag */
 2264|  2.09k|                    pExtValueSubtag = pSubtag;
 2265|  2.09k|                }
 2266|       |
 2267|       |                /* Mark the end of this subtag */
 2268|  6.12M|                pExtValueSubtagEnd = pSep;
 2269|  6.12M|                next = EXTS | EXTV | PRIV;
  ------------------
  |  | 1964|  6.12M|#define EXTS 0x0020
  ------------------
                              next = EXTS | EXTV | PRIV;
  ------------------
  |  | 1965|  6.12M|#define EXTV 0x0040
  ------------------
                              next = EXTS | EXTV | PRIV;
  ------------------
  |  | 1966|  6.12M|#define PRIV 0x0080
  ------------------
 2270|       |
 2271|  6.12M|                continue;
 2272|  6.12M|            }
 2273|  6.12M|        }
 2274|  2.80k|        if (next & PRIV) {
  ------------------
  |  | 1966|  2.80k|#define PRIV 0x0080
  ------------------
  |  Branch (2274:13): [True: 2.58k, False: 216]
  ------------------
 2275|  2.58k|            if (uprv_tolower(*pSubtag) == PRIVATEUSE && subtagLen == 1) {
  ------------------
  |  |   68|  2.58k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  2.58k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          if (uprv_tolower(*pSubtag) == PRIVATEUSE && subtagLen == 1) {
  ------------------
  |  |   66|  5.17k|#define PRIVATEUSE 'x'
  ------------------
  |  Branch (2275:17): [True: 884, False: 1.70k]
  |  Branch (2275:57): [True: 822, False: 62]
  ------------------
 2276|    822|                char *pPrivuseVal;
 2277|       |
 2278|    822|                if (pExtension.isValid()) {
  ------------------
  |  Branch (2278:21): [True: 65, False: 757]
  ------------------
 2279|       |                    /* Process the last extension */
 2280|     65|                    if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) {
  ------------------
  |  Branch (2280:25): [True: 0, False: 65]
  |  Branch (2280:55): [True: 0, False: 65]
  ------------------
 2281|       |                        /* the previous extension is incomplete */
 2282|      0|                        delete pExtension.orphan();
 2283|      0|                        break;
 2284|     65|                    } else {
 2285|       |                        /* terminate the previous extension value */
 2286|     65|                        *pExtValueSubtagEnd = 0;
 2287|     65|                        pExtension->value = T_CString_toLowerCase(pExtValueSubtag);
  ------------------
  |  |   69|     65|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2288|       |
 2289|       |                        /* insert the extension to the list */
 2290|     65|                        if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) {
  ------------------
  |  Branch (2290:29): [True: 61, False: 4]
  ------------------
 2291|     61|                            pExtension.orphan();
 2292|     61|                            pLastGoodPosition = pExtValueSubtagEnd;
 2293|     61|                        } else {
 2294|       |                        /* stop parsing here */
 2295|      4|                            delete pExtension.orphan();
 2296|      4|                            break;
 2297|      4|                        }
 2298|     65|                    }
 2299|     65|                }
 2300|       |
 2301|       |                /* The rest of part will be private use value subtags */
 2302|    818|                if (pNext == nullptr) {
  ------------------
  |  Branch (2302:21): [True: 6, False: 812]
  ------------------
 2303|       |                    /* empty private use subtag */
 2304|      6|                    break;
 2305|      6|                }
 2306|       |                /* back up the private use value start position */
 2307|    812|                pPrivuseVal = pNext;
 2308|       |
 2309|       |                /* validate private use value subtags */
 2310|  1.06M|                while (pNext) {
  ------------------
  |  Branch (2310:24): [True: 1.06M, False: 119]
  ------------------
 2311|  1.06M|                    pSubtag = pNext;
 2312|  1.06M|                    pSep = pSubtag;
 2313|  4.62M|                    while (*pSep) {
  ------------------
  |  Branch (2313:28): [True: 4.62M, False: 412]
  ------------------
 2314|  4.62M|                        if (*pSep == SEP) {
  ------------------
  |  |   65|  4.62M|#define SEP '-'
  ------------------
  |  Branch (2314:29): [True: 1.06M, False: 3.55M]
  ------------------
 2315|  1.06M|                            break;
 2316|  1.06M|                        }
 2317|  3.55M|                        pSep++;
 2318|  3.55M|                    }
 2319|  1.06M|                    if (*pSep == 0) {
  ------------------
  |  Branch (2319:25): [True: 412, False: 1.06M]
  ------------------
 2320|       |                        /* last subtag */
 2321|    412|                        pNext = nullptr;
 2322|  1.06M|                    } else {
 2323|  1.06M|                        pNext = pSep + 1;
 2324|  1.06M|                    }
 2325|  1.06M|                    subtagLen = static_cast<int32_t>(pSep - pSubtag);
 2326|       |
 2327|  1.06M|                    if (uprv_strncmp(pSubtag, PRIVUSE_VARIANT_PREFIX, uprv_strlen(PRIVUSE_VARIANT_PREFIX)) == 0) {
  ------------------
  |  |   44|  1.06M|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|  1.06M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2327:25): [True: 314, False: 1.06M]
  ------------------
 2328|    314|                        *pSep = 0;
 2329|    314|                        next = VART;
  ------------------
  |  | 1963|    314|#define VART 0x0010
  ------------------
 2330|    314|                        privateuseVar = true;
 2331|    314|                        break;
 2332|  1.06M|                    } else if (_isPrivateuseValueSubtag(pSubtag, subtagLen)) {
  ------------------
  |  Branch (2332:32): [True: 1.06M, False: 379]
  ------------------
 2333|  1.06M|                        pLastGoodPosition = pSep;
 2334|  1.06M|                    } else {
 2335|    379|                        break;
 2336|    379|                    }
 2337|  1.06M|                }
 2338|       |
 2339|    812|                if (next == VART) {
  ------------------
  |  | 1963|    812|#define VART 0x0010
  ------------------
  |  Branch (2339:21): [True: 314, False: 498]
  ------------------
 2340|    314|                    continue;
 2341|    314|                }
 2342|       |
 2343|    498|                if (pLastGoodPosition - pPrivuseVal > 0) {
  ------------------
  |  Branch (2343:21): [True: 211, False: 287]
  ------------------
 2344|    211|                    *pLastGoodPosition = 0;
 2345|    211|                    t->privateuse = T_CString_toLowerCase(pPrivuseVal);
  ------------------
  |  |   69|    211|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  123|    211|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    211|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    211|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2346|    211|                }
 2347|       |                /* No more subtags, exiting the parse loop */
 2348|    498|                break;
 2349|    812|            }
 2350|  1.76k|            break;
 2351|  2.58k|        }
 2352|       |
 2353|       |        /* If we fell through here, it means this subtag is illegal - quit parsing */
 2354|    216|        break;
 2355|  2.80k|    }
 2356|       |
 2357|  3.66k|    if (pExtension.isValid()) {
  ------------------
  |  Branch (2357:9): [True: 1.28k, False: 2.37k]
  ------------------
 2358|       |        /* Process the last extension */
 2359|  1.28k|        if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) {
  ------------------
  |  Branch (2359:13): [True: 171, False: 1.11k]
  |  Branch (2359:43): [True: 0, False: 1.11k]
  ------------------
 2360|       |            /* the previous extension is incomplete */
 2361|    171|            delete pExtension.orphan();
 2362|  1.11k|        } else {
 2363|       |            /* terminate the previous extension value */
 2364|  1.11k|            *pExtValueSubtagEnd = 0;
 2365|  1.11k|            pExtension->value = T_CString_toLowerCase(pExtValueSubtag);
  ------------------
  |  |   69|  1.11k|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  123|  1.11k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.11k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.11k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2366|       |            /* insert the extension to the list */
 2367|  1.11k|            if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) {
  ------------------
  |  Branch (2367:17): [True: 1.11k, False: 6]
  ------------------
 2368|  1.11k|                pExtension.orphan();
 2369|  1.11k|                pLastGoodPosition = pExtValueSubtagEnd;
 2370|  1.11k|            } else {
 2371|      6|                delete pExtension.orphan();
 2372|      6|            }
 2373|  1.11k|        }
 2374|  1.28k|    }
 2375|       |
 2376|  3.66k|    if (parsedLen != nullptr) {
  ------------------
  |  Branch (2376:9): [True: 0, False: 3.66k]
  ------------------
 2377|      0|        *parsedLen = static_cast<int32_t>(pLastGoodPosition - t->buf + parsedLenDelta);
 2378|      0|    }
 2379|       |
 2380|  3.66k|    return t.orphan();
 2381|  3.66k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_123_initializeULanguageTagEPNS_12ULanguageTagE:
 1025|  3.93k|_initializeULanguageTag(ULanguageTag* langtag) {
 1026|  3.93k|    int32_t i;
 1027|       |
 1028|  3.93k|    langtag->buf = nullptr;
 1029|       |
 1030|  3.93k|    langtag->language = EMPTY;
 1031|  15.7k|    for (i = 0; i < MAXEXTLANG; i++) {
  ------------------
  |  |   51|  15.7k|#define MAXEXTLANG 3
  ------------------
  |  Branch (1031:17): [True: 11.8k, False: 3.93k]
  ------------------
 1032|  11.8k|        langtag->extlang[i] = nullptr;
 1033|  11.8k|    }
 1034|       |
 1035|  3.93k|    langtag->script = EMPTY;
 1036|  3.93k|    langtag->region = EMPTY;
 1037|       |
 1038|  3.93k|    langtag->variants = nullptr;
 1039|  3.93k|    langtag->extensions = nullptr;
 1040|       |
 1041|  3.93k|    langtag->legacy = EMPTY;
 1042|  3.93k|    langtag->privateuse = EMPTY;
 1043|  3.93k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_116_isExtlangSubtagEPKci:
  449|  1.78k|_isExtlangSubtag(const char* s, int32_t len) {
  450|       |    /*
  451|       |     * extlang       = 3ALPHA              ; selected ISO 639 codes
  452|       |     *                 *2("-" 3ALPHA)      ; permanently reserved
  453|       |     */
  454|  1.78k|    if (len < 0) {
  ------------------
  |  Branch (454:9): [True: 0, False: 1.78k]
  ------------------
  455|      0|        len = 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        ::
  |  |  ------------------
  ------------------
  456|      0|    }
  457|  1.78k|    if (len == 3 && _isAlphaString(s, len)) {
  ------------------
  |  Branch (457:9): [True: 142, False: 1.64k]
  |  Branch (457:21): [True: 113, False: 29]
  ------------------
  458|    113|        return true;
  459|    113|    }
  460|  1.67k|    return false;
  461|  1.78k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_126_isPrivateuseVariantSubtagEPKci:
  557|  1.97k|_isPrivateuseVariantSubtag(const char* s, int32_t len) {
  558|       |    /*
  559|       |     * variant       = 1*8alphanum         ; registered variants
  560|       |     *               / (DIGIT 3alphanum)
  561|       |     */
  562|  1.97k|    return _isAlphaNumericStringLimitedLength(s, len , 1, 8);
  563|  1.97k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_120ultag_getExtlangSizeEPKNS_12ULanguageTagE:
 2445|  3.93k|ultag_getExtlangSize(const ULanguageTag* langtag) {
 2446|  3.93k|    int32_t size = 0;
 2447|  3.93k|    int32_t i;
 2448|  15.7k|    for (i = 0; i < MAXEXTLANG; i++) {
  ------------------
  |  |   51|  15.7k|#define MAXEXTLANG 3
  ------------------
  |  Branch (2448:17): [True: 11.8k, False: 3.93k]
  ------------------
 2449|  11.8k|        if (langtag->extlang[i]) {
  ------------------
  |  Branch (2449:13): [True: 113, False: 11.6k]
  ------------------
 2450|    113|            size++;
 2451|    113|        }
 2452|  11.8k|    }
 2453|  3.93k|    return size;
 2454|  3.93k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_116ultag_getExtlangEPKNS_12ULanguageTagEi:
 2437|     92|ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) {
 2438|     92|    if (idx >= 0 && idx < MAXEXTLANG) {
  ------------------
  |  |   51|     92|#define MAXEXTLANG 3
  ------------------
  |  Branch (2438:9): [True: 92, False: 0]
  |  Branch (2438:21): [True: 92, False: 0]
  ------------------
 2439|     92|        return langtag->extlang[idx];
 2440|     92|    }
 2441|      0|    return nullptr;
 2442|     92|}
uloc_tag.cpp:_ZN12_GLOBAL__N_117ultag_getLanguageEPKNS_12ULanguageTagE:
 2419|  3.84k|ultag_getLanguage(const ULanguageTag* langtag) {
 2420|  3.84k|    return langtag->language;
 2421|  3.84k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_115ultag_getScriptEPKNS_12ULanguageTagE:
 2457|  3.93k|ultag_getScript(const ULanguageTag* langtag) {
 2458|  3.93k|    return langtag->script;
 2459|  3.93k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_115ultag_getRegionEPKNS_12ULanguageTagE:
 2462|  3.93k|ultag_getRegion(const ULanguageTag* langtag) {
 2463|  3.93k|    return langtag->region;
 2464|  3.93k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_113_sortVariantsEPNS_16VariantListEntryE:
 1158|  3.93k|void _sortVariants(VariantListEntry* first) {
 1159|  6.53k|    for (VariantListEntry* var1 = first; var1 != nullptr; var1 = var1->next) {
  ------------------
  |  Branch (1159:42): [True: 2.59k, False: 3.93k]
  ------------------
 1160|  42.1k|        for (VariantListEntry* var2 = var1->next; var2 != nullptr; var2 = var2->next) {
  ------------------
  |  Branch (1160:51): [True: 39.5k, False: 2.59k]
  ------------------
 1161|       |            // Swap var1->variant and var2->variant.
 1162|  39.5k|            if (uprv_compareInvCharsAsAscii(var1->variant, var2->variant) > 0) {
  ------------------
  |  |  153|  39.5k|#   define uprv_compareInvCharsAsAscii(s1, s2) uprv_strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |   38|  39.5k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  39.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1162:17): [True: 18.2k, False: 21.3k]
  ------------------
 1163|  18.2k|                const char* temp = var1->variant;
 1164|  18.2k|                var1->variant = var2->variant;
 1165|  18.2k|                var2->variant = temp;
 1166|  18.2k|            }
 1167|  39.5k|        }
 1168|  2.59k|    }
 1169|  3.93k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_121ultag_getVariantsSizeEPKNS_12ULanguageTagE:
 2483|  5.14k|ultag_getVariantsSize(const ULanguageTag* langtag) {
 2484|  5.14k|    int32_t size = 0;
 2485|  5.14k|    VariantListEntry *cur = langtag->variants;
 2486|  8.18k|    while (true) {
  ------------------
  |  Branch (2486:12): [Folded - Ignored]
  ------------------
 2487|  8.18k|        if (cur == nullptr) {
  ------------------
  |  Branch (2487:13): [True: 5.14k, False: 3.04k]
  ------------------
 2488|  5.14k|            break;
 2489|  5.14k|        }
 2490|  3.04k|        size++;
 2491|  3.04k|        cur = cur->next;
 2492|  3.04k|    }
 2493|  5.14k|    return size;
 2494|  5.14k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_116ultag_getVariantEPKNS_12ULanguageTagEi:
 2467|  2.59k|ultag_getVariant(const ULanguageTag* langtag, int32_t idx) {
 2468|  2.59k|    const char *var = nullptr;
 2469|  2.59k|    VariantListEntry *cur = langtag->variants;
 2470|  2.59k|    int32_t i = 0;
 2471|  42.1k|    while (cur) {
  ------------------
  |  Branch (2471:12): [True: 42.1k, False: 0]
  ------------------
 2472|  42.1k|        if (i == idx) {
  ------------------
  |  Branch (2472:13): [True: 2.59k, False: 39.5k]
  ------------------
 2473|  2.59k|            var = cur->variant;
 2474|  2.59k|            break;
 2475|  2.59k|        }
 2476|  39.5k|        cur = cur->next;
 2477|  39.5k|        i++;
 2478|  39.5k|    }
 2479|  2.59k|    return var;
 2480|  2.59k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_123ultag_getExtensionsSizeEPKNS_12ULanguageTagE:
 2529|  5.35k|ultag_getExtensionsSize(const ULanguageTag* langtag) {
 2530|  5.35k|    int32_t size = 0;
 2531|  5.35k|    ExtensionListEntry *cur = langtag->extensions;
 2532|  9.51k|    while (true) {
  ------------------
  |  Branch (2532:12): [Folded - Ignored]
  ------------------
 2533|  9.51k|        if (cur == nullptr) {
  ------------------
  |  Branch (2533:13): [True: 5.35k, False: 4.16k]
  ------------------
 2534|  5.35k|            break;
 2535|  5.35k|        }
 2536|  4.16k|        size++;
 2537|  4.16k|        cur = cur->next;
 2538|  4.16k|    }
 2539|  5.35k|    return size;
 2540|  5.35k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_119ultag_getPrivateUseEPKNS_12ULanguageTagE:
 2543|  5.35k|ultag_getPrivateUse(const ULanguageTag* langtag) {
 2544|  5.35k|    return langtag->privateuse;
 2545|  5.35k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_115_appendKeywordsEPNS_12ULanguageTagERN6icu_788ByteSinkER10UErrorCode:
 1781|  1.41k|_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode& status) {
 1782|  1.41k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1782:9): [True: 0, False: 1.41k]
  ------------------
 1783|       |
 1784|  1.41k|    int32_t i, n;
 1785|  1.41k|    int32_t len;
 1786|  1.41k|    ExtensionListEntry *kwdFirst = nullptr;
 1787|  1.41k|    ExtensionListEntry *kwd;
 1788|  1.41k|    const char *key, *type;
 1789|  1.41k|    icu::MemoryPool<ExtensionListEntry> extPool;
 1790|  1.41k|    icu::MemoryPool<icu::CharString> kwdBuf;
 1791|  1.41k|    bool posixVariant = false;
 1792|       |
 1793|  1.41k|    n = ultag_getExtensionsSize(langtag);
 1794|       |
 1795|       |    /* resolve locale keywords and reordering keys */
 1796|  3.49k|    for (i = 0; i < n; i++) {
  ------------------
  |  Branch (1796:17): [True: 2.08k, False: 1.41k]
  ------------------
 1797|  2.08k|        key = ultag_getExtensionKey(langtag, i);
 1798|  2.08k|        type = ultag_getExtensionValue(langtag, i);
 1799|  2.08k|        if (*key == LDMLEXT) {
  ------------------
  |  |   67|  2.08k|#define LDMLEXT 'u'
  ------------------
  |  Branch (1799:13): [True: 1.20k, False: 879]
  ------------------
 1800|       |            /* Determine if variants already exists */
 1801|  1.20k|            if (ultag_getVariantsSize(langtag)) {
  ------------------
  |  Branch (1801:17): [True: 53, False: 1.15k]
  ------------------
 1802|     53|                posixVariant = true;
 1803|     53|            }
 1804|       |
 1805|  1.20k|            _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, posixVariant, status);
 1806|  1.20k|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (1806:17): [True: 0, False: 1.20k]
  ------------------
 1807|      0|                break;
 1808|      0|            }
 1809|  1.20k|        } else {
 1810|    879|            kwd = extPool.create();
 1811|    879|            if (kwd == nullptr) {
  ------------------
  |  Branch (1811:17): [True: 0, False: 879]
  ------------------
 1812|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1813|      0|                break;
 1814|      0|            }
 1815|    879|            kwd->key = key;
 1816|    879|            kwd->value = type;
 1817|    879|            if (!_addExtensionToList(&kwdFirst, kwd, false)) {
  ------------------
  |  Branch (1817:17): [True: 0, False: 879]
  ------------------
 1818|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 1819|      0|                break;
 1820|      0|            }
 1821|    879|        }
 1822|  2.08k|    }
 1823|       |
 1824|  1.41k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1824:9): [True: 1.41k, False: 0]
  ------------------
 1825|  1.41k|        type = ultag_getPrivateUse(langtag);
 1826|  1.41k|        if (static_cast<int32_t>(uprv_strlen(type)) > 0) {
  ------------------
  |  |   37|  1.41k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.41k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1826:13): [True: 211, False: 1.20k]
  ------------------
 1827|       |            /* add private use as a keyword */
 1828|    211|            kwd = extPool.create();
 1829|    211|            if (kwd == nullptr) {
  ------------------
  |  Branch (1829:17): [True: 0, False: 211]
  ------------------
 1830|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1831|    211|            } else {
 1832|    211|                kwd->key = PRIVATEUSE_KEY;
 1833|    211|                kwd->value = type;
 1834|    211|                if (!_addExtensionToList(&kwdFirst, kwd, false)) {
  ------------------
  |  Branch (1834:21): [True: 0, False: 211]
  ------------------
 1835|      0|                    status = U_ILLEGAL_ARGUMENT_ERROR;
 1836|      0|                }
 1837|    211|            }
 1838|    211|        }
 1839|  1.41k|    }
 1840|       |
 1841|       |    /* If a POSIX variant was in the extensions, write it out before writing the keywords. */
 1842|       |
 1843|  1.41k|    if (U_SUCCESS(status) && posixVariant) {
  ------------------
  |  Branch (1843:9): [True: 1.41k, False: 0]
  |  Branch (1843:30): [True: 17, False: 1.39k]
  ------------------
 1844|     17|        len = static_cast<int32_t>(uprv_strlen(_POSIX));
  ------------------
  |  |   37|     17|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|     17|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1845|     17|        sink.Append(_POSIX, len);
 1846|     17|    }
 1847|       |
 1848|  1.41k|    if (U_SUCCESS(status) && kwdFirst != nullptr) {
  ------------------
  |  Branch (1848:9): [True: 1.41k, False: 0]
  |  Branch (1848:30): [True: 1.40k, False: 7]
  ------------------
 1849|       |        /* write out the sorted keywords */
 1850|  1.40k|        bool firstValue = true;
 1851|  1.40k|        kwd = kwdFirst;
 1852|  8.15k|        do {
 1853|  8.15k|            if (firstValue) {
  ------------------
  |  Branch (1853:17): [True: 1.40k, False: 6.74k]
  ------------------
 1854|  1.40k|                sink.Append("@", 1);
 1855|  1.40k|                firstValue = false;
 1856|  6.74k|            } else {
 1857|  6.74k|                sink.Append(";", 1);
 1858|  6.74k|            }
 1859|       |
 1860|       |            /* key */
 1861|  8.15k|            len = static_cast<int32_t>(uprv_strlen(kwd->key));
  ------------------
  |  |   37|  8.15k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  8.15k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1862|  8.15k|            sink.Append(kwd->key, len);
 1863|  8.15k|            sink.Append("=", 1);
 1864|       |
 1865|       |            /* type */
 1866|  8.15k|            len = static_cast<int32_t>(uprv_strlen(kwd->value));
  ------------------
  |  |   37|  8.15k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  8.15k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1867|  8.15k|            sink.Append(kwd->value, len);
 1868|       |
 1869|  8.15k|            kwd = kwd->next;
 1870|  8.15k|        } while (kwd);
  ------------------
  |  Branch (1870:18): [True: 6.74k, False: 1.40k]
  ------------------
 1871|  1.40k|    }
 1872|  1.41k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_121ultag_getExtensionKeyEPKNS_12ULanguageTagEi:
 2497|  2.08k|ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) {
 2498|  2.08k|    const char *key = nullptr;
 2499|  2.08k|    ExtensionListEntry *cur = langtag->extensions;
 2500|  2.08k|    int32_t i = 0;
 2501|  5.71k|    while (cur) {
  ------------------
  |  Branch (2501:12): [True: 5.71k, False: 0]
  ------------------
 2502|  5.71k|        if (i == idx) {
  ------------------
  |  Branch (2502:13): [True: 2.08k, False: 3.63k]
  ------------------
 2503|  2.08k|            key = cur->key;
 2504|  2.08k|            break;
 2505|  2.08k|        }
 2506|  3.63k|        cur = cur->next;
 2507|  3.63k|        i++;
 2508|  3.63k|    }
 2509|  2.08k|    return key;
 2510|  2.08k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_123ultag_getExtensionValueEPKNS_12ULanguageTagEi:
 2513|  2.08k|ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) {
 2514|  2.08k|    const char *val = nullptr;
 2515|  2.08k|    ExtensionListEntry *cur = langtag->extensions;
 2516|  2.08k|    int32_t i = 0;
 2517|  5.71k|    while (cur) {
  ------------------
  |  Branch (2517:12): [True: 5.71k, False: 0]
  ------------------
 2518|  5.71k|        if (i == idx) {
  ------------------
  |  Branch (2518:13): [True: 2.08k, False: 3.63k]
  ------------------
 2519|  2.08k|            val = cur->value;
 2520|  2.08k|            break;
 2521|  2.08k|        }
 2522|  3.63k|        cur = cur->next;
 2523|  3.63k|        i++;
 2524|  3.63k|    }
 2525|  2.08k|    return val;
 2526|  2.08k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_130_appendLDMLExtensionAsKeywordsEPKcPPNS_18ExtensionListEntryERN6icu_7810MemoryPoolIS2_Li8EEERNS6_INS5_10CharStringELi8EEERbR10UErrorCode:
 1523|  1.20k|_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool<ExtensionListEntry>& extPool, icu::MemoryPool<icu::CharString>& kwdBuf, bool& posixVariant, UErrorCode& status) {
 1524|  1.20k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1524:9): [True: 0, False: 1.20k]
  ------------------
 1525|       |
 1526|  1.20k|    const char *pTag;   /* beginning of current subtag */
 1527|  1.20k|    const char *pKwds;  /* beginning of key-type pairs */
 1528|  1.20k|    bool variantExists = posixVariant;
 1529|       |
 1530|  1.20k|    ExtensionListEntry *kwdFirst = nullptr;    /* first LDML keyword */
 1531|  1.20k|    ExtensionListEntry *kwd, *nextKwd;
 1532|       |
 1533|  1.20k|    int32_t len;
 1534|       |
 1535|       |    /* Reset the posixVariant value */
 1536|  1.20k|    posixVariant = false;
 1537|       |
 1538|  1.20k|    pTag = ldmlext;
 1539|  1.20k|    pKwds = nullptr;
 1540|       |
 1541|  1.20k|    {
 1542|  1.20k|        AttributeListEntry *attrFirst = nullptr;   /* first attribute */
 1543|  1.20k|        AttributeListEntry *attr, *nextAttr;
 1544|       |
 1545|  1.20k|        icu::MemoryPool<icu::CharString> strPool;
 1546|  1.20k|        icu::MemoryPool<AttributeListEntry> attrPool;
 1547|       |
 1548|       |        /* Iterate through u extension attributes */
 1549|   150k|        while (*pTag) {
  ------------------
  |  Branch (1549:16): [True: 150k, False: 189]
  ------------------
 1550|       |            /* locate next separator char */
 1551|   940k|            for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++);
  ------------------
  |  |   65|   940k|#define SEP '-'
  ------------------
  |  Branch (1551:27): [True: 940k, False: 241]
  |  Branch (1551:44): [True: 790k, False: 150k]
  ------------------
 1552|       |
 1553|   150k|            if (ultag_isUnicodeLocaleKey(pTag, len)) {
  ------------------
  |  | 1233|   150k|#define ultag_isUnicodeLocaleKey U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleKey)
  |  |  ------------------
  |  |  |  |  123|   150k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   150k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   150k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1553:17): [True: 1.01k, False: 149k]
  ------------------
 1554|  1.01k|                pKwds = pTag;
 1555|  1.01k|                break;
 1556|  1.01k|            }
 1557|       |
 1558|       |            /* add this attribute to the list */
 1559|   149k|            attr = attrPool.create();
 1560|   149k|            if (attr == nullptr) {
  ------------------
  |  Branch (1560:17): [True: 0, False: 149k]
  ------------------
 1561|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1562|      0|                return;
 1563|      0|            }
 1564|       |
 1565|   149k|            if (icu::CharString* str = strPool.create(pTag, len, status)) {
  ------------------
  |  Branch (1565:34): [True: 149k, False: 0]
  ------------------
 1566|   149k|                if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1566:21): [True: 0, False: 149k]
  ------------------
 1567|   149k|                attr->attribute = str->data();
 1568|   149k|            } else {
 1569|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1570|      0|                return;
 1571|      0|            }
 1572|       |
 1573|       |            // duplicate attribute is ignored, causes no error.
 1574|   149k|            _addAttributeToList(&attrFirst, attr);
 1575|       |
 1576|       |            /* next tag */
 1577|   149k|            pTag += len;
 1578|   149k|            if (*pTag) {
  ------------------
  |  Branch (1578:17): [True: 149k, False: 189]
  ------------------
 1579|       |                /* next to the separator */
 1580|   149k|                pTag++;
 1581|   149k|            }
 1582|   149k|        }
 1583|       |
 1584|  1.20k|        if (attrFirst) {
  ------------------
  |  Branch (1584:13): [True: 420, False: 785]
  ------------------
 1585|       |            /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */
 1586|       |
 1587|    420|            kwd = extPool.create();
 1588|    420|            if (kwd == nullptr) {
  ------------------
  |  Branch (1588:17): [True: 0, False: 420]
  ------------------
 1589|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1590|      0|                return;
 1591|      0|            }
 1592|       |
 1593|    420|            icu::CharString* value = kwdBuf.create();
 1594|    420|            if (value == nullptr) {
  ------------------
  |  Branch (1594:17): [True: 0, False: 420]
  ------------------
 1595|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1596|      0|                return;
 1597|      0|            }
 1598|       |
 1599|       |            /* attribute subtags sorted in alphabetical order as type */
 1600|    420|            attr = attrFirst;
 1601|  3.01k|            while (attr != nullptr) {
  ------------------
  |  Branch (1601:20): [True: 2.59k, False: 420]
  ------------------
 1602|  2.59k|                nextAttr = attr->next;
 1603|  2.59k|                if (attr != attrFirst) {
  ------------------
  |  Branch (1603:21): [True: 2.17k, False: 420]
  ------------------
 1604|  2.17k|                    value->append('-', status);
 1605|  2.17k|                }
 1606|  2.59k|                value->append(attr->attribute, status);
 1607|  2.59k|                attr = nextAttr;
 1608|  2.59k|            }
 1609|    420|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (1609:17): [True: 0, False: 420]
  ------------------
 1610|      0|                return;
 1611|      0|            }
 1612|       |
 1613|    420|            kwd->key = LOCALE_ATTRIBUTE_KEY;
 1614|    420|            kwd->value = value->data();
 1615|       |
 1616|    420|            if (!_addExtensionToList(&kwdFirst, kwd, false)) {
  ------------------
  |  Branch (1616:17): [True: 0, False: 420]
  ------------------
 1617|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 1618|      0|                return;
 1619|      0|            }
 1620|    420|        }
 1621|  1.20k|    }
 1622|       |
 1623|  1.20k|    if (pKwds) {
  ------------------
  |  Branch (1623:9): [True: 1.01k, False: 189]
  ------------------
 1624|  1.01k|        const char *pBcpKey = nullptr;     /* u extension key subtag */
 1625|  1.01k|        const char *pBcpType = nullptr;    /* beginning of u extension type subtag(s) */
 1626|  1.01k|        int32_t bcpKeyLen = 0;
 1627|  1.01k|        int32_t bcpTypeLen = 0;
 1628|  1.01k|        bool isDone = false;
 1629|       |
 1630|  1.01k|        pTag = pKwds;
 1631|       |        /* BCP47 representation of LDML key/type pairs */
 1632|  5.34M|        while (!isDone) {
  ------------------
  |  Branch (1632:16): [True: 5.34M, False: 1.01k]
  ------------------
 1633|  5.34M|            const char *pNextBcpKey = nullptr;
 1634|  5.34M|            int32_t nextBcpKeyLen = 0;
 1635|  5.34M|            bool emitKeyword = false;
 1636|       |
 1637|  5.34M|            if (*pTag) {
  ------------------
  |  Branch (1637:17): [True: 5.34M, False: 1.01k]
  ------------------
 1638|       |                /* locate next separator char */
 1639|  31.0M|                for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++);
  ------------------
  |  |   65|  31.0M|#define SEP '-'
  ------------------
  |  Branch (1639:31): [True: 31.0M, False: 1.01k]
  |  Branch (1639:48): [True: 25.6M, False: 5.34M]
  ------------------
 1640|       |
 1641|  5.34M|                if (ultag_isUnicodeLocaleKey(pTag, len)) {
  ------------------
  |  | 1233|  5.34M|#define ultag_isUnicodeLocaleKey U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleKey)
  |  |  ------------------
  |  |  |  |  123|  5.34M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.34M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.34M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1641:21): [True: 1.60M, False: 3.74M]
  ------------------
 1642|  1.60M|                    if (pBcpKey) {
  ------------------
  |  Branch (1642:25): [True: 1.60M, False: 1.01k]
  ------------------
 1643|  1.60M|                        emitKeyword = true;
 1644|  1.60M|                        pNextBcpKey = pTag;
 1645|  1.60M|                        nextBcpKeyLen = len;
 1646|  1.60M|                    } else {
 1647|  1.01k|                        pBcpKey = pTag;
 1648|  1.01k|                        bcpKeyLen = len;
 1649|  1.01k|                    }
 1650|  3.74M|                } else {
 1651|  3.74M|                    U_ASSERT(pBcpKey != nullptr);
  ------------------
  |  |   35|  3.74M|#   define U_ASSERT(exp) (void)0
  ------------------
 1652|       |                    /* within LDML type subtags */
 1653|  3.74M|                    if (pBcpType) {
  ------------------
  |  Branch (1653:25): [True: 3.73M, False: 10.1k]
  ------------------
 1654|  3.73M|                        bcpTypeLen += (len + 1);
 1655|  3.73M|                    } else {
 1656|  10.1k|                        pBcpType = pTag;
 1657|  10.1k|                        bcpTypeLen = len;
 1658|  10.1k|                    }
 1659|  3.74M|                }
 1660|       |
 1661|       |                /* next tag */
 1662|  5.34M|                pTag += len;
 1663|  5.34M|                if (*pTag) {
  ------------------
  |  Branch (1663:21): [True: 5.34M, False: 1.01k]
  ------------------
 1664|       |                    /* next to the separator */
 1665|  5.34M|                    pTag++;
 1666|  5.34M|                }
 1667|  5.34M|            } else {
 1668|       |                /* processing last one */
 1669|  1.01k|                emitKeyword = true;
 1670|  1.01k|                isDone = true;
 1671|  1.01k|            }
 1672|       |
 1673|  5.34M|            if (emitKeyword) {
  ------------------
  |  Branch (1673:17): [True: 1.60M, False: 3.74M]
  ------------------
 1674|  1.60M|                const char *pKey = nullptr;    /* LDML key */
 1675|  1.60M|                const char *pType = nullptr;   /* LDML type */
 1676|       |
 1677|  1.60M|                U_ASSERT(pBcpKey != nullptr);
  ------------------
  |  |   35|  1.60M|#   define U_ASSERT(exp) (void)0
  ------------------
 1678|       |
 1679|       |                /* BCP key length is always 2 for now */
 1680|  1.60M|                if (bcpKeyLen != 2) {
  ------------------
  |  Branch (1680:21): [True: 0, False: 1.60M]
  ------------------
 1681|       |                    /* the BCP key is invalid */
 1682|      0|                    status = U_ILLEGAL_ARGUMENT_ERROR;
 1683|      0|                    return;
 1684|      0|                }
 1685|       |
 1686|       |                /* u extension key to LDML key */
 1687|  1.60M|                std::optional<std::string_view> legacyKey = ulocimp_toLegacyKeyWithFallback(
  ------------------
  |  | 1220|  1.60M|#define ulocimp_toLegacyKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  1.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1688|  1.60M|                    {pBcpKey, static_cast<std::string_view::size_type>(bcpKeyLen)});
 1689|  1.60M|                if (!legacyKey.has_value()) {
  ------------------
  |  Branch (1689:21): [True: 0, False: 1.60M]
  ------------------
 1690|      0|                    status = U_ILLEGAL_ARGUMENT_ERROR;
 1691|      0|                    return;
 1692|      0|                }
 1693|  1.60M|                if (legacyKey->data() == pBcpKey) {
  ------------------
  |  Branch (1693:21): [True: 1.60M, False: 5.18k]
  ------------------
 1694|       |                    /*
 1695|       |                    The key returned by toLegacyKey points to the input buffer.
 1696|       |                    We normalize the result key to lower case.
 1697|       |                    */
 1698|  1.60M|                    icu::CharString* key = kwdBuf.create(pBcpKey, bcpKeyLen, status);
 1699|  1.60M|                    if (key == nullptr) {
  ------------------
  |  Branch (1699:25): [True: 0, False: 1.60M]
  ------------------
 1700|      0|                        status = U_MEMORY_ALLOCATION_ERROR;
 1701|      0|                        return;
 1702|      0|                    }
 1703|  1.60M|                    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1703:25): [True: 0, False: 1.60M]
  ------------------
 1704|      0|                        return;
 1705|      0|                    }
 1706|  1.60M|                    T_CString_toLowerCase(key->data());
  ------------------
  |  |   69|  1.60M|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  123|  1.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1707|  1.60M|                    pKey = key->data();
 1708|  1.60M|                } else {
 1709|  5.18k|                    pKey = legacyKey->data();
 1710|  5.18k|                }
 1711|       |
 1712|  1.60M|                if (pBcpType) {
  ------------------
  |  Branch (1712:21): [True: 10.1k, False: 1.59M]
  ------------------
 1713|       |                    /* BCP type to locale type */
 1714|  10.1k|                    std::optional<std::string_view> legacyType = ulocimp_toLegacyTypeWithFallback(
  ------------------
  |  | 1222|  10.1k|#define ulocimp_toLegacyTypeWithFallback U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyTypeWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1715|  10.1k|                        pKey, {pBcpType, static_cast<std::string_view::size_type>(bcpTypeLen)});
 1716|  10.1k|                    if (!legacyType.has_value()) {
  ------------------
  |  Branch (1716:25): [True: 0, False: 10.1k]
  ------------------
 1717|      0|                        status = U_ILLEGAL_ARGUMENT_ERROR;
 1718|      0|                        return;
 1719|      0|                    }
 1720|  10.1k|                    if (legacyType->data() == pBcpType) {
  ------------------
  |  Branch (1720:25): [True: 9.89k, False: 253]
  ------------------
 1721|       |                        /*
 1722|       |                        The type returned by toLegacyType points to the input buffer.
 1723|       |                        We normalize the result type to lower case.
 1724|       |                        */
 1725|  9.89k|                        icu::CharString* type = kwdBuf.create(pBcpType, bcpTypeLen, status);
 1726|  9.89k|                        if (type == nullptr) {
  ------------------
  |  Branch (1726:29): [True: 0, False: 9.89k]
  ------------------
 1727|      0|                            status = U_MEMORY_ALLOCATION_ERROR;
 1728|      0|                            return;
 1729|      0|                        }
 1730|  9.89k|                        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1730:29): [True: 0, False: 9.89k]
  ------------------
 1731|      0|                            return;
 1732|      0|                        }
 1733|  9.89k|                        T_CString_toLowerCase(type->data());
  ------------------
  |  |   69|  9.89k|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  123|  9.89k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.89k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.89k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1734|  9.89k|                        pType = type->data();
 1735|  9.89k|                    } else {
 1736|    253|                        pType = legacyType->data();
 1737|    253|                    }
 1738|  1.59M|                } else {
 1739|       |                    /* typeless - default type value is "yes" */
 1740|  1.59M|                    pType = LOCALE_TYPE_YES;
 1741|  1.59M|                }
 1742|       |
 1743|       |                /* Special handling for u-va-posix, since we want to treat this as a variant, 
 1744|       |                   not as a keyword */
 1745|  1.60M|                if (!variantExists && !uprv_strcmp(pKey, POSIX_KEY) && !uprv_strcmp(pType, POSIX_VALUE) ) {
  ------------------
  |  |   38|  1.60M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.60M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                              if (!variantExists && !uprv_strcmp(pKey, POSIX_KEY) && !uprv_strcmp(pType, POSIX_VALUE) ) {
  ------------------
  |  |   38|    525|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    525|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1745:21): [True: 1.60M, False: 704]
  |  Branch (1745:39): [True: 525, False: 1.60M]
  |  Branch (1745:72): [True: 239, False: 286]
  ------------------
 1746|    239|                    posixVariant = true;
 1747|  1.60M|                } else {
 1748|       |                    /* create an ExtensionListEntry for this keyword */
 1749|  1.60M|                    kwd = extPool.create();
 1750|  1.60M|                    if (kwd == nullptr) {
  ------------------
  |  Branch (1750:25): [True: 0, False: 1.60M]
  ------------------
 1751|      0|                        status = U_MEMORY_ALLOCATION_ERROR;
 1752|      0|                        return;
 1753|      0|                    }
 1754|       |
 1755|  1.60M|                    kwd->key = pKey;
 1756|  1.60M|                    kwd->value = pType;
 1757|       |
 1758|  1.60M|                    if (!_addExtensionToList(&kwdFirst, kwd, false)) {
  ------------------
  |  Branch (1758:25): [True: 1.59M, False: 6.64k]
  ------------------
 1759|       |                        // duplicate keyword is allowed, Only the first
 1760|       |                        // is honored.
 1761|  1.59M|                    }
 1762|  1.60M|                }
 1763|       |
 1764|  1.60M|                pBcpKey = pNextBcpKey;
 1765|  1.60M|                bcpKeyLen = pNextBcpKey != nullptr ? nextBcpKeyLen : 0;
  ------------------
  |  Branch (1765:29): [True: 1.60M, False: 1.01k]
  ------------------
 1766|  1.60M|                pBcpType = nullptr;
 1767|  1.60M|                bcpTypeLen = 0;
 1768|  1.60M|            }
 1769|  5.34M|        }
 1770|  1.01k|    }
 1771|       |
 1772|  1.20k|    kwd = kwdFirst;
 1773|  8.26k|    while (kwd != nullptr) {
  ------------------
  |  Branch (1773:12): [True: 7.06k, False: 1.20k]
  ------------------
 1774|  7.06k|        nextKwd = kwd->next;
 1775|  7.06k|        _addExtensionToList(appendTo, kwd, false);
 1776|  7.06k|        kwd = nextKwd;
 1777|  7.06k|    }
 1778|  1.20k|}
uloc_tag.cpp:_ZN12_GLOBAL__N_111ultag_closeEPNS_12ULanguageTagE:
 2389|  3.93k|ultag_close(ULanguageTag* langtag) {
 2390|       |
 2391|  3.93k|    if (langtag == nullptr) {
  ------------------
  |  Branch (2391:9): [True: 0, False: 3.93k]
  ------------------
 2392|      0|        return;
 2393|      0|    }
 2394|       |
 2395|  3.93k|    uprv_free(langtag->buf);
  ------------------
  |  | 1503|  3.93k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  3.93k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.93k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.93k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2396|       |
 2397|  3.93k|    if (langtag->variants) {
  ------------------
  |  Branch (2397:9): [True: 310, False: 3.62k]
  ------------------
 2398|    310|        VariantListEntry *curVar = langtag->variants;
 2399|  2.90k|        while (curVar) {
  ------------------
  |  Branch (2399:16): [True: 2.59k, False: 310]
  ------------------
 2400|  2.59k|            VariantListEntry *nextVar = curVar->next;
 2401|  2.59k|            delete curVar;
 2402|  2.59k|            curVar = nextVar;
 2403|  2.59k|        }
 2404|    310|    }
 2405|       |
 2406|  3.93k|    if (langtag->extensions) {
  ------------------
  |  Branch (2406:9): [True: 1.24k, False: 2.69k]
  ------------------
 2407|  1.24k|        ExtensionListEntry *curExt = langtag->extensions;
 2408|  3.32k|        while (curExt) {
  ------------------
  |  Branch (2408:16): [True: 2.08k, False: 1.24k]
  ------------------
 2409|  2.08k|            ExtensionListEntry *nextExt = curExt->next;
 2410|  2.08k|            delete curExt;
 2411|  2.08k|            curExt = nextExt;
 2412|  2.08k|        }
 2413|  1.24k|    }
 2414|       |
 2415|  3.93k|    uprv_free(langtag);
  ------------------
  |  | 1503|  3.93k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  3.93k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.93k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.93k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2416|  3.93k|}
uloc_tag.cpp:_ZZ25ulocimp_forLanguageTag_78PKciPiR10UErrorCodeENK3$_0clERN6icu_788ByteSinkES3_:
 2677|  3.93k|        [&](icu::ByteSink& sink, UErrorCode& status) {
 2678|  3.93k|            ulocimp_forLanguageTag(langtag, tagLen, sink, parsedLength, status);
  ------------------
  |  | 1198|  3.93k|#define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag)
  |  |  ------------------
  |  |  |  |  123|  3.93k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.93k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.93k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2679|  3.93k|        },

uloc.cpp:_ZN12_GLOBAL__N_114_isIDSeparatorEc:
   49|   579k|inline bool _isIDSeparator(char a) { return a == '_' || a == '-'; }
  ------------------
  |  Branch (49:45): [True: 167k, False: 411k]
  |  Branch (49:57): [True: 9.19k, False: 402k]
  ------------------

uprv_unmapFile_78:
  252|  14.7k|    uprv_unmapFile(UDataMemory *pData) {
  253|  14.7k|        if(pData!=nullptr && pData->map!=nullptr) {
  ------------------
  |  Branch (253:12): [True: 14.7k, False: 0]
  |  Branch (253:30): [True: 0, False: 14.7k]
  ------------------
  254|      0|            size_t dataLen = (char *)pData->map - (char *)pData->mapAddr;
  255|      0|            if(munmap(pData->mapAddr, dataLen)==-1) {
  ------------------
  |  Branch (255:16): [True: 0, False: 0]
  ------------------
  256|      0|            }
  257|      0|            pData->pHeader=nullptr;
  258|      0|            pData->map=nullptr;
  259|      0|            pData->mapAddr=nullptr;
  260|      0|        }
  261|  14.7k|    }

uprv_max_78:
   17|  40.9k|{
   18|  40.9k|    return (x > y ? x : y);
  ------------------
  |  Branch (18:13): [True: 3.04k, False: 37.8k]
  ------------------
   19|  40.9k|}
uprv_min_78:
   23|   184k|{
   24|   184k|    return (x > y ? y : x);
  ------------------
  |  Branch (24:13): [True: 0, False: 184k]
  ------------------
   25|   184k|}

_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|   630k|umtx_lock(UMutex *mutex) {
  113|   630k|    if (mutex == nullptr) {
  ------------------
  |  Branch (113:9): [True: 56.7k, False: 574k]
  ------------------
  114|  56.7k|        mutex = &globalMutex;
  115|  56.7k|    }
  116|   630k|    mutex->lock();
  117|   630k|}
umtx_unlock_78:
  122|   630k|{
  123|   630k|    if (mutex == nullptr) {
  ------------------
  |  Branch (123:9): [True: 56.7k, False: 574k]
  ------------------
  124|  56.7k|        mutex = &globalMutex;
  125|  56.7k|    }
  126|   630k|    mutex->unlock();
  127|   630k|}
_ZN6icu_7820umtx_initImplPreInitERNS_9UInitOnceE:
  145|     15|umtx_initImplPreInit(UInitOnce &uio) {
  146|     15|    std::call_once(*pInitFlag, umtx_init);
  147|     15|    std::unique_lock<std::mutex> lock(*initMutex);
  148|     15|    if (umtx_loadAcquire(uio.fState) == 0) {
  ------------------
  |  Branch (148:9): [True: 15, False: 0]
  ------------------
  149|     15|        umtx_storeRelease(uio.fState, 1);
  150|     15|        return true;      // Caller will next call the init function.
  151|     15|    } 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|     15|}
_ZN6icu_7821umtx_initImplPostInitERNS_9UInitOnceE:
  170|     15|umtx_initImplPostInit(UInitOnce &uio) {
  171|     15|    {
  172|     15|        std::unique_lock<std::mutex> lock(*initMutex);
  173|     15|        umtx_storeRelease(uio.fState, 2);
  174|     15|    }
  175|     15|    initCondition->notify_all();
  176|     15|}
umutex.cpp:_ZN6icu_78L9umtx_initEv:
   72|      1|static void U_CALLCONV umtx_init() {
   73|      1|    initMutex = STATIC_NEW(std::mutex);
  ------------------
  |  |  144|      1|#define STATIC_NEW(type) [] () { \
  |  |  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  |  |  146|      1|    return new(storage) type();} ()
  ------------------
   74|      1|    initCondition = STATIC_NEW(std::condition_variable);
  ------------------
  |  |  144|      1|#define STATIC_NEW(type) [] () { \
  |  |  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  |  |  146|      1|    return new(storage) type();} ()
  ------------------
   75|      1|    ucln_common_registerCleanup(UCLN_COMMON_MUTEX, umtx_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|      1|}

_ZN6icu_7813umtx_initOnceERNS_9UInitOnceEPFvR10UErrorCodeES3_:
  135|  1.73M|inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(UErrorCode &), UErrorCode &errCode) {
  136|  1.73M|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (136:9): [True: 1, False: 1.73M]
  ------------------
  137|      1|        return;
  138|      1|    }
  139|  1.73M|    if (umtx_loadAcquire(uio.fState) != 2 && umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (139:9): [True: 8, False: 1.73M]
  |  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|  1.73M|    } else {
  145|       |        // Someone else already ran the initialization.
  146|  1.73M|        if (U_FAILURE(uio.fErrCode)) {
  ------------------
  |  Branch (146:13): [True: 0, False: 1.73M]
  ------------------
  147|      0|            errCode = uio.fErrCode;
  148|      0|        }
  149|  1.73M|    }
  150|  1.73M|}
_ZN6icu_7816umtx_loadAcquireERNSt3__16atomicIiEE:
   75|  28.0M|inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) {
   76|  28.0M|    return var.load(std::memory_order_acquire);
   77|  28.0M|}
_ZN6icu_789UInitOnce7isResetEv:
  102|  14.7k|    UBool isReset() {return umtx_loadAcquire(fState) == 0;}
_ZN6icu_786UMutex4lockEv:
  229|   630k|    void lock() {
  230|   630k|        std::mutex *m = fMutex.load(std::memory_order_acquire);
  231|   630k|        if (m == nullptr) { m = getMutex(); }
  ------------------
  |  Branch (231:13): [True: 6, False: 630k]
  ------------------
  232|   630k|        m->lock();
  233|   630k|    }
_ZN6icu_786UMutex6unlockEv:
  234|   630k|    void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); }
_ZN6icu_7817umtx_storeReleaseERNSt3__16atomicIiEEi:
   79|     31|inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) {
   80|     31|    var.store(val, std::memory_order_release);
   81|     31|}
_ZN6icu_7815umtx_atomic_decEPNSt3__16atomicIiEE:
   87|   122k|inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) {
   88|   122k|    return var->fetch_sub(1) - 1;
   89|   122k|}
_ZN6icu_7813umtx_initOnceERNS_9UInitOnceEPFvvE:
  123|  36.1k|inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)()) {
  124|  36.1k|    if (umtx_loadAcquire(uio.fState) == 2) {
  ------------------
  |  Branch (124:9): [True: 36.1k, False: 2]
  ------------------
  125|  36.1k|        return;
  126|  36.1k|    }
  127|      2|    if (umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (127:9): [True: 2, False: 0]
  ------------------
  128|      2|        (*fp)();
  129|      2|        umtx_initImplPostInit(uio);
  130|      2|    }
  131|      2|}
_ZN6icu_7813umtx_initOnceI15UPropertySourceEEvRNS_9UInitOnceEPFvT_R10UErrorCodeES4_S6_:
  166|     15|template<class T> void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UErrorCode &), T context, UErrorCode &errCode) {
  167|     15|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (167:9): [True: 0, False: 15]
  ------------------
  168|      0|        return;
  169|      0|    }
  170|     15|    if (umtx_loadAcquire(uio.fState) != 2 && umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (170:9): [True: 2, False: 13]
  |  Branch (170:46): [True: 2, False: 0]
  ------------------
  171|       |        // We run the initialization.
  172|      2|        (*fp)(context, errCode);
  173|      2|        uio.fErrCode = errCode;
  174|      2|        umtx_initImplPostInit(uio);
  175|     13|    } else {
  176|       |        // Someone else already ran the initialization.
  177|     13|        if (U_FAILURE(uio.fErrCode)) {
  ------------------
  |  Branch (177:13): [True: 0, False: 13]
  ------------------
  178|      0|            errCode = uio.fErrCode;
  179|      0|        }
  180|     13|    }
  181|     15|}
_ZN6icu_7813umtx_initOnceI9UPropertyEEvRNS_9UInitOnceEPFvT_R10UErrorCodeES4_S6_:
  166|  40.5k|template<class T> void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UErrorCode &), T context, UErrorCode &errCode) {
  167|  40.5k|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (167:9): [True: 0, False: 40.5k]
  ------------------
  168|      0|        return;
  169|      0|    }
  170|  40.5k|    if (umtx_loadAcquire(uio.fState) != 2 && umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (170:9): [True: 2, False: 40.5k]
  |  Branch (170:46): [True: 2, False: 0]
  ------------------
  171|       |        // We run the initialization.
  172|      2|        (*fp)(context, errCode);
  173|      2|        uio.fErrCode = errCode;
  174|      2|        umtx_initImplPostInit(uio);
  175|  40.5k|    } else {
  176|       |        // Someone else already ran the initialization.
  177|  40.5k|        if (U_FAILURE(uio.fErrCode)) {
  ------------------
  |  Branch (177:13): [True: 0, False: 40.5k]
  ------------------
  178|      0|            errCode = uio.fErrCode;
  179|      0|        }
  180|  40.5k|    }
  181|  40.5k|}
_ZN6icu_7813umtx_initOnceIPKcEEvRNS_9UInitOnceEPFvT_R10UErrorCodeES5_S7_:
  166|      1|template<class T> void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UErrorCode &), T context, UErrorCode &errCode) {
  167|      1|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (167:9): [True: 0, False: 1]
  ------------------
  168|      0|        return;
  169|      0|    }
  170|      1|    if (umtx_loadAcquire(uio.fState) != 2 && umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (170:9): [True: 1, False: 0]
  |  Branch (170:46): [True: 1, False: 0]
  ------------------
  171|       |        // We run the initialization.
  172|      1|        (*fp)(context, errCode);
  173|      1|        uio.fErrCode = errCode;
  174|      1|        umtx_initImplPostInit(uio);
  175|      1|    } else {
  176|       |        // Someone else already ran the initialization.
  177|      0|        if (U_FAILURE(uio.fErrCode)) {
  ------------------
  |  Branch (177:13): [True: 0, False: 0]
  ------------------
  178|      0|            errCode = uio.fErrCode;
  179|      0|        }
  180|      0|    }
  181|      1|}

_ZN6icu_788ByteSinkC2Ev:
   59|   435k|  ByteSink() { }
_ZNK6icu_7820CheckedArrayByteSink10OverflowedEv:
  240|  8.97k|  UBool Overflowed() const { return overflowed_; }
_ZNK6icu_7820CheckedArrayByteSink21NumberOfBytesAppendedEv:
  248|  37.9k|  int32_t NumberOfBytesAppended() const { return appended_; }

_ZN6icu_789BytesTrieC2EPKv:
   72|  9.52M|            : ownedArray_(nullptr), bytes_(static_cast<const uint8_t *>(trieBytes)),
   73|  9.52M|              pos_(bytes_), remainingMatchLength_(-1) {}
_ZN6icu_789BytesTrie5firstEi:
  203|  9.52M|    inline UStringTrieResult first(int32_t inByte) {
  204|  9.52M|        remainingMatchLength_=-1;
  205|  9.52M|        if(inByte<0) {
  ------------------
  |  Branch (205:12): [True: 2.28k, False: 9.51M]
  ------------------
  206|  2.28k|            inByte+=0x100;
  207|  2.28k|        }
  208|  9.52M|        return nextImpl(bytes_, inByte);
  209|  9.52M|    }
_ZNK6icu_789BytesTrie8getValueEv:
  246|     41|    inline int32_t getValue() const {
  247|     41|        const uint8_t *pos=pos_;
  248|     41|        int32_t leadByte=*pos++;
  249|       |        // U_ASSERT(leadByte>=kMinValueLead);
  250|     41|        return readValue(pos, leadByte>>1);
  251|     41|    }
_ZN6icu_789BytesTrie4stopEv:
  399|  9.35M|    inline void stop() {
  400|  9.35M|        pos_=nullptr;
  401|  9.35M|    }
_ZN6icu_789BytesTrie9skipValueEPKhi:
  406|  53.7M|    static inline const uint8_t *skipValue(const uint8_t *pos, int32_t leadByte) {
  407|       |        // U_ASSERT(leadByte>=kMinValueLead);
  408|  53.7M|        if(leadByte>=(kMinTwoByteValueLead<<1)) {
  ------------------
  |  Branch (408:12): [True: 23.4M, False: 30.3M]
  ------------------
  409|  23.4M|            if(leadByte<(kMinThreeByteValueLead<<1)) {
  ------------------
  |  Branch (409:16): [True: 11.3M, False: 12.0M]
  ------------------
  410|  11.3M|                ++pos;
  411|  12.0M|            } else if(leadByte<(kFourByteValueLead<<1)) {
  ------------------
  |  Branch (411:23): [True: 12.0M, False: 14]
  ------------------
  412|  12.0M|                pos+=2;
  413|  12.0M|            } else {
  414|     14|                pos+=3+((leadByte>>1)&1);
  415|     14|            }
  416|  23.4M|        }
  417|  53.7M|        return pos;
  418|  53.7M|    }
_ZN6icu_789BytesTrie9skipValueEPKh:
  419|  46.1M|    static inline const uint8_t *skipValue(const uint8_t *pos) {
  420|  46.1M|        int32_t leadByte=*pos++;
  421|  46.1M|        return skipValue(pos, leadByte);
  422|  46.1M|    }
_ZN6icu_789BytesTrie9skipDeltaEPKh:
  427|  31.8M|    static inline const uint8_t *skipDelta(const uint8_t *pos) {
  428|  31.8M|        int32_t delta=*pos++;
  429|  31.8M|        if(delta>=kMinTwoByteDeltaLead) {
  ------------------
  |  Branch (429:12): [True: 29.8M, False: 1.99M]
  ------------------
  430|  29.8M|            if(delta<kMinThreeByteDeltaLead) {
  ------------------
  |  Branch (430:16): [True: 11.1M, False: 18.7M]
  ------------------
  431|  11.1M|                ++pos;
  432|  18.7M|            } else if(delta<kFourByteDeltaLead) {
  ------------------
  |  Branch (432:23): [True: 18.7M, False: 0]
  ------------------
  433|  18.7M|                pos+=2;
  434|  18.7M|            } else {
  435|      0|                pos+=3+(delta&1);
  436|      0|            }
  437|  29.8M|        }
  438|  31.8M|        return pos;
  439|  31.8M|    }
_ZN6icu_789BytesTrie11valueResultEi:
  441|  7.65M|    static inline UStringTrieResult valueResult(int32_t node) {
  442|  7.65M|        return static_cast<UStringTrieResult>(USTRINGTRIE_INTERMEDIATE_VALUE - (node & kValueIsFinal));
  443|  7.65M|    }

_ZNK6icu_7814ConstChar16PtrcvPKDsEv:
  205|   116M|    inline operator const char16_t *() const { return get(); }
_ZNK6icu_7814ConstChar16Ptr3getEv:
  241|   116M|const char16_t *ConstChar16Ptr::get() const { return p_; }
_ZN6icu_788internal15toU16StringViewENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
  400|     13|inline std::u16string_view toU16StringView(std::u16string_view sv) { return sv; }
_ZN6icu_7814ConstChar16PtrC2EPKDs:
  229|   116M|ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {}
_ZN6icu_7814ConstChar16PtrD2Ev:
  237|   116M|ConstChar16Ptr::~ConstChar16Ptr() {
  238|   116M|    U_ALIASING_BARRIER(p_);
  ------------------
  |  |   35|   116M|#   define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")
  ------------------
  239|   116M|}
_ZN6icu_788internal23toU16StringViewNullableIA28_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      4|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      4|    return toU16StringView(text);
  432|      4|}
_ZN6icu_788internal23toU16StringViewNullableIA34_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      4|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      4|    return toU16StringView(text);
  432|      4|}
_ZN6icu_788internal23toU16StringViewNullableIA16_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA35_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA33_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA58_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA13_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|    886|    ErrorCode() : errorCode(U_ZERO_ERROR) {}
_ZN6icu_789ErrorCodecvR10UErrorCodeEv:
   94|    886|    operator UErrorCode & () { return errorCode; }
_ZNK6icu_789ErrorCode9isFailureEv:
  100|    886|    UBool isFailure() const { return U_FAILURE(errorCode); }

_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEEC2EPS2_:
  567|  2.71k|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI15UResourceBundleEC2EPS1_:
   82|  2.71k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEED2Ev:
  575|  2.71k|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 2.61k, False: 93]
  ------------------
_ZN6icu_7816LocalPointerBaseI15UResourceBundleED2Ev:
   88|  2.71k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleE8getAliasEv:
  122|   256k|    T *getAlias() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEEC2EPS1_:
   82|    174|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEED2Ev:
   88|    174|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_10UCharsTrieEEC2EPS1_:
  200|    696|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_10UCharsTrieEEC2EPS1_:
   82|    696|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_10UCharsTrieEED2Ev:
  245|    696|    ~LocalPointer() {
  246|    696|        delete LocalPointerBase<T>::ptr;
  247|    696|    }
_ZN6icu_7816LocalPointerBaseINS_10UCharsTrieEED2Ev:
   88|    696|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_13BreakIteratorEEC2EPS1_:
  200|    354|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_13BreakIteratorEEC2EPS1_:
   82|    354|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_788internal16LocalOpenPointerI5UTextXadL_Z14utext_close_78EEEC2EPS2_:
  567|    174|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI5UTextEC2EPS1_:
   82|    174|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_13BreakIteratorEED2Ev:
  245|    354|    ~LocalPointer() {
  246|    354|        delete LocalPointerBase<T>::ptr;
  247|    354|    }
_ZN6icu_7816LocalPointerBaseINS_13BreakIteratorEED2Ev:
   88|    354|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_788internal16LocalOpenPointerI5UTextXadL_Z14utext_close_78EEED2Ev:
  575|    174|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 0, False: 174]
  ------------------
_ZN6icu_7816LocalPointerBaseI5UTextED2Ev:
   88|    174|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEE12adoptInsteadEPS2_:
  595|  85.2k|    void adoptInstead(Type *p) {
  596|  85.2k|        if (ptr != nullptr) { closeFunction(ptr); }
  ------------------
  |  Branch (596:13): [True: 0, False: 85.2k]
  ------------------
  597|  85.2k|        ptr=p;
  598|  85.2k|    }
_ZN6icu_7816LocalPointerBaseI15UResourceBundleE6orphanEv:
  141|  85.2k|    T *orphan() {
  142|  85.2k|        T *p=ptr;
  143|  85.2k|        ptr=nullptr;
  144|  85.2k|        return p;
  145|  85.2k|    }
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleE7isValidEv:
  100|  13.0k|    UBool isValid() const { return ptr!=nullptr; }
_ZN6icu_7812LocalPointerINS_17UCharsTrieBuilderEEC2EPS1_R10UErrorCode:
  214|    360|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|    360|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 360]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|    360|    }
_ZN6icu_7816LocalPointerBaseINS_17UCharsTrieBuilderEEC2EPS1_:
   82|    360|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_17UCharsTrieBuilderEED2Ev:
  245|    360|    ~LocalPointer() {
  246|    360|        delete LocalPointerBase<T>::ptr;
  247|    360|    }
_ZN6icu_7816LocalPointerBaseINS_17UCharsTrieBuilderEED2Ev:
   88|    360|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7810LocalArrayINS_13UnicodeStringEEC2EPS1_:
  375|    174|    explicit LocalArray(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7810LocalArrayINS_13UnicodeStringEED2Ev:
  420|    174|    ~LocalArray() {
  421|    174|        delete[] LocalPointerBase<T>::ptr;
  422|    174|    }
_ZN6icu_7816LocalPointerBaseIiEC2EPi:
   82|    179|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIiED2Ev:
   88|    179|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7810LocalArrayINS_13UnicodeStringEEixEl:
  512|   380k|    T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
_ZNK6icu_7816LocalPointerBaseINS_17UCharsTrieBuilderEEptEv:
  134|  5.23k|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_10UCharsTrieEE12adoptInsteadEPS1_:
  300|     66|    void adoptInstead(T *p) {
  301|     66|        delete LocalPointerBase<T>::ptr;
  302|     66|        LocalPointerBase<T>::ptr=p;
  303|     66|    }
_ZN6icu_7816LocalPointerBaseINS_13BreakIteratorEE6orphanEv:
  141|    174|    T *orphan() {
  142|    174|        T *p=ptr;
  143|    174|        ptr=nullptr;
  144|    174|        return p;
  145|    174|    }
_ZN6icu_7816LocalPointerBaseINS_10UCharsTrieEE6orphanEv:
  141|    348|    T *orphan() {
  142|    348|        T *p=ptr;
  143|    348|        ptr=nullptr;
  144|    348|        return p;
  145|    348|    }
_ZN6icu_7812LocalPointerINS_28FilteredBreakIteratorBuilderEEC2EPS1_R10UErrorCode:
  214|    201|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|    201|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 201]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|    201|    }
_ZN6icu_7816LocalPointerBaseINS_28FilteredBreakIteratorBuilderEEC2EPS1_:
   82|    201|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_28FilteredBreakIteratorBuilderEED2Ev:
  245|    201|    ~LocalPointer() {
  246|    201|        delete LocalPointerBase<T>::ptr;
  247|    201|    }
_ZN6icu_7816LocalPointerBaseINS_28FilteredBreakIteratorBuilderEED2Ev:
   88|    201|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_28FilteredBreakIteratorBuilderEE6orphanEv:
  141|    180|    T *orphan() {
  142|    180|        T *p=ptr;
  143|    180|        ptr=nullptr;
  144|    180|        return p;
  145|    180|    }
_ZN6icu_7816LocalPointerBaseIPKcEC2EPS2_:
   82|      5|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIPKcED2Ev:
   88|      5|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_788internal16LocalOpenPointerI10UHashtableXadL_Z14uhash_close_78EEEC2EPS2_:
  567|     38|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI10UHashtableEC2EPS1_:
   82|     38|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseI10UHashtableE8getAliasEv:
  122|  3.34k|    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_23ICULanguageBreakFactoryEEC2EPS1_R10UErrorCode:
  214|      1|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|      1|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 1]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|      1|    }
_ZN6icu_7816LocalPointerBaseINS_23ICULanguageBreakFactoryEEC2EPS1_:
   82|      1|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseINS_23ICULanguageBreakFactoryEE6orphanEv:
  141|      1|    T *orphan() {
  142|      1|        T *p=ptr;
  143|      1|        ptr=nullptr;
  144|      1|        return p;
  145|      1|    }
_ZN6icu_7812LocalPointerINS_23ICULanguageBreakFactoryEED2Ev:
  245|      1|    ~LocalPointer() {
  246|      1|        delete LocalPointerBase<T>::ptr;
  247|      1|    }
_ZN6icu_7816LocalPointerBaseINS_23ICULanguageBreakFactoryEED2Ev:
   88|      1|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_22RuleBasedBreakIterator15DictionaryCacheEEC2EPS2_R10UErrorCode:
  214|  14.7k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  14.7k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 14.7k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  14.7k|    }
_ZN6icu_7816LocalPointerBaseINS_22RuleBasedBreakIterator15DictionaryCacheEEC2EPS2_:
   82|  14.7k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_22RuleBasedBreakIterator15DictionaryCacheEED2Ev:
  245|  14.7k|    ~LocalPointer() {
  246|  14.7k|        delete LocalPointerBase<T>::ptr;
  247|  14.7k|    }
_ZN6icu_7816LocalPointerBaseINS_22RuleBasedBreakIterator15DictionaryCacheEED2Ev:
   88|  14.7k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_22RuleBasedBreakIterator10BreakCacheEEC2EPS2_R10UErrorCode:
  214|  14.7k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  14.7k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 14.7k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  14.7k|    }
_ZN6icu_7816LocalPointerBaseINS_22RuleBasedBreakIterator10BreakCacheEEC2EPS2_:
   82|  14.7k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_22RuleBasedBreakIterator10BreakCacheEED2Ev:
  245|  14.7k|    ~LocalPointer() {
  246|  14.7k|        delete LocalPointerBase<T>::ptr;
  247|  14.7k|    }
_ZN6icu_7816LocalPointerBaseINS_22RuleBasedBreakIterator10BreakCacheEED2Ev:
   88|  14.7k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_22RuleBasedBreakIterator15DictionaryCacheEE6orphanEv:
  141|  14.7k|    T *orphan() {
  142|  14.7k|        T *p=ptr;
  143|  14.7k|        ptr=nullptr;
  144|  14.7k|        return p;
  145|  14.7k|    }
_ZN6icu_7816LocalPointerBaseINS_22RuleBasedBreakIterator10BreakCacheEE6orphanEv:
  141|  14.7k|    T *orphan() {
  142|  14.7k|        T *p=ptr;
  143|  14.7k|        ptr=nullptr;
  144|  14.7k|        return p;
  145|  14.7k|    }
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEEC2EPS1_:
   82|      5|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_10UnicodeSetEED2Ev:
  245|      5|    ~LocalPointer() {
  246|      5|        delete LocalPointerBase<T>::ptr;
  247|      5|    }
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEED2Ev:
   88|      5|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEEptEv:
  134|  6.06k|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEE6orphanEv:
  141|      5|    T *orphan() {
  142|      5|        T *p=ptr;
  143|      5|        ptr=nullptr;
  144|      5|        return p;
  145|      5|    }
_ZN6icu_788internal16LocalOpenPointerI10UHashtableXadL_Z14uhash_close_78EEE12adoptInsteadEPS2_:
  595|     37|    void adoptInstead(Type *p) {
  596|     37|        if (ptr != nullptr) { closeFunction(ptr); }
  ------------------
  |  Branch (596:13): [True: 0, False: 37]
  ------------------
  597|     37|        ptr=p;
  598|     37|    }
uloc_tag.cpp:_ZN6icu_7812LocalPointerIN12_GLOBAL__N_116VariantListEntryEEC2EPS2_R10UErrorCode:
  214|  2.61k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  2.61k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 2.61k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  2.61k|    }
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_116VariantListEntryEEC2EPS2_:
   82|  5.22k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
uloc_tag.cpp:_ZNK6icu_7816LocalPointerBaseIN12_GLOBAL__N_116VariantListEntryEEptEv:
  134|  44.9k|    T *operator->() const { return ptr; }
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_116VariantListEntryEE6orphanEv:
  141|  2.59k|    T *orphan() {
  142|  2.59k|        T *p=ptr;
  143|  2.59k|        ptr=nullptr;
  144|  2.59k|        return p;
  145|  2.59k|    }
uloc_tag.cpp:_ZN6icu_7812LocalPointerIN12_GLOBAL__N_116VariantListEntryEEC2EOS3_:
  224|  2.61k|    LocalPointer(LocalPointer<T> &&src) noexcept : LocalPointerBase<T>(src.ptr) {
  225|  2.61k|        src.ptr=nullptr;
  226|  2.61k|    }
uloc_tag.cpp:_ZN6icu_7812LocalPointerIN12_GLOBAL__N_116VariantListEntryEED2Ev:
  245|  5.22k|    ~LocalPointer() {
  246|  5.22k|        delete LocalPointerBase<T>::ptr;
  247|  5.22k|    }
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_116VariantListEntryEED2Ev:
   88|  5.22k|    ~LocalPointerBase() { /* delete ptr; */ }
uloc_tag.cpp:_ZN6icu_7812LocalPointerIN12_GLOBAL__N_118ExtensionListEntryEEC2EPS2_:
  200|  3.93k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_118ExtensionListEntryEEC2EPS2_:
   82|  3.93k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
uloc_tag.cpp:_ZNK6icu_7816LocalPointerBaseIN12_GLOBAL__N_112ULanguageTagEE6isNullEv:
   94|  3.93k|    UBool isNull() const { return ptr==nullptr; }
uloc_tag.cpp:_ZNK6icu_7816LocalPointerBaseIN12_GLOBAL__N_112ULanguageTagEEptEv:
  134|  11.3k|    T *operator->() const { return ptr; }
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_112ULanguageTagEE6orphanEv:
  141|  3.93k|    T *orphan() {
  142|  3.93k|        T *p=ptr;
  143|  3.93k|        ptr=nullptr;
  144|  3.93k|        return p;
  145|  3.93k|    }
uloc_tag.cpp:_ZNK6icu_7816LocalPointerBaseIN12_GLOBAL__N_118ExtensionListEntryEE7isValidEv:
  100|  6.75k|    UBool isValid() const { return ptr!=nullptr; }
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_118ExtensionListEntryEE6orphanEv:
  141|  2.26k|    T *orphan() {
  142|  2.26k|        T *p=ptr;
  143|  2.26k|        ptr=nullptr;
  144|  2.26k|        return p;
  145|  2.26k|    }
uloc_tag.cpp:_ZNK6icu_7816LocalPointerBaseIN12_GLOBAL__N_118ExtensionListEntryEEptEv:
  134|  6.63k|    T *operator->() const { return ptr; }
uloc_tag.cpp:_ZNK6icu_7816LocalPointerBaseIN12_GLOBAL__N_118ExtensionListEntryEE8getAliasEv:
  122|  2.09k|    T *getAlias() const { return ptr; }
uloc_tag.cpp:_ZN6icu_7812LocalPointerIN12_GLOBAL__N_118ExtensionListEntryEE29adoptInsteadAndCheckErrorCodeEPS2_R10UErrorCode:
  319|  2.26k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|  2.26k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 2.26k, False: 0]
  ------------------
  321|  2.26k|            delete LocalPointerBase<T>::ptr;
  322|  2.26k|            LocalPointerBase<T>::ptr=p;
  323|  2.26k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 2.26k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|  2.26k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|  2.26k|    }
uloc_tag.cpp:_ZN6icu_7812LocalPointerIN12_GLOBAL__N_118ExtensionListEntryEED2Ev:
  245|  3.93k|    ~LocalPointer() {
  246|  3.93k|        delete LocalPointerBase<T>::ptr;
  247|  3.93k|    }
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_118ExtensionListEntryEED2Ev:
   88|  3.93k|    ~LocalPointerBase() { /* delete ptr; */ }
uloc_tag.cpp:_ZN6icu_788internal16LocalOpenPointerIN12_GLOBAL__N_112ULanguageTagEXadL_ZNS2_11ultag_closeEPS3_EEEC2ES4_:
  567|  7.87k|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_112ULanguageTagEEC2EPS2_:
   82|  7.87k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
uloc_tag.cpp:_ZN6icu_788internal16LocalOpenPointerIN12_GLOBAL__N_112ULanguageTagEXadL_ZNS2_11ultag_closeEPS3_EEED2Ev:
  575|  7.87k|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 3.93k, False: 3.93k]
  ------------------
uloc_tag.cpp:_ZN6icu_7816LocalPointerBaseIN12_GLOBAL__N_112ULanguageTagEED2Ev:
   88|  7.87k|    ~LocalPointerBase() { /* delete ptr; */ }
uloc_tag.cpp:_ZNK6icu_7816LocalPointerBaseIN12_GLOBAL__N_112ULanguageTagEE8getAliasEv:
  122|  39.4k|    T *getAlias() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleEptEv:
  134|      3|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_6UStackEEC2EPS1_R10UErrorCode:
  214|      1|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|      1|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 1]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|      1|    }
_ZN6icu_7816LocalPointerBaseINS_6UStackEEC2EPS1_:
   82|      1|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_6UStackEED2Ev:
  245|      1|    ~LocalPointer() {
  246|      1|        delete LocalPointerBase<T>::ptr;
  247|      1|    }
_ZN6icu_7816LocalPointerBaseINS_6UStackEED2Ev:
   88|      1|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_6UStackEE6orphanEv:
  141|      1|    T *orphan() {
  142|      1|        T *p=ptr;
  143|      1|        ptr=nullptr;
  144|      1|        return p;
  145|      1|    }
_ZN6icu_7812LocalPointerINS_10UnicodeSetEEC2EPS1_:
  200|      5|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEE6isNullEv:
   94|      5|    UBool isNull() const { return ptr==nullptr; }
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEE8getAliasEv:
  122|      2|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_9UVector32EEC2EPS1_:
  200|  2.19M|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_9UVector32EEC2EPS1_:
   82|  2.40M|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_9UVector32EED2Ev:
  245|  2.40M|    ~LocalPointer() {
  246|  2.40M|        delete LocalPointerBase<T>::ptr;
  247|  2.40M|    }
_ZN6icu_7816LocalPointerBaseINS_9UVector32EED2Ev:
   88|  2.40M|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_9UVector32EE29adoptInsteadAndCheckErrorCodeEPS1_R10UErrorCode:
  319|  7.66k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|  7.66k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 7.66k, False: 0]
  ------------------
  321|  7.66k|            delete LocalPointerBase<T>::ptr;
  322|  7.66k|            LocalPointerBase<T>::ptr=p;
  323|  7.66k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 7.66k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|  7.66k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|  7.66k|    }
_ZNK6icu_7816LocalPointerBaseINS_9UVector32EEptEv:
  134|   339M|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_9UVector32EEC2EPS1_R10UErrorCode:
  214|   205k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|   205k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 205k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|   205k|    }
_ZNK6icu_7816LocalPointerBaseINS_9UVector32EE7isValidEv:
  100|  83.1M|    UBool isValid() const { return ptr!=nullptr; }
_ZN6icu_7812LocalPointerINS_9UVector32EEaSEOS2_:
  255|   205k|    LocalPointer<T> &operator=(LocalPointer<T> &&src) noexcept {
  256|   205k|        delete LocalPointerBase<T>::ptr;
  257|   205k|        LocalPointerBase<T>::ptr=src.ptr;
  258|   205k|        src.ptr=nullptr;
  259|   205k|        return *this;
  260|   205k|    }

_ZNK6icu_786Locale10getCountryEv:
 1204|    717|{
 1205|    717|    return country;
 1206|    717|}
_ZNK6icu_786Locale11getLanguageEv:
 1210|  8.15k|{
 1211|  8.15k|    return language;
 1212|  8.15k|}
_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|  88.5k|{
 1229|  88.5k|    return fullName;
 1230|  88.5k|}
_ZNK6icu_786Locale15getKeywordValueINS_10CharStringEEET_NS_11StringPieceER10UErrorCode:
 1270|  3.99k|{
 1271|  3.99k|    if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (1271:9): [True: 4, False: 3.99k]
  ------------------
 1272|  3.99k|    StringClass result;
 1273|  3.99k|    StringByteSink<StringClass> sink(&result);
 1274|  3.99k|    getKeywordValue(keywordName, sink, status);
 1275|  3.99k|    return result;
 1276|  3.99k|}

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

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

_ZN6icu_7811StringPieceC2Ev:
   71|      1|  StringPiece() : ptr_(nullptr), length_(0) { }
_ZN6icu_7811StringPieceC2EPKci:
  151|  18.3k|  StringPiece(const char* offset, int32_t len) : ptr_(offset), length_(len) { }
_ZNK6icu_7811StringPiececvNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEEv:
  185|  16.3k|  inline operator std::string_view() const {
  186|  16.3k|    return {data(), static_cast<std::string_view::size_type>(size())};
  187|  16.3k|  }
_ZNK6icu_7811StringPiece4dataEv:
  200|   485k|  const char* data() const { return ptr_; }
_ZNK6icu_7811StringPiece4sizeEv:
  206|  16.3k|  int32_t size() const { return length_; }
_ZNK6icu_7811StringPiece6lengthEv:
  212|   486k|  int32_t length() const { return length_; }
_ZN6icu_7811StringPieceC2INSt3__117basic_string_viewIcNS2_11char_traitsIcEEEEvEET_:
  142|  2.07k|      : ptr_(reinterpret_cast<const char*>(str.data())),
  143|  2.07k|        length_(static_cast<int32_t>(str.size())) {}

_ZNK6icu_7810UCharsTrie8getValueEv:
  258|   106M|    inline int32_t getValue() const {
  259|   106M|        const char16_t *pos=pos_;
  260|   106M|        int32_t leadUnit=*pos++;
  261|       |        // U_ASSERT(leadUnit>=kMinValueLead);
  262|   106M|        return leadUnit&kValueIsFinal ?
  ------------------
  |  Branch (262:16): [True: 37.2M, False: 68.9M]
  ------------------
  263|  68.9M|            readValue(pos, leadUnit&0x7fff) : readNodeValue(pos, leadUnit);
  264|   106M|    }
_ZN6icu_7810UCharsTrie9readValueEPKDsi:
  420|  37.2M|    static inline int32_t readValue(const char16_t *pos, int32_t leadUnit) {
  421|  37.2M|        int32_t value;
  422|  37.2M|        if(leadUnit<kMinTwoUnitValueLead) {
  ------------------
  |  Branch (422:12): [True: 37.2M, False: 0]
  ------------------
  423|  37.2M|            value=leadUnit;
  424|  37.2M|        } else if(leadUnit<kThreeUnitValueLead) {
  ------------------
  |  Branch (424:19): [True: 0, False: 0]
  ------------------
  425|      0|            value=((leadUnit-kMinTwoUnitValueLead)<<16)|*pos;
  426|      0|        } else {
  427|      0|            value=(pos[0]<<16)|pos[1];
  428|      0|        }
  429|  37.2M|        return value;
  430|  37.2M|    }
_ZN6icu_7810UCharsTrie13readNodeValueEPKDsi:
  446|  68.9M|    static inline int32_t readNodeValue(const char16_t *pos, int32_t leadUnit) {
  447|       |        // U_ASSERT(kMinValueLead<=leadUnit && leadUnit<kValueIsFinal);
  448|  68.9M|        int32_t value;
  449|  68.9M|        if(leadUnit<kMinTwoUnitNodeValueLead) {
  ------------------
  |  Branch (449:12): [True: 68.9M, False: 0]
  ------------------
  450|  68.9M|            value=(leadUnit>>6)-1;
  451|  68.9M|        } else if(leadUnit<kThreeUnitNodeValueLead) {
  ------------------
  |  Branch (451:19): [True: 0, False: 0]
  ------------------
  452|      0|            value=(((leadUnit&0x7fc0)-kMinTwoUnitNodeValueLead)<<10)|*pos;
  453|      0|        } else {
  454|      0|            value=(pos[0]<<16)|pos[1];
  455|      0|        }
  456|  68.9M|        return value;
  457|  68.9M|    }
_ZN6icu_7810UCharsTrieC2ENS_14ConstChar16PtrE:
   70|   113M|            : ownedArray_(nullptr), uchars_(trieUChars),
   71|   113M|              pos_(uchars_), remainingMatchLength_(-1) {}
_ZN6icu_7810UCharsTrie5firstEi:
  200|   113M|    inline UStringTrieResult first(int32_t uchar) {
  201|   113M|        remainingMatchLength_=-1;
  202|   113M|        return nextImpl(uchars_, uchar);
  203|   113M|    }
_ZN6icu_7810UCharsTrieC2EPDsPKDs:
  408|     66|            : ownedArray_(adoptUChars), uchars_(trieUChars),
  409|     66|              pos_(uchars_), remainingMatchLength_(-1) {}
_ZN6icu_7810UCharsTrie4stopEv:
  414|  76.1M|    inline void stop() {
  415|  76.1M|        pos_=nullptr;
  416|  76.1M|    }
_ZN6icu_7810UCharsTrie9skipValueEPKDsi:
  431|   402M|    static inline const char16_t *skipValue(const char16_t *pos, int32_t leadUnit) {
  432|   402M|        if(leadUnit>=kMinTwoUnitValueLead) {
  ------------------
  |  Branch (432:12): [True: 43.7M, False: 358M]
  ------------------
  433|  43.7M|            if(leadUnit<kThreeUnitValueLead) {
  ------------------
  |  Branch (433:16): [True: 43.7M, False: 0]
  ------------------
  434|  43.7M|                ++pos;
  435|  43.7M|            } else {
  436|      0|                pos+=2;
  437|      0|            }
  438|  43.7M|        }
  439|   402M|        return pos;
  440|   402M|    }
_ZN6icu_7810UCharsTrie9skipValueEPKDs:
  441|   402M|    static inline const char16_t *skipValue(const char16_t *pos) {
  442|   402M|        int32_t leadUnit=*pos++;
  443|   402M|        return skipValue(pos, leadUnit&0x7fff);
  444|   402M|    }
_ZN6icu_7810UCharsTrie13skipNodeValueEPKDsi:
  458|  68.4M|    static inline const char16_t *skipNodeValue(const char16_t *pos, int32_t leadUnit) {
  459|       |        // U_ASSERT(kMinValueLead<=leadUnit && leadUnit<kValueIsFinal);
  460|  68.4M|        if(leadUnit>=kMinTwoUnitNodeValueLead) {
  ------------------
  |  Branch (460:12): [True: 0, False: 68.4M]
  ------------------
  461|      0|            if(leadUnit<kThreeUnitNodeValueLead) {
  ------------------
  |  Branch (461:16): [True: 0, False: 0]
  ------------------
  462|      0|                ++pos;
  463|      0|            } else {
  464|      0|                pos+=2;
  465|      0|            }
  466|      0|        }
  467|  68.4M|        return pos;
  468|  68.4M|    }
_ZN6icu_7810UCharsTrie11jumpByDeltaEPKDs:
  470|  1.08G|    static inline const char16_t *jumpByDelta(const char16_t *pos) {
  471|  1.08G|        int32_t delta=*pos++;
  472|  1.08G|        if(delta>=kMinTwoUnitDeltaLead) {
  ------------------
  |  Branch (472:12): [True: 444M, False: 643M]
  ------------------
  473|   444M|            if(delta==kThreeUnitDeltaLead) {
  ------------------
  |  Branch (473:16): [True: 0, False: 444M]
  ------------------
  474|      0|                delta=(pos[0]<<16)|pos[1];
  475|      0|                pos+=2;
  476|   444M|            } else {
  477|   444M|                delta=((delta-kMinTwoUnitDeltaLead)<<16)|*pos++;
  478|   444M|            }
  479|   444M|        }
  480|  1.08G|        return pos+delta;
  481|  1.08G|    }
_ZN6icu_7810UCharsTrie9skipDeltaEPKDs:
  483|   599M|    static const char16_t *skipDelta(const char16_t *pos) {
  484|   599M|        int32_t delta=*pos++;
  485|   599M|        if(delta>=kMinTwoUnitDeltaLead) {
  ------------------
  |  Branch (485:12): [True: 91.0M, False: 508M]
  ------------------
  486|  91.0M|            if(delta==kThreeUnitDeltaLead) {
  ------------------
  |  Branch (486:16): [True: 0, False: 91.0M]
  ------------------
  487|      0|                pos+=2;
  488|  91.0M|            } else {
  489|  91.0M|                ++pos;
  490|  91.0M|            }
  491|  91.0M|        }
  492|   599M|        return pos;
  493|   599M|    }
_ZN6icu_7810UCharsTrie11valueResultEi:
  495|  91.9M|    static inline UStringTrieResult valueResult(int32_t node) {
  496|  91.9M|        return static_cast<UStringTrieResult>(USTRINGTRIE_INTERMEDIATE_VALUE - (node >> 15));
  497|  91.9M|    }

_ZNK6icu_7817UCharsTrieBuilder31getMaxBranchLinearSubNodeLengthEv:
  153|  2.64k|    virtual int32_t getMaxBranchLinearSubNodeLength() const override { return UCharsTrie::kMaxBranchLinearSubNodeLength; }
_ZNK6icu_7817UCharsTrieBuilder17getMinLinearMatchEv:
  154|  4.91k|    virtual int32_t getMinLinearMatch() const override { return UCharsTrie::kMinLinearMatch; }
_ZNK6icu_7817UCharsTrieBuilder23getMaxLinearMatchLengthEv:
  155|  3.47k|    virtual int32_t getMaxLinearMatchLength() const override { return UCharsTrie::kMaxLinearMatchLength; }

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

_ZNK6icu_7813UnicodeString8doEqualsERKS0_i:
 3773|   132k|  inline UBool doEquals(const UnicodeString &text, int32_t len) const {
 3774|   132k|    return doEquals(text.getArrayStart(), len);
 3775|   132k|  }
_ZNK6icu_7813UnicodeString8pinIndexERi:
 4138|    148|{
 4139|       |  // pin index
 4140|    148|  if(start < 0) {
  ------------------
  |  Branch (4140:6): [True: 0, False: 148]
  ------------------
 4141|      0|    start = 0;
 4142|    148|  } else if(start > length()) {
  ------------------
  |  Branch (4142:13): [True: 0, False: 148]
  ------------------
 4143|      0|    start = length();
 4144|      0|  }
 4145|    148|}
_ZNK6icu_7813UnicodeString10pinIndicesERiS1_:
 4150|  25.9M|{
 4151|       |  // pin indices
 4152|  25.9M|  int32_t len = length();
 4153|  25.9M|  if(start < 0) {
  ------------------
  |  Branch (4153:6): [True: 0, False: 25.9M]
  ------------------
 4154|      0|    start = 0;
 4155|  25.9M|  } else if(start > len) {
  ------------------
  |  Branch (4155:13): [True: 0, False: 25.9M]
  ------------------
 4156|      0|    start = len;
 4157|      0|  }
 4158|  25.9M|  if(_length < 0) {
  ------------------
  |  Branch (4158:6): [True: 0, False: 25.9M]
  ------------------
 4159|      0|    _length = 0;
 4160|  25.9M|  } else if(_length > (len - start)) {
  ------------------
  |  Branch (4160:13): [True: 2.20M, False: 23.7M]
  ------------------
 4161|  2.20M|    _length = (len - start);
 4162|  2.20M|  }
 4163|  25.9M|}
_ZN6icu_7813UnicodeString13getArrayStartEv:
 4166|  75.7M|UnicodeString::getArrayStart() {
 4167|  75.7M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4167:10): [True: 49.3M, False: 26.4M]
  ------------------
 4168|  49.3M|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4169|  75.7M|}
_ZNK6icu_7813UnicodeString13getArrayStartEv:
 4172|   452M|UnicodeString::getArrayStart() const {
 4173|   452M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4173:10): [True: 26.6M, False: 425M]
  ------------------
 4174|   425M|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4175|   452M|}
_ZNK6icu_7813UnicodeString14hasShortLengthEv:
 4202|   819M|UnicodeString::hasShortLength() const {
 4203|   819M|  return fUnion.fFields.fLengthAndFlags>=0;
 4204|   819M|}
_ZNK6icu_7813UnicodeString14getShortLengthEv:
 4207|   205M|UnicodeString::getShortLength() const {
 4208|       |  // fLengthAndFlags must be non-negative -> short length >= 0
 4209|       |  // and arithmetic or logical shift does not matter.
 4210|   205M|  return fUnion.fFields.fLengthAndFlags>>kLengthShift;
 4211|   205M|}
_ZNK6icu_7813UnicodeString6lengthEv:
 4214|   819M|UnicodeString::length() const {
 4215|   819M|  return hasShortLength() ? getShortLength() : fUnion.fFields.fLength;
  ------------------
  |  Branch (4215:10): [True: 204M, False: 614M]
  ------------------
 4216|   819M|}
_ZNK6icu_7813UnicodeString11getCapacityEv:
 4219|   126M|UnicodeString::getCapacity() const {
 4220|   126M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4220:10): [True: 99.4M, False: 27.1M]
  ------------------
 4221|  99.4M|    US_STACKBUF_SIZE : fUnion.fFields.fCapacity;
 4222|   126M|}
_ZNK6icu_7813UnicodeString8hashCodeEv:
 4226|    605|{ return doHashCode(); }
_ZNK6icu_7813UnicodeString7isBogusEv:
 4230|  50.0M|{ return fUnion.fFields.fLengthAndFlags & kIsBogus; }
_ZNK6icu_7813UnicodeString10isWritableEv:
 4234|  75.6M|{ return !(fUnion.fFields.fLengthAndFlags & (kOpenGetBuffer | kIsBogus)); }
_ZNK6icu_7813UnicodeString16isBufferWritableEv:
 4238|  50.1M|{
 4239|  50.1M|  return
 4240|  50.1M|      !(fUnion.fFields.fLengthAndFlags&(kOpenGetBuffer|kIsBogus|kBufferIsReadonly)) &&
  ------------------
  |  Branch (4240:7): [True: 50.1M, False: 0]
  ------------------
 4241|  50.1M|      (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1);
  ------------------
  |  Branch (4241:8): [True: 24.3M, False: 25.8M]
  |  Branch (4241:57): [True: 25.8M, False: 0]
  ------------------
 4242|  50.1M|}
_ZNK6icu_7813UnicodeString9getBufferEv:
 4245|  27.6M|UnicodeString::getBuffer() const {
 4246|  27.6M|  if(fUnion.fFields.fLengthAndFlags&(kIsBogus|kOpenGetBuffer)) {
  ------------------
  |  Branch (4246:6): [True: 0, False: 27.6M]
  ------------------
 4247|      0|    return nullptr;
 4248|  27.6M|  } else if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) {
  ------------------
  |  Branch (4248:13): [True: 22.9M, False: 4.69M]
  ------------------
 4249|  22.9M|    return fUnion.fStackFields.fBuffer;
 4250|  22.9M|  } else {
 4251|  4.69M|    return fUnion.fFields.fArray;
 4252|  4.69M|  }
 4253|  27.6M|}
_ZNK6icu_7813UnicodeString9doCompareEiiRKS0_ii:
 4264|   252k|{
 4265|   252k|  if(srcText.isBogus()) {
  ------------------
  |  Branch (4265:6): [True: 0, False: 252k]
  ------------------
 4266|      0|    return static_cast<int8_t>(!isBogus()); // 0 if both are bogus, 1 otherwise
 4267|   252k|  } else {
 4268|   252k|    srcText.pinIndices(srcStart, srcLength);
 4269|   252k|    return doCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
 4270|   252k|  }
 4271|   252k|}
_ZNK6icu_7813UnicodeStringeqERKS0_:
 4290|   475k|{
 4291|   475k|  if(isBogus()) {
  ------------------
  |  Branch (4291:6): [True: 0, False: 475k]
  ------------------
 4292|      0|    return text.isBogus();
 4293|   475k|  } else {
 4294|   475k|    int32_t len = length(), textLength = text.length();
 4295|   475k|    return !text.isBogus() && len == textLength && doEquals(text, len);
  ------------------
  |  Branch (4295:12): [True: 475k, False: 0]
  |  Branch (4295:31): [True: 132k, False: 343k]
  |  Branch (4295:52): [True: 1, False: 132k]
  ------------------
 4296|   475k|  }
 4297|   475k|}
_ZNK6icu_7813UnicodeString7compareERKS0_:
 4321|  73.7k|{ return doCompare(0, length(), text, 0, text.length()); }
_ZNK6icu_7813UnicodeString7compareEiiRKS0_ii:
 4340|   178k|{ return doCompare(start, _length, srcText, srcStart, srcLength); }
_ZNK6icu_7813UnicodeString7indexOfEPKDsii:
 4536|     33|               int32_t start) const {
 4537|     33|  pinIndex(start);
 4538|     33|  return indexOf(srcChars, 0, srcLength, start, length() - start);
 4539|     33|}
_ZNK6icu_7813UnicodeString7indexOfEDs:
 4562|  4.68k|{ return doIndexOf(c, 0, length()); }
_ZNK6icu_7813UnicodeString7indexOfEDsi:
 4570|     33|               int32_t start) const {
 4571|     33|  pinIndex(start);
 4572|     33|  return doIndexOf(c, start, length() - start);
 4573|     33|}
_ZN6icu_7813UnicodeString7replaceEiiRKS0_ii:
 4741|     81|{ return doReplace(start, _length, srcText, srcStart, srcLength); }
_ZNK6icu_7813UnicodeString9doExtractEiiRS0_:
 4799|     81|{ target.replace(0, target.length(), *this, start, _length); }
_ZNK6icu_7813UnicodeString7extractEiiRS0_:
 4812|     40|{ doExtract(start, _length, target); }
_ZNK6icu_7813UnicodeString8doCharAtEi:
 4846|   166k|{
 4847|   166k|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(length())) {
  ------------------
  |  Branch (4847:7): [True: 166k, False: 0]
  ------------------
 4848|   166k|    return getArrayStart()[offset];
 4849|   166k|  } else {
 4850|      0|    return kInvalidUChar;
 4851|      0|  }
 4852|   166k|}
_ZNK6icu_7813UnicodeString6charAtEi:
 4856|    134|{ return doCharAt(offset); }
_ZNK6icu_7813UnicodeStringixEi:
 4860|   166k|{ return doCharAt(offset); }
_ZNK6icu_7813UnicodeString7isEmptyEv:
 4863|  16.8k|UnicodeString::isEmpty() const {
 4864|       |  // Arithmetic or logical right shift does not matter: only testing for 0.
 4865|  16.8k|  return (fUnion.fFields.fLengthAndFlags>>kLengthShift) == 0;
 4866|  16.8k|}
_ZN6icu_7813UnicodeString13setZeroLengthEv:
 4872|  71.7M|UnicodeString::setZeroLength() {
 4873|  71.7M|  fUnion.fFields.fLengthAndFlags &= kAllStorageFlags;
 4874|  71.7M|}
_ZN6icu_7813UnicodeString14setShortLengthEi:
 4877|  54.4M|UnicodeString::setShortLength(int32_t len) {
 4878|       |  // requires 0 <= len <= kMaxShortLength
 4879|  54.4M|  fUnion.fFields.fLengthAndFlags =
 4880|  54.4M|    static_cast<int16_t>((fUnion.fFields.fLengthAndFlags & kAllStorageFlags) | (len << kLengthShift));
 4881|  54.4M|}
_ZN6icu_7813UnicodeString9setLengthEi:
 4884|  77.9M|UnicodeString::setLength(int32_t len) {
 4885|  77.9M|  if(len <= kMaxShortLength) {
  ------------------
  |  Branch (4885:6): [True: 54.4M, False: 23.5M]
  ------------------
 4886|  54.4M|    setShortLength(len);
 4887|  54.4M|  } else {
 4888|  23.5M|    fUnion.fFields.fLengthAndFlags |= kLengthIsLarge;
 4889|  23.5M|    fUnion.fFields.fLength = len;
 4890|  23.5M|  }
 4891|  77.9M|}
_ZN6icu_7813UnicodeString8setArrayEPDsii:
 4899|  2.29M|UnicodeString::setArray(char16_t *array, int32_t len, int32_t capacity) {
 4900|  2.29M|  setLength(len);
 4901|  2.29M|  fUnion.fFields.fArray = array;
 4902|  2.29M|  fUnion.fFields.fCapacity = capacity;
 4903|  2.29M|}
_ZN6icu_7813UnicodeString5setToERKS0_ii:
 4917|    988|{
 4918|    988|  unBogus();
 4919|    988|  return doReplace(0, length(), srcText, srcStart, srcLength);
 4920|    988|}
_ZN6icu_7813UnicodeString6appendERKS0_ii:
 4963|     33|{ return doAppend(srcText, srcStart, srcLength); }
_ZN6icu_7813UnicodeString6appendERKS0_:
 4967|  23.1M|{ return doAppend(srcText, 0, srcText.length()); }
_ZN6icu_7813UnicodeString6appendEDs:
 4982|  5.20k|{ return doAppend(&srcChar, 0, 1); }
_ZN6icu_7813UnicodeString6removeEv:
 5035|  46.3M|{
 5036|       |  // remove() of a bogus string makes the string empty and non-bogus
 5037|  46.3M|  if(isBogus()) {
  ------------------
  |  Branch (5037:6): [True: 0, False: 46.3M]
  ------------------
 5038|      0|    setToEmpty();
 5039|  46.3M|  } else {
 5040|  46.3M|    setZeroLength();
 5041|  46.3M|  }
 5042|  46.3M|  return *this;
 5043|  46.3M|}
_ZN6icu_7813UnicodeString7reverseEv:
 5084|  3.96k|{ return doReverse(0, length()); }
_ZN6icu_7813UnicodeStringC2Ev:
 4182|  5.05M|UnicodeString::UnicodeString() {
 4183|  5.05M|  fUnion.fStackFields.fLengthAndFlags=kShortString;
 4184|  5.05M|}
_ZN6icu_7813UnicodeStringC2IA28_DsvEERKT_:
 3274|      4|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      4|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      4|    doAppend(internal::toU16StringViewNullable(text));
 3277|      4|  }
_ZN6icu_7813UnicodeStringC2IA34_DsvEERKT_:
 3274|      4|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      4|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      4|    doAppend(internal::toU16StringViewNullable(text));
 3277|      4|  }
_ZN6icu_7813UnicodeStringC2IA16_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_7813UnicodeStringC2IA35_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_7813UnicodeStringC2IA33_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_7813UnicodeStringC2IA58_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_7813UnicodeStringC2IA13_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_7826ures_getUnicodeStringByKeyEPK15UResourceBundlePKcP10UErrorCode:
  883|      4|ures_getUnicodeStringByKey(const UResourceBundle *resB, const char* key, UErrorCode* status) {
  884|      4|    UnicodeString result;
  885|      4|    int32_t len = 0;
  886|      4|    const char16_t* r = ConstChar16Ptr(ures_getStringByKey(resB, key, &len, status));
  ------------------
  |  | 1677|      4|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  887|      4|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (887:8): [True: 2, False: 2]
  ------------------
  888|      2|        result.setTo(true, r, len);
  889|      2|    } else {
  890|      2|        result.setToBogus();
  891|      2|    }
  892|      4|    return result;
  893|      4|}
_ZN6icu_7821ures_getUnicodeStringEPK15UResourceBundleP10UErrorCode:
  813|  6.48k|ures_getUnicodeString(const UResourceBundle *resB, UErrorCode* status) {
  814|  6.48k|    UnicodeString result;
  815|  6.48k|    int32_t len = 0;
  816|  6.48k|    const char16_t *r = ConstChar16Ptr(ures_getString(resB, &len, status));
  ------------------
  |  | 1675|  6.48k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  6.48k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.48k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.48k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|  6.48k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (817:8): [True: 6.48k, False: 0]
  ------------------
  818|  6.48k|        result.setTo(true, r, len);
  819|  6.48k|    } else {
  820|      0|        result.setToBogus();
  821|      0|    }
  822|  6.48k|    return result;
  823|  6.48k|}

_ZNK6icu_7818UnicodeSetIterator12getCodepointEv:
  310|    381|inline UChar32 UnicodeSetIterator::getCodepoint() const {
  311|    381|    return codepoint;
  312|    381|}

break_iterator_fuzzer.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  7.39k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
numsys.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      4|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
brkiter.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.65M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
brkiter.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  50.5k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
bytesinkutil.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  81.7k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
charstr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  35.5M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
filteredbrk.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  17.7k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
filteredbrk.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  16.9k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locavailable.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.66k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locbased.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  44.9k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locid.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  71.8k|    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; }
putil.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      4|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
putil.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      2|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
rbbi.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   177k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
rbbi.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|    687|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
rbbi_cache.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  5.12M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
rbbidata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  44.2k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uchar.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  69.3M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucharstriebuilder.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  10.4k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucharstriebuilder.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  5.23k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ucptrie.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.7k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
udata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   185k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
udata.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  70.7k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
udatamem.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.7k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uhash.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  19.0k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uloc.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   522k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uloc.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  5.58k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uloc_keytype.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  4.93M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uloc_keytype.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  78.6k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uloc_tag.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.78M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uloc_tag.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  6.51k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uniset_props.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  81.4k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uniset_props.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|     66|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
unistr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.7k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.30M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   144k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uresdata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.0k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ustring.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  23.2k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ustrtrns.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.7k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
utext.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.27M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
utext.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  8.83M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uvector.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  17.2k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uvector.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|    717|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uvectr32.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   172k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
brkeng.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   341k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
brkeng.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   121k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
characterproperties.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   121k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
characterproperties.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      1|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
dictbe.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   101M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dictbe.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  9.08M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
loadednormalizer2impl.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      6|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
lstmbe.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      6|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
normalizer2.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  25.3M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
normalizer2impl.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  13.5M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
resbund.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      1|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ruleiter.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    182|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uarrsort.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  3.28k|    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_7814UnicodeMatcherD2Ev:
   23|    701|UnicodeMatcher::~UnicodeMatcher() {}
_ZN6icu_7813UnicodeFilterD2Ev:
   25|    701|UnicodeFilter::~UnicodeFilter() {}

_ZN6icu_7814UnicodeFunctorD2Ev:
   16|    701|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|     33|UBool UnicodeSet::hasStrings() const {
  121|     33|    return strings_ != nullptr && !strings_->isEmpty();
  ------------------
  |  Branch (121:12): [True: 0, False: 33]
  |  Branch (121:35): [True: 0, False: 0]
  ------------------
  122|     33|}
_ZNK6icu_7810UnicodeSet11stringsSizeEv:
  124|      1|int32_t UnicodeSet::stringsSize() const {
  125|      1|    return strings_ == nullptr ? 0 : strings_->size();
  ------------------
  |  Branch (125:12): [True: 1, False: 0]
  ------------------
  126|      1|}
_ZN6icu_7810UnicodeSetC2Ev:
  139|    720|UnicodeSet::UnicodeSet() {
  140|    720|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|    720|#define UNICODESET_HIGH 0x0110000
  ------------------
  141|    720|    _dbgct(this);
  142|    720|}
_ZN6icu_7810UnicodeSetC2Eii:
  151|      2|UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) {
  152|      2|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|      2|#define UNICODESET_HIGH 0x0110000
  ------------------
  153|      2|    add(start, end);
  154|      2|    _dbgct(this);
  155|      2|}
_ZN6icu_7810UnicodeSetD2Ev:
  189|    701|UnicodeSet::~UnicodeSet() {
  190|    701|    _dbgdt(this); // first!
  191|    701|    if (list != stackList) {
  ------------------
  |  Branch (191:9): [True: 478, False: 223]
  ------------------
  192|    478|        uprv_free(list);
  ------------------
  |  | 1503|    478|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    478|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    478|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    478|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|    478|    }
  194|    701|    delete bmpSet;
  195|    701|    if (buffer != stackList) {
  ------------------
  |  Branch (195:9): [True: 701, False: 0]
  ------------------
  196|    701|        uprv_free(buffer);
  ------------------
  |  | 1503|    701|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    701|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    701|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    701|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|    701|    }
  198|    701|    delete strings_;
  199|    701|    delete stringSpan;
  200|    701|    releasePattern();
  201|    701|}
_ZN6icu_7810UnicodeSetaSERKS0_:
  206|      9|UnicodeSet& UnicodeSet::operator=(const UnicodeSet& o) {
  207|      9|    return copyFrom(o, false);
  208|      9|}
_ZN6icu_7810UnicodeSet8copyFromERKS0_a:
  210|     10|UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) {
  211|     10|    if (this == &o) {
  ------------------
  |  Branch (211:9): [True: 0, False: 10]
  ------------------
  212|      0|        return *this;
  213|      0|    }
  214|     10|    if (isFrozen()) {
  ------------------
  |  Branch (214:9): [True: 0, False: 10]
  ------------------
  215|      0|        return *this;
  216|      0|    }
  217|     10|    if (o.isBogus()) {
  ------------------
  |  Branch (217:9): [True: 0, False: 10]
  ------------------
  218|      0|        setToBogus();
  219|      0|        return *this;
  220|      0|    }
  221|     10|    if (!ensureCapacity(o.len)) {
  ------------------
  |  Branch (221:9): [True: 0, False: 10]
  ------------------
  222|       |        // ensureCapacity will mark the UnicodeSet as Bogus if OOM failure happens.
  223|      0|        return *this;
  224|      0|    }
  225|     10|    len = o.len;
  226|     10|    uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32));
  ------------------
  |  |   42|     10|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     10|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     10|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     10|    _Pragma("clang diagnostic push") \
  |  |   45|     10|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     10|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     10|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     10|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     10|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     10|    _Pragma("clang diagnostic pop") \
  |  |   49|     10|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     10|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     10|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|     10|    if (o.bmpSet != nullptr && !asThawed) {
  ------------------
  |  Branch (227:9): [True: 1, False: 9]
  |  Branch (227:32): [True: 0, False: 1]
  ------------------
  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|     10|    if (o.hasStrings()) {
  ------------------
  |  Branch (234:9): [True: 0, False: 10]
  ------------------
  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|     10|    } else if (hasStrings()) {
  ------------------
  |  Branch (241:16): [True: 0, False: 10]
  ------------------
  242|      0|        strings_->removeAllElements();
  243|      0|    }
  244|     10|    if (o.stringSpan != nullptr && !asThawed) {
  ------------------
  |  Branch (244:9): [True: 0, False: 10]
  |  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|     10|    releasePattern();
  252|     10|    if (o.pat) {
  ------------------
  |  Branch (252:9): [True: 8, False: 2]
  ------------------
  253|      8|        setPattern(o.pat, o.patLen);
  254|      8|    }
  255|     10|    return *this;
  256|     10|}
_ZNK6icu_7810UnicodeSet8containsEi:
  340|   150M|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|   150M|    if (bmpSet != nullptr) {
  ------------------
  |  Branch (348:9): [True: 0, False: 150M]
  ------------------
  349|      0|        return bmpSet->contains(c);
  350|      0|    }
  351|   150M|    if (stringSpan != nullptr) {
  ------------------
  |  Branch (351:9): [True: 0, False: 150M]
  ------------------
  352|      0|        return stringSpan->contains(c);
  353|      0|    }
  354|   150M|    if (c >= UNICODESET_HIGH) { // Don't need to check LOW bound
  ------------------
  |  |   34|   150M|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (354:9): [True: 0, False: 150M]
  ------------------
  355|      0|        return false;
  356|      0|    }
  357|   150M|    int32_t i = findCodePoint(c);
  358|   150M|    return i & 1; // return true if odd
  359|   150M|}
_ZNK6icu_7810UnicodeSet13findCodePointEi:
  370|   151M|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|   151M|    if (c < list[0])
  ------------------
  |  Branch (383:9): [True: 75.2M, False: 75.8M]
  ------------------
  384|  75.2M|        return 0;
  385|       |    // High runner test.  c is often after the last range, so an
  386|       |    // initial check for this condition pays off.
  387|  75.8M|    int32_t lo = 0;
  388|  75.8M|    int32_t hi = len - 1;
  389|  75.8M|    if (lo >= hi || c >= list[hi-1])
  ------------------
  |  Branch (389:9): [True: 0, False: 75.8M]
  |  Branch (389:21): [True: 3.82M, False: 72.0M]
  ------------------
  390|  3.82M|        return hi;
  391|       |    // invariant: c >= list[lo]
  392|       |    // invariant: c < list[hi]
  393|   438M|    for (;;) {
  394|   438M|        int32_t i = (lo + hi) >> 1;
  395|   438M|        if (i == lo) {
  ------------------
  |  Branch (395:13): [True: 72.0M, False: 366M]
  ------------------
  396|  72.0M|            break; // Found!
  397|   366M|        } else if (c < list[i]) {
  ------------------
  |  Branch (397:20): [True: 200M, False: 165M]
  ------------------
  398|   200M|            hi = i;
  399|   200M|        } else {
  400|   165M|            lo = i;
  401|   165M|        }
  402|   438M|    }
  403|  72.0M|    return hi;
  404|  75.8M|}
_ZN6icu_7810UnicodeSet3addEii:
  765|   742k|UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) {
  766|   742k|    if (pinCodePoint(start) < pinCodePoint(end)) {
  ------------------
  |  Branch (766:9): [True: 651k, False: 90.1k]
  ------------------
  767|   651k|        UChar32 limit = end + 1;
  768|       |        // Fast path for adding a new range after the last one.
  769|       |        // Odd list length: [..., lastStart, lastLimit, HIGH]
  770|   651k|        if ((len & 1) != 0) {
  ------------------
  |  Branch (770:13): [True: 651k, False: 0]
  ------------------
  771|       |            // If the list is empty, set lastLimit low enough to not be adjacent to 0.
  772|   651k|            UChar32 lastLimit = len == 1 ? -2 : list[len - 2];
  ------------------
  |  Branch (772:33): [True: 40.5k, False: 611k]
  ------------------
  773|   651k|            if (lastLimit <= start && !isFrozen() && !isBogus()) {
  ------------------
  |  Branch (773:17): [True: 651k, False: 1]
  |  Branch (773:39): [True: 651k, False: 0]
  |  Branch (773:54): [True: 651k, False: 0]
  ------------------
  774|   651k|                if (lastLimit == start) {
  ------------------
  |  Branch (774:21): [True: 0, False: 651k]
  ------------------
  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|   651k|                } else {
  781|   651k|                    list[len - 1] = start;
  782|   651k|                    if (limit < UNICODESET_HIGH) {
  ------------------
  |  |   34|   651k|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (782:25): [True: 651k, False: 0]
  ------------------
  783|   651k|                        if (ensureCapacity(len + 2)) {
  ------------------
  |  Branch (783:29): [True: 651k, False: 0]
  ------------------
  784|   651k|                            list[len++] = limit;
  785|   651k|                            list[len++] = UNICODESET_HIGH;
  ------------------
  |  |   34|   651k|#define UNICODESET_HIGH 0x0110000
  ------------------
  786|   651k|                        }
  787|   651k|                    } else {  // limit == UNICODESET_HIGH
  788|      0|                        if (ensureCapacity(len + 1)) {
  ------------------
  |  Branch (788:29): [True: 0, False: 0]
  ------------------
  789|      0|                            list[len++] = UNICODESET_HIGH;
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  790|      0|                        }
  791|      0|                    }
  792|   651k|                }
  793|   651k|                releasePattern();
  794|   651k|                return *this;
  795|   651k|            }
  796|   651k|        }
  797|       |        // This is slow. Could be much faster using findCodePoint(start)
  798|       |        // and modifying the list, dealing with adjacent & overlapping ranges.
  799|      1|        UChar32 range[3] = { start, limit, UNICODESET_HIGH };
  ------------------
  |  |   34|      1|#define UNICODESET_HIGH 0x0110000
  ------------------
  800|      1|        add(range, 2, 0);
  801|  90.1k|    } else if (start == end) {
  ------------------
  |  Branch (801:16): [True: 90.1k, False: 0]
  ------------------
  802|  90.1k|        add(start);
  803|  90.1k|    }
  804|  90.1k|    return *this;
  805|   742k|}
_ZN6icu_7810UnicodeSet3addEi:
  833|   108k|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|   108k|    int32_t i = findCodePoint(pinCodePoint(c));
  838|       |
  839|       |    // already in set?
  840|   108k|    if ((i & 1) != 0  || isFrozen() || isBogus()) return *this;
  ------------------
  |  Branch (840:9): [True: 21, False: 108k]
  |  Branch (840:26): [True: 0, False: 108k]
  |  Branch (840:40): [True: 0, False: 108k]
  ------------------
  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|   108k|    if (c == list[i]-1) {
  ------------------
  |  Branch (863:9): [True: 4, False: 108k]
  ------------------
  864|       |        // c is before start of next range
  865|      4|        list[i] = c;
  866|       |        // if we touched the HIGH mark, then add a new one
  867|      4|        if (c == (UNICODESET_HIGH - 1)) {
  ------------------
  |  |   34|      4|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (867:13): [True: 0, False: 4]
  ------------------
  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|      4|        if (i > 0 && c == list[i-1]) {
  ------------------
  |  Branch (874:13): [True: 4, False: 0]
  |  Branch (874:22): [True: 1, False: 3]
  ------------------
  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|      1|            UChar32* dst = list + i - 1;
  885|      1|            UChar32* src = dst + 2;
  886|      1|            UChar32* srclimit = list + len;
  887|     43|            while (src < srclimit) *(dst++) = *(src++);
  ------------------
  |  Branch (887:20): [True: 42, False: 1]
  ------------------
  888|       |
  889|      1|            len -= 2;
  890|      1|        }
  891|      4|    }
  892|       |
  893|   108k|    else if (i > 0 && c == list[i-1]) {
  ------------------
  |  Branch (893:14): [True: 108k, False: 15]
  |  Branch (893:23): [True: 9.91k, False: 98.6k]
  ------------------
  894|       |        // c is after end of prior range
  895|  9.91k|        list[i-1]++;
  896|       |        // no need to check for collapse here
  897|  9.91k|    }
  898|       |
  899|  98.7k|    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|  98.7k|        if (!ensureCapacity(len+2)) {
  ------------------
  |  Branch (912:13): [True: 0, False: 98.7k]
  ------------------
  913|       |            // ensureCapacity will mark the object as Bogus if OOM failure happens.
  914|      0|            return *this;
  915|      0|        }
  916|       |
  917|  98.7k|        UChar32 *p = list + i;
  918|  98.7k|        uprv_memmove(p + 2, p, (len - i) * sizeof(*p));
  ------------------
  |  |   51|  98.7k|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  98.7k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|  98.7k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|  98.7k|    _Pragma("clang diagnostic push") \
  |  |   54|  98.7k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|  98.7k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  98.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|  98.7k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  98.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|  98.7k|    _Pragma("clang diagnostic pop") \
  |  |   58|  98.7k|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  98.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|  98.7k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  98.7k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|  98.7k|        list[i] = c;
  920|  98.7k|        list[i+1] = c+1;
  921|  98.7k|        len += 2;
  922|  98.7k|    }
  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|   108k|    releasePattern();
  938|   108k|    return *this;
  939|   108k|}
_ZN6icu_7810UnicodeSet6removeEii:
 1151|      4|UnicodeSet& UnicodeSet::remove(UChar32 start, UChar32 end) {
 1152|      4|    if (pinCodePoint(start) <= pinCodePoint(end)) {
  ------------------
  |  Branch (1152:9): [True: 4, False: 0]
  ------------------
 1153|      4|        UChar32 range[3] = { start, end+1, UNICODESET_HIGH };
  ------------------
  |  |   34|      4|#define UNICODESET_HIGH 0x0110000
  ------------------
 1154|      4|        retain(range, 2, 2);
 1155|      4|    }
 1156|      4|    return *this;
 1157|      4|}
_ZN6icu_7810UnicodeSet6removeEi:
 1164|      2|UnicodeSet& UnicodeSet::remove(UChar32 c) {
 1165|      2|    return remove(c, c);
 1166|      2|}
_ZN6icu_7810UnicodeSet6addAllERKS0_:
 1272|     20|UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) {
 1273|     20|    if ( c.len>0 && c.list!=nullptr ) {
  ------------------
  |  Branch (1273:10): [True: 20, False: 0]
  |  Branch (1273:21): [True: 20, False: 0]
  ------------------
 1274|     20|        add(c.list, c.len, 0);
 1275|     20|    }
 1276|       |
 1277|       |    // Add strings in order
 1278|     20|    if ( c.strings_!=nullptr ) {
  ------------------
  |  Branch (1278:10): [True: 0, False: 20]
  ------------------
 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|     20|    return *this;
 1287|     20|}
_ZN6icu_7810UnicodeSet9retainAllERKS0_:
 1298|     12|UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) {
 1299|     12|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (1299:9): [True: 0, False: 12]
  |  Branch (1299:23): [True: 0, False: 12]
  ------------------
 1300|      0|        return *this;
 1301|      0|    }
 1302|     12|    retain(c.list, c.len, 0);
 1303|     12|    if (hasStrings()) {
  ------------------
  |  Branch (1303:9): [True: 0, False: 12]
  ------------------
 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|     12|    return *this;
 1311|     12|}
_ZN6icu_7810UnicodeSet5clearEv:
 1362|  40.6k|UnicodeSet& UnicodeSet::clear() {
 1363|  40.6k|    if (isFrozen()) {
  ------------------
  |  Branch (1363:9): [True: 0, False: 40.6k]
  ------------------
 1364|      0|        return *this;
 1365|      0|    }
 1366|  40.6k|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|  40.6k|#define UNICODESET_HIGH 0x0110000
  ------------------
 1367|  40.6k|    len = 1;
 1368|  40.6k|    releasePattern();
 1369|  40.6k|    if (strings_ != nullptr) {
  ------------------
  |  Branch (1369:9): [True: 0, False: 40.6k]
  ------------------
 1370|      0|        strings_->removeAllElements();
 1371|      0|    }
 1372|       |    // Remove bogus
 1373|  40.6k|    fFlags = 0;
 1374|  40.6k|    return *this;
 1375|  40.6k|}
_ZNK6icu_7810UnicodeSet13getRangeCountEv:
 1383|  40.5k|int32_t UnicodeSet::getRangeCount() const {
 1384|  40.5k|    return len/2;
 1385|  40.5k|}
_ZNK6icu_7810UnicodeSet13getRangeStartEi:
 1393|  53.5M|UChar32 UnicodeSet::getRangeStart(int32_t index) const {
 1394|  53.5M|    return list[index*2];
 1395|  53.5M|}
_ZNK6icu_7810UnicodeSet11getRangeEndEi:
 1403|  53.5M|UChar32 UnicodeSet::getRangeEnd(int32_t index) const {
 1404|  53.5M|    return list[index*2 + 1] - 1;
 1405|  53.5M|}
_ZN6icu_7810UnicodeSet7compactEv:
 1415|     27|UnicodeSet& UnicodeSet::compact() {
 1416|     27|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (1416:9): [True: 0, False: 27]
  |  Branch (1416:23): [True: 0, False: 27]
  ------------------
 1417|      0|        return *this;
 1418|      0|    }
 1419|       |    // Delete buffer first to defragment memory less.
 1420|     27|    if (buffer != stackList) {
  ------------------
  |  Branch (1420:9): [True: 24, False: 3]
  ------------------
 1421|     24|        uprv_free(buffer);
  ------------------
  |  | 1503|     24|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     24|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     24|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     24|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1422|     24|        buffer = nullptr;
 1423|     24|        bufferCapacity = 0;
 1424|     24|    }
 1425|     27|    if (list == stackList) {
  ------------------
  |  Branch (1425:9): [True: 11, False: 16]
  ------------------
 1426|       |        // pass
 1427|     16|    } else if (len <= INITIAL_CAPACITY) {
  ------------------
  |  Branch (1427:16): [True: 8, False: 8]
  ------------------
 1428|      8|        uprv_memcpy(stackList, list, len * sizeof(UChar32));
  ------------------
  |  |   42|      8|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      8|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      8|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      8|    _Pragma("clang diagnostic push") \
  |  |   45|      8|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      8|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      8|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      8|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      8|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      8|    _Pragma("clang diagnostic pop") \
  |  |   49|      8|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      8|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      8|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      8|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1429|      8|        uprv_free(list);
  ------------------
  |  | 1503|      8|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1430|      8|        list = stackList;
 1431|      8|        capacity = INITIAL_CAPACITY;
 1432|      8|    } else if ((len + 7) < capacity) {
  ------------------
  |  Branch (1432:16): [True: 8, False: 0]
  ------------------
 1433|       |        // If we have more than a little unused capacity, shrink it to len.
 1434|      8|        UChar32* temp = static_cast<UChar32*>(uprv_realloc(list, sizeof(UChar32) * len));
  ------------------
  |  | 1536|      8|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1435|      8|        if (temp) {
  ------------------
  |  Branch (1435:13): [True: 8, False: 0]
  ------------------
 1436|      8|            list = temp;
 1437|      8|            capacity = len;
 1438|      8|        }
 1439|       |        // else what the heck happened?! We allocated less memory!
 1440|       |        // Oh well. We'll keep our original array.
 1441|      8|    }
 1442|     27|    if (strings_ != nullptr && strings_->isEmpty()) {
  ------------------
  |  Branch (1442:9): [True: 0, False: 27]
  |  Branch (1442:32): [True: 0, False: 0]
  ------------------
 1443|      0|        delete strings_;
 1444|      0|        strings_ = nullptr;
 1445|      0|    }
 1446|     27|    return *this;
 1447|     27|}
_ZN6icu_7810UnicodeSet12nextCapacityEi:
 1624|    797|int32_t UnicodeSet::nextCapacity(int32_t minCapacity) {
 1625|       |    // Grow exponentially to reduce the frequency of allocations.
 1626|    797|    if (minCapacity < INITIAL_CAPACITY) {
  ------------------
  |  Branch (1626:9): [True: 13, False: 784]
  ------------------
 1627|     13|        return minCapacity + INITIAL_CAPACITY;
 1628|    784|    } else if (minCapacity <= 2500) {
  ------------------
  |  Branch (1628:16): [True: 781, False: 3]
  ------------------
 1629|    781|        return 5 * minCapacity;
 1630|    781|    } else {
 1631|      3|        int32_t newCapacity = 2 * minCapacity;
 1632|      3|        if (newCapacity > MAX_LENGTH) {
  ------------------
  |  Branch (1632:13): [True: 0, False: 3]
  ------------------
 1633|      0|            newCapacity = MAX_LENGTH;
 1634|      0|        }
 1635|      3|        return newCapacity;
 1636|      3|    }
 1637|    797|}
_ZN6icu_7810UnicodeSet14ensureCapacityEi:
 1639|   750k|bool UnicodeSet::ensureCapacity(int32_t newLen) {
 1640|   750k|    if (newLen > MAX_LENGTH) {
  ------------------
  |  Branch (1640:9): [True: 0, False: 750k]
  ------------------
 1641|      0|        newLen = MAX_LENGTH;
 1642|      0|    }
 1643|   750k|    if (newLen <= capacity) {
  ------------------
  |  Branch (1643:9): [True: 749k, False: 765]
  ------------------
 1644|   749k|        return true;
 1645|   749k|    }
 1646|    765|    int32_t newCapacity = nextCapacity(newLen);
 1647|    765|    UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32)));
  ------------------
  |  | 1524|    765|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    765|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    765|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    765|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1648|    765|    if (temp == nullptr) {
  ------------------
  |  Branch (1648:9): [True: 0, False: 765]
  ------------------
 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|    765|    uprv_memcpy(temp, list, len * sizeof(UChar32));
  ------------------
  |  |   42|    765|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    765|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    765|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    765|    _Pragma("clang diagnostic push") \
  |  |   45|    765|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    765|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    765|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    765|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    765|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    765|    _Pragma("clang diagnostic pop") \
  |  |   49|    765|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    765|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    765|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    765|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1654|    765|    if (list != stackList) {
  ------------------
  |  Branch (1654:9): [True: 285, False: 480]
  ------------------
 1655|    285|        uprv_free(list);
  ------------------
  |  | 1503|    285|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    285|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    285|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    285|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1656|    285|    }
 1657|    765|    list = temp;
 1658|    765|    capacity = newCapacity;
 1659|    765|    return true;
 1660|    765|}
_ZN6icu_7810UnicodeSet20ensureBufferCapacityEi:
 1662|     37|bool UnicodeSet::ensureBufferCapacity(int32_t newLen) {
 1663|     37|    if (newLen > MAX_LENGTH) {
  ------------------
  |  Branch (1663:9): [True: 0, False: 37]
  ------------------
 1664|      0|        newLen = MAX_LENGTH;
 1665|      0|    }
 1666|     37|    if (newLen <= bufferCapacity) {
  ------------------
  |  Branch (1666:9): [True: 5, False: 32]
  ------------------
 1667|      5|        return true;
 1668|      5|    }
 1669|     32|    int32_t newCapacity = nextCapacity(newLen);
 1670|     32|    UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32)));
  ------------------
  |  | 1524|     32|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     32|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     32|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     32|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1671|     32|    if (temp == nullptr) {
  ------------------
  |  Branch (1671:9): [True: 0, False: 32]
  ------------------
 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|     32|    if (buffer != stackList) {
  ------------------
  |  Branch (1677:9): [True: 21, False: 11]
  ------------------
 1678|     21|        uprv_free(buffer);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1679|     21|    }
 1680|     32|    buffer = temp;
 1681|     32|    bufferCapacity = newCapacity;
 1682|     32|    return true;
 1683|     32|}
_ZN6icu_7810UnicodeSet11swapBuffersEv:
 1688|     37|void UnicodeSet::swapBuffers() {
 1689|       |    // swap list and buffer
 1690|     37|    UChar32* temp = list;
 1691|     37|    list = buffer;
 1692|     37|    buffer = temp;
 1693|       |
 1694|     37|    int32_t c = capacity;
 1695|     37|    capacity = bufferCapacity;
 1696|     37|    bufferCapacity = c;
 1697|     37|}
_ZN6icu_7810UnicodeSet3addEPKiia:
 1763|     21|void UnicodeSet::add(const UChar32* other, int32_t otherLen, int8_t polarity) {
 1764|     21|    if (isFrozen() || isBogus() || other==nullptr) {
  ------------------
  |  Branch (1764:9): [True: 0, False: 21]
  |  Branch (1764:23): [True: 0, False: 21]
  |  Branch (1764:36): [True: 0, False: 21]
  ------------------
 1765|      0|        return;
 1766|      0|    }
 1767|     21|    if (!ensureBufferCapacity(len + otherLen)) {
  ------------------
  |  Branch (1767:9): [True: 0, False: 21]
  ------------------
 1768|      0|        return;
 1769|      0|    }
 1770|       |
 1771|     21|    int32_t i = 0, j = 0, k = 0;
 1772|     21|    UChar32 a = list[i++];
 1773|     21|    UChar32 b = other[j++];
 1774|       |    // change from xor is that we have to check overlapping pairs
 1775|       |    // polarity bit 1 means a is second, bit 2 means b is.
 1776|  3.76k|    for (;;) {
 1777|  3.76k|        switch (polarity) {
  ------------------
  |  Branch (1777:17): [True: 0, False: 3.76k]
  ------------------
 1778|  1.85k|          case 0: // both first; take lower if unequal
  ------------------
  |  Branch (1778:11): [True: 1.85k, False: 1.91k]
  ------------------
 1779|  1.85k|            if (a < b) { // take a
  ------------------
  |  Branch (1779:17): [True: 562, False: 1.28k]
  ------------------
 1780|       |                // Back up over overlapping ranges in buffer[]
 1781|    562|                if (k > 0 && a <= buffer[k-1]) {
  ------------------
  |  Branch (1781:21): [True: 556, False: 6]
  |  Branch (1781:30): [True: 0, False: 556]
  ------------------
 1782|       |                    // Pick latter end value in buffer[] vs. list[]
 1783|      0|                    a = max(list[i], buffer[--k]);
 1784|    562|                } else {
 1785|       |                    // No overlap
 1786|    562|                    buffer[k++] = a;
 1787|    562|                    a = list[i];
 1788|    562|                }
 1789|    562|                i++; // Common if/else code factored out
 1790|    562|                polarity ^= 1;
 1791|  1.28k|            } else if (b < a) { // take b
  ------------------
  |  Branch (1791:24): [True: 1.26k, False: 21]
  ------------------
 1792|  1.26k|                if (k > 0 && b <= buffer[k-1]) {
  ------------------
  |  Branch (1792:21): [True: 1.25k, False: 15]
  |  Branch (1792:30): [True: 0, False: 1.25k]
  ------------------
 1793|      0|                    b = max(other[j], buffer[--k]);
 1794|  1.26k|                } else {
 1795|  1.26k|                    buffer[k++] = b;
 1796|  1.26k|                    b = other[j];
 1797|  1.26k|                }
 1798|  1.26k|                j++;
 1799|  1.26k|                polarity ^= 2;
 1800|  1.26k|            } else { // a == b, take a, drop b
 1801|     21|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     21|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1801:21): [True: 21, False: 0]
  ------------------
 1802|       |                // This is symmetrical; it doesn't matter if
 1803|       |                // we backtrack with a or b. - liu
 1804|      0|                if (k > 0 && a <= buffer[k-1]) {
  ------------------
  |  Branch (1804:21): [True: 0, False: 0]
  |  Branch (1804:30): [True: 0, False: 0]
  ------------------
 1805|      0|                    a = max(list[i], buffer[--k]);
 1806|      0|                } else {
 1807|       |                    // No overlap
 1808|      0|                    buffer[k++] = a;
 1809|      0|                    a = list[i];
 1810|      0|                }
 1811|      0|                i++;
 1812|      0|                polarity ^= 1;
 1813|      0|                b = other[j++];
 1814|      0|                polarity ^= 2;
 1815|      0|            }
 1816|  1.83k|            break;
 1817|  1.83k|          case 3: // both second; take higher if unequal, and drop other
  ------------------
  |  Branch (1817:11): [True: 0, False: 3.76k]
  ------------------
 1818|      0|            if (b <= a) { // take a
  ------------------
  |  Branch (1818:17): [True: 0, False: 0]
  ------------------
 1819|      0|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1819:21): [True: 0, False: 0]
  ------------------
 1820|      0|                buffer[k++] = a;
 1821|      0|            } else { // take b
 1822|      0|                if (b == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1822:21): [True: 0, False: 0]
  ------------------
 1823|      0|                buffer[k++] = b;
 1824|      0|            }
 1825|      0|            a = list[i++];
 1826|      0|            polarity ^= 1;   // factored common code
 1827|      0|            b = other[j++];
 1828|      0|            polarity ^= 2;
 1829|      0|            break;
 1830|    603|          case 1: // a second, b first; if b < a, overlap
  ------------------
  |  Branch (1830:11): [True: 603, False: 3.15k]
  ------------------
 1831|    603|            if (a < b) { // no overlap, take a
  ------------------
  |  Branch (1831:17): [True: 563, False: 40]
  ------------------
 1832|    563|                buffer[k++] = a; a = list[i++]; polarity ^= 1;
 1833|    563|            } else if (b < a) { // OVERLAP, drop b
  ------------------
  |  Branch (1833:24): [True: 0, False: 40]
  ------------------
 1834|      0|                b = other[j++];
 1835|      0|                polarity ^= 2;
 1836|     40|            } else { // a == b, drop both!
 1837|     40|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     40|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1837:21): [True: 0, False: 40]
  ------------------
 1838|     40|                a = list[i++];
 1839|     40|                polarity ^= 1;
 1840|     40|                b = other[j++];
 1841|     40|                polarity ^= 2;
 1842|     40|            }
 1843|    603|            break;
 1844|  1.30k|          case 2: // a first, b second; if a < b, overlap
  ------------------
  |  Branch (1844:11): [True: 1.30k, False: 2.45k]
  ------------------
 1845|  1.30k|            if (b < a) { // no overlap, take b
  ------------------
  |  Branch (1845:17): [True: 1.26k, False: 41]
  ------------------
 1846|  1.26k|                buffer[k++] = b;
 1847|  1.26k|                b = other[j++];
 1848|  1.26k|                polarity ^= 2;
 1849|  1.26k|            } else  if (a < b) { // OVERLAP, drop a
  ------------------
  |  Branch (1849:25): [True: 0, False: 41]
  ------------------
 1850|      0|                a = list[i++];
 1851|      0|                polarity ^= 1;
 1852|     41|            } else { // a == b, drop both!
 1853|     41|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     41|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1853:21): [True: 0, False: 41]
  ------------------
 1854|     41|                a = list[i++];
 1855|     41|                polarity ^= 1;
 1856|     41|                b = other[j++];
 1857|     41|                polarity ^= 2;
 1858|     41|            }
 1859|  1.30k|            break;
 1860|  3.76k|        }
 1861|  3.76k|    }
 1862|     21| loop_end:
 1863|     21|    buffer[k++] = UNICODESET_HIGH;    // terminate
  ------------------
  |  |   34|     21|#define UNICODESET_HIGH 0x0110000
  ------------------
 1864|     21|    len = k;
 1865|     21|    swapBuffers();
 1866|     21|    releasePattern();
 1867|     21|}
_ZN6icu_7810UnicodeSet6retainEPKiia:
 1874|     16|void UnicodeSet::retain(const UChar32* other, int32_t otherLen, int8_t polarity) {
 1875|     16|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (1875:9): [True: 0, False: 16]
  |  Branch (1875:23): [True: 0, False: 16]
  ------------------
 1876|      0|        return;
 1877|      0|    }
 1878|     16|    if (!ensureBufferCapacity(len + otherLen)) {
  ------------------
  |  Branch (1878:9): [True: 0, False: 16]
  ------------------
 1879|      0|        return;
 1880|      0|    }
 1881|       |
 1882|     16|    int32_t i = 0, j = 0, k = 0;
 1883|     16|    UChar32 a = list[i++];
 1884|     16|    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|  3.22k|    for (;;) {
 1888|  3.22k|        switch (polarity) {
  ------------------
  |  Branch (1888:17): [True: 0, False: 3.22k]
  ------------------
 1889|  1.56k|          case 0: // both first; drop the smaller
  ------------------
  |  Branch (1889:11): [True: 1.56k, False: 1.65k]
  ------------------
 1890|  1.56k|            if (a < b) { // drop a
  ------------------
  |  Branch (1890:17): [True: 27, False: 1.54k]
  ------------------
 1891|     27|                a = list[i++];
 1892|     27|                polarity ^= 1;
 1893|  1.54k|            } else if (b < a) { // drop b
  ------------------
  |  Branch (1893:24): [True: 1.49k, False: 46]
  ------------------
 1894|  1.49k|                b = other[j++];
 1895|  1.49k|                polarity ^= 2;
 1896|  1.49k|            } else { // a == b, take one, drop other
 1897|     46|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     46|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1897:21): [True: 12, False: 34]
  ------------------
 1898|     34|                buffer[k++] = a;
 1899|     34|                a = list[i++];
 1900|     34|                polarity ^= 1;
 1901|     34|                b = other[j++];
 1902|     34|                polarity ^= 2;
 1903|     34|            }
 1904|  1.55k|            break;
 1905|  1.55k|          case 3: // both second; take lower if unequal
  ------------------
  |  Branch (1905:11): [True: 80, False: 3.14k]
  ------------------
 1906|     80|            if (a < b) { // take a
  ------------------
  |  Branch (1906:17): [True: 19, False: 61]
  ------------------
 1907|     19|                buffer[k++] = a;
 1908|     19|                a = list[i++];
 1909|     19|                polarity ^= 1;
 1910|     61|            } else if (b < a) { // take b
  ------------------
  |  Branch (1910:24): [True: 27, False: 34]
  ------------------
 1911|     27|                buffer[k++] = b;
 1912|     27|                b = other[j++];
 1913|     27|                polarity ^= 2;
 1914|     34|            } else { // a == b, take one, drop other
 1915|     34|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     34|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1915:21): [True: 0, False: 34]
  ------------------
 1916|     34|                buffer[k++] = a;
 1917|     34|                a = list[i++];
 1918|     34|                polarity ^= 1;
 1919|     34|                b = other[j++];
 1920|     34|                polarity ^= 2;
 1921|     34|            }
 1922|     80|            break;
 1923|     80|          case 1: // a second, b first;
  ------------------
  |  Branch (1923:11): [True: 58, False: 3.16k]
  ------------------
 1924|     58|            if (a < b) { // NO OVERLAP, drop a
  ------------------
  |  Branch (1924:17): [True: 27, False: 31]
  ------------------
 1925|     27|                a = list[i++];
 1926|     27|                polarity ^= 1;
 1927|     31|            } else if (b < a) { // OVERLAP, take b
  ------------------
  |  Branch (1927:24): [True: 30, False: 1]
  ------------------
 1928|     30|                buffer[k++] = b;
 1929|     30|                b = other[j++];
 1930|     30|                polarity ^= 2;
 1931|     30|            } else { // a == b, drop both!
 1932|      1|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      1|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1932:21): [True: 0, False: 1]
  ------------------
 1933|      1|                a = list[i++];
 1934|      1|                polarity ^= 1;
 1935|      1|                b = other[j++];
 1936|      1|                polarity ^= 2;
 1937|      1|            }
 1938|     58|            break;
 1939|  1.51k|          case 2: // a first, b second; if a < b, overlap
  ------------------
  |  Branch (1939:11): [True: 1.51k, False: 1.70k]
  ------------------
 1940|  1.51k|            if (b < a) { // no overlap, drop b
  ------------------
  |  Branch (1940:17): [True: 1.49k, False: 24]
  ------------------
 1941|  1.49k|                b = other[j++];
 1942|  1.49k|                polarity ^= 2;
 1943|  1.49k|            } else  if (a < b) { // OVERLAP, take a
  ------------------
  |  Branch (1943:25): [True: 16, False: 8]
  ------------------
 1944|     16|                buffer[k++] = a;
 1945|     16|                a = list[i++];
 1946|     16|                polarity ^= 1;
 1947|     16|            } else { // a == b, drop both!
 1948|      8|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      8|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1948:21): [True: 4, False: 4]
  ------------------
 1949|      4|                a = list[i++];
 1950|      4|                polarity ^= 1;
 1951|      4|                b = other[j++];
 1952|      4|                polarity ^= 2;
 1953|      4|            }
 1954|  1.51k|            break;
 1955|  3.22k|        }
 1956|  3.22k|    }
 1957|     16| loop_end:
 1958|     16|    buffer[k++] = UNICODESET_HIGH;    // terminate
  ------------------
  |  |   34|     16|#define UNICODESET_HIGH 0x0110000
  ------------------
 1959|     16|    len = k;
 1960|     16|    swapBuffers();
 1961|     16|    releasePattern();
 1962|     16|}
_ZN6icu_7810UnicodeSet12_appendToPatERNS_13UnicodeStringEia:
 1979|      8|void UnicodeSet::_appendToPat(UnicodeString& buf, UChar32 c, UBool escapeUnprintable) {
 1980|      8|    if (escapeUnprintable ? ICU_Utility::isUnprintable(c) : ICU_Utility::shouldAlwaysBeEscaped(c)) {
  ------------------
  |  Branch (1980:9): [True: 0, False: 8]
  |  Branch (1980:9): [True: 0, False: 8]
  ------------------
 1981|       |        // Use hex escape notation (\uxxxx or \Uxxxxxxxx) for anything
 1982|       |        // unprintable
 1983|      0|        ICU_Utility::escape(buf, c);
 1984|      0|        return;
 1985|      0|    }
 1986|       |    // Okay to let ':' pass through
 1987|      8|    switch (c) {
 1988|      0|    case u'[':
  ------------------
  |  Branch (1988:5): [True: 0, False: 8]
  ------------------
 1989|      0|    case u']':
  ------------------
  |  Branch (1989:5): [True: 0, False: 8]
  ------------------
 1990|      0|    case u'-':
  ------------------
  |  Branch (1990:5): [True: 0, False: 8]
  ------------------
 1991|      0|    case u'^':
  ------------------
  |  Branch (1991:5): [True: 0, False: 8]
  ------------------
 1992|      0|    case u'&':
  ------------------
  |  Branch (1992:5): [True: 0, False: 8]
  ------------------
 1993|      0|    case u'\\':
  ------------------
  |  Branch (1993:5): [True: 0, False: 8]
  ------------------
 1994|      0|    case u'{':
  ------------------
  |  Branch (1994:5): [True: 0, False: 8]
  ------------------
 1995|      0|    case u'}':
  ------------------
  |  Branch (1995:5): [True: 0, False: 8]
  ------------------
 1996|      0|    case u':':
  ------------------
  |  Branch (1996:5): [True: 0, False: 8]
  ------------------
 1997|      0|    case SymbolTable::SYMBOL_REF:
  ------------------
  |  Branch (1997:5): [True: 0, False: 8]
  ------------------
 1998|      0|        buf.append(u'\\');
 1999|      0|        break;
 2000|      8|    default:
  ------------------
  |  Branch (2000:5): [True: 8, False: 0]
  ------------------
 2001|       |        // Escape whitespace
 2002|      8|        if (PatternProps::isWhiteSpace(c)) {
  ------------------
  |  Branch (2002:13): [True: 0, False: 8]
  ------------------
 2003|      0|            buf.append(u'\\');
 2004|      0|        }
 2005|      8|        break;
 2006|      8|    }
 2007|      8|    buf.append(c);
 2008|      8|}
_ZN6icu_7810UnicodeSet12_appendToPatERNS_13UnicodeStringEiia:
 2011|      1|                              UBool escapeUnprintable) {
 2012|      1|    _appendToPat(result, start, escapeUnprintable);
 2013|      1|    if (start != end) {
  ------------------
  |  Branch (2013:9): [True: 1, False: 0]
  ------------------
 2014|      1|        if ((start+1) != end ||
  ------------------
  |  Branch (2014:13): [True: 1, False: 0]
  ------------------
 2015|       |                // Avoid writing what looks like a lead+trail surrogate pair.
 2016|      1|                start == 0xdbff) {
  ------------------
  |  Branch (2016:17): [True: 0, False: 0]
  ------------------
 2017|      1|            result.append(u'-');
 2018|      1|        }
 2019|      1|        _appendToPat(result, end, escapeUnprintable);
 2020|      1|    }
 2021|      1|}
_ZNK6icu_7810UnicodeSet16_generatePatternERNS_13UnicodeStringEa:
 2082|      1|{
 2083|      1|    result.append(u'[');
 2084|       |
 2085|      1|    int32_t i = 0;
 2086|      1|    int32_t limit = len & ~1;  // = 2 * getRangeCount()
 2087|       |
 2088|       |    // If the set contains at least 2 intervals and includes both
 2089|       |    // MIN_VALUE and MAX_VALUE, then the inverse representation will
 2090|       |    // be more economical.
 2091|       |    //     if (getRangeCount() >= 2 &&
 2092|       |    //             getRangeStart(0) == MIN_VALUE &&
 2093|       |    //             getRangeEnd(last) == MAX_VALUE)
 2094|       |    // Invariant: list[len-1] == HIGH == MAX_VALUE + 1
 2095|       |    // If limit == len then len is even and the last range ends with MAX_VALUE.
 2096|       |    //
 2097|       |    // *But* do not write the inverse (complement) if there are strings.
 2098|       |    // Since ICU 70, the '^' performs a code point complement which removes all strings.
 2099|      1|    if (len >= 4 && list[0] == 0 && limit == len && !hasStrings()) {
  ------------------
  |  Branch (2099:9): [True: 0, False: 1]
  |  Branch (2099:21): [True: 0, False: 0]
  |  Branch (2099:37): [True: 0, False: 0]
  |  Branch (2099:53): [True: 0, False: 0]
  ------------------
 2100|       |        // Emit the inverse
 2101|      0|        result.append(u'^');
 2102|       |        // Offsetting the inversion list index by one lets us
 2103|       |        // iterate over the ranges of the set complement.
 2104|      0|        i = 1;
 2105|      0|        --limit;
 2106|      0|    }
 2107|       |
 2108|       |    // Emit the ranges as pairs.
 2109|      2|    while (i < limit) {
  ------------------
  |  Branch (2109:12): [True: 1, False: 1]
  ------------------
 2110|      1|        UChar32 start = list[i];  // getRangeStart()
 2111|      1|        UChar32 end = list[i + 1] - 1;  // getRangeEnd() = range limit minus one
 2112|      1|        if (!(0xd800 <= end && end <= 0xdbff)) {
  ------------------
  |  Branch (2112:15): [True: 0, False: 1]
  |  Branch (2112:32): [True: 0, False: 0]
  ------------------
 2113|      1|            _appendToPat(result, start, end, escapeUnprintable);
 2114|      1|            i += 2;
 2115|      1|        } else {
 2116|       |            // The range ends with a lead surrogate.
 2117|       |            // Avoid writing what looks like a lead+trail surrogate pair.
 2118|       |            // 1. Postpone ranges that start with a lead surrogate code point.
 2119|      0|            int32_t firstLead = i;
 2120|      0|            while ((i += 2) < limit && list[i] <= 0xdbff) {}
  ------------------
  |  Branch (2120:20): [True: 0, False: 0]
  |  Branch (2120:40): [True: 0, False: 0]
  ------------------
 2121|      0|            int32_t firstAfterLead = i;
 2122|       |            // 2. Write following ranges that start with a trail surrogate code point.
 2123|      0|            while (i < limit && (start = list[i]) <= 0xdfff) {
  ------------------
  |  Branch (2123:20): [True: 0, False: 0]
  |  Branch (2123:33): [True: 0, False: 0]
  ------------------
 2124|      0|                _appendToPat(result, start, list[i + 1] - 1, escapeUnprintable);
 2125|      0|                i += 2;
 2126|      0|            }
 2127|       |            // 3. Now write the postponed ranges.
 2128|      0|            for (int j = firstLead; j < firstAfterLead; j += 2) {
  ------------------
  |  Branch (2128:37): [True: 0, False: 0]
  ------------------
 2129|      0|                _appendToPat(result, list[j], list[j + 1] - 1, escapeUnprintable);
 2130|      0|            }
 2131|      0|        }
 2132|      1|    }
 2133|       |
 2134|      1|    if (strings_ != nullptr) {
  ------------------
  |  Branch (2134:9): [True: 0, False: 1]
  ------------------
 2135|      0|        for (int32_t i = 0; i<strings_->size(); ++i) {
  ------------------
  |  Branch (2135:29): [True: 0, False: 0]
  ------------------
 2136|      0|            result.append(u'{');
 2137|      0|            _appendToPat(result,
 2138|      0|                         *static_cast<const UnicodeString*>(strings_->elementAt(i)),
 2139|      0|                         escapeUnprintable);
 2140|      0|            result.append(u'}');
 2141|      0|        }
 2142|      0|    }
 2143|      1|    return result.append(u']');
 2144|      1|}
_ZN6icu_7810UnicodeSet14releasePatternEv:
 2149|   801k|void UnicodeSet::releasePattern() {
 2150|   801k|    if (pat) {
  ------------------
  |  Branch (2150:9): [True: 12, False: 801k]
  ------------------
 2151|     12|        uprv_free(pat);
  ------------------
  |  | 1503|     12|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     12|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     12|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     12|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2152|     12|        pat = nullptr;
 2153|     12|        patLen = 0;
 2154|     12|    }
 2155|   801k|}
_ZN6icu_7810UnicodeSet10setPatternEPKDsi:
 2160|     21|void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) {
 2161|     21|    releasePattern();
 2162|     21|    pat = static_cast<char16_t*>(uprv_malloc((newPatLen + 1) * sizeof(char16_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2163|     21|    if (pat) {
  ------------------
  |  Branch (2163:9): [True: 21, False: 0]
  ------------------
 2164|     21|        patLen = newPatLen;
 2165|     21|        u_memcpy(pat, newPat, patLen);
  ------------------
  |  |  334|     21|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2166|     21|        pat[patLen] = 0;
 2167|     21|    }
 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|     21|}
_ZN6icu_7810UnicodeSet6freezeEv:
 2172|      1|UnicodeSet *UnicodeSet::freeze() {
 2173|      1|    if(!isFrozen() && !isBogus()) {
  ------------------
  |  Branch (2173:8): [True: 1, False: 0]
  |  Branch (2173:23): [True: 1, False: 0]
  ------------------
 2174|      1|        compact();
 2175|       |
 2176|       |        // Optimize contains() and span() and similar functions.
 2177|      1|        if (hasStrings()) {
  ------------------
  |  Branch (2177:13): [True: 0, False: 1]
  ------------------
 2178|      0|            stringSpan = new UnicodeSetStringSpan(*this, *strings_, UnicodeSetStringSpan::ALL);
 2179|      0|            if (stringSpan == nullptr) {
  ------------------
  |  Branch (2179:17): [True: 0, False: 0]
  ------------------
 2180|      0|                setToBogus();
 2181|      0|                return this;
 2182|      0|            } else if (!stringSpan->needsStringSpanUTF16()) {
  ------------------
  |  Branch (2182:24): [True: 0, False: 0]
  ------------------
 2183|       |                // All strings are irrelevant for span() etc. because
 2184|       |                // all of each string's code points are contained in this set.
 2185|       |                // Do not check needsStringSpanUTF8() because UTF-8 has at most as
 2186|       |                // many relevant strings as UTF-16.
 2187|       |                // (Thus needsStringSpanUTF8() implies needsStringSpanUTF16().)
 2188|      0|                delete stringSpan;
 2189|      0|                stringSpan = nullptr;
 2190|      0|            }
 2191|      0|        }
 2192|      1|        if (stringSpan == nullptr) {
  ------------------
  |  Branch (2192:13): [True: 1, False: 0]
  ------------------
 2193|       |            // No span-relevant strings: Optimize for code point spans.
 2194|      1|            bmpSet=new BMPSet(list, len);
 2195|      1|            if (bmpSet == nullptr) { // Check for memory allocation error.
  ------------------
  |  Branch (2195:17): [True: 0, False: 1]
  ------------------
 2196|      0|                setToBogus();
 2197|      0|            }
 2198|      1|        }
 2199|      1|    }
 2200|      1|    return this;
 2201|      1|}
uniset.cpp:_ZN6icu_78L12pinCodePointERi:
   54|  1.59M|static inline UChar32 pinCodePoint(UChar32& c) {
   55|  1.59M|    if (c < UNICODESET_LOW) {
  ------------------
  |  |   37|  1.59M|#define UNICODESET_LOW 0x000000
  ------------------
  |  Branch (55:9): [True: 0, False: 1.59M]
  ------------------
   56|      0|        c = UNICODESET_LOW;
  ------------------
  |  |   37|      0|#define UNICODESET_LOW 0x000000
  ------------------
   57|  1.59M|    } else if (c > (UNICODESET_HIGH-1)) {
  ------------------
  |  |   34|  1.59M|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (57:16): [True: 0, False: 1.59M]
  ------------------
   58|      0|        c = (UNICODESET_HIGH-1);
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
   59|      0|    }
   60|  1.59M|    return c;
   61|  1.59M|}

_ZN6icu_7810UnicodeSetC2ERKNS_13UnicodeStringER10UErrorCode:
  156|      5|                       UErrorCode& status) {
  157|      5|    applyPattern(pattern, status);
  158|      5|    _dbgct(this);
  159|      5|}
_ZN6icu_7810UnicodeSet12applyPatternERKNS_13UnicodeStringER10UErrorCode:
  166|     13|                                     UErrorCode& status) {
  167|       |    // Equivalent to
  168|       |    //   return applyPattern(pattern, USET_IGNORE_SPACE, nullptr, status);
  169|       |    // but without dependency on closeOver().
  170|     13|    ParsePosition pos(0);
  171|     13|    applyPatternIgnoreSpace(pattern, pos, nullptr, status);
  172|     13|    if (U_FAILURE(status)) return *this;
  ------------------
  |  Branch (172:9): [True: 0, False: 13]
  ------------------
  173|       |
  174|     13|    int32_t i = pos.getIndex();
  175|       |    // Skip over trailing whitespace
  176|     13|    ICU_Utility::skipWhitespace(pattern, i, true);
  177|     13|    if (i != pattern.length()) {
  ------------------
  |  Branch (177:9): [True: 0, False: 13]
  ------------------
  178|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  179|      0|    }
  180|     13|    return *this;
  181|     13|}
_ZN6icu_7810UnicodeSet23applyPatternIgnoreSpaceERKNS_13UnicodeStringERNS_13ParsePositionEPKNS_11SymbolTableER10UErrorCode:
  187|     13|                                    UErrorCode& status) {
  188|     13|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (188:9): [True: 0, False: 13]
  ------------------
  189|      0|        return;
  190|      0|    }
  191|     13|    if (isFrozen()) {
  ------------------
  |  Branch (191:9): [True: 0, False: 13]
  ------------------
  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|     13|    UnicodeString rebuiltPat;
  198|     13|    RuleCharacterIterator chars(pattern, symbols, pos);
  199|     13|    applyPattern(chars, symbols, rebuiltPat, USET_IGNORE_SPACE, nullptr, 0, status);
  200|     13|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (200:9): [True: 0, False: 13]
  ------------------
  201|     13|    if (chars.inVariable()) {
  ------------------
  |  Branch (201:9): [True: 0, False: 13]
  ------------------
  202|       |        // syntaxError(chars, "Extra chars in variable value");
  203|      0|        status = U_MALFORMED_SET;
  204|      0|        return;
  205|      0|    }
  206|     13|    setPattern(rebuiltPat);
  207|     13|}
_ZN6icu_7810UnicodeSet12applyPatternERNS_21RuleCharacterIteratorEPKNS_11SymbolTableERNS_13UnicodeStringEjMS0_FRS0_iEiR10UErrorCode:
  267|     13|                              UErrorCode& ec) {
  268|     13|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (268:9): [True: 0, False: 13]
  ------------------
  269|     13|    if (depth > MAX_DEPTH) {
  ------------------
  |  Branch (269:9): [True: 0, False: 13]
  ------------------
  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|     13|    int32_t opts = RuleCharacterIterator::PARSE_VARIABLES |
  279|     13|                   RuleCharacterIterator::PARSE_ESCAPES;
  280|     13|    if ((options & USET_IGNORE_SPACE) != 0) {
  ------------------
  |  Branch (280:9): [True: 13, False: 0]
  ------------------
  281|     13|        opts |= RuleCharacterIterator::SKIP_WHITESPACE;
  282|     13|    }
  283|       |
  284|     13|    UnicodeString patLocal, buf;
  285|     13|    UBool usePat = false;
  286|     13|    UnicodeSetPointer scratch;
  287|     13|    RuleCharacterIterator::Pos backup;
  288|       |
  289|       |    // mode: 0=before [, 1=between [...], 2=after ]
  290|       |    // lastItem: 0=none, 1=char, 2=set
  291|     13|    int8_t lastItem = 0, mode = 0;
  292|     13|    UChar32 lastChar = 0;
  293|     13|    char16_t op = 0;
  294|       |
  295|     13|    UBool invert = false;
  296|       |
  297|     13|    clear();
  298|       |
  299|     88|    while (mode != 2 && !chars.atEnd()) {
  ------------------
  |  Branch (299:12): [True: 76, False: 12]
  |  Branch (299:25): [True: 76, False: 0]
  ------------------
  300|     76|        U_ASSERT((lastItem == 0 && op == 0) ||
  ------------------
  |  |   35|     76|#   define U_ASSERT(exp) (void)0
  ------------------
  301|     76|                 (lastItem == 1 && (op == 0 || op == u'-')) ||
  302|     76|                 (lastItem == 2 && (op == 0 || op == u'-' || op == u'&')));
  303|       |
  304|     76|        UChar32 c = 0;
  305|     76|        UBool literal = false;
  306|     76|        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|     76|        int8_t setMode = 0;
  312|     76|        if (resemblesPropertyPattern(chars, opts)) {
  ------------------
  |  Branch (312:13): [True: 33, False: 43]
  ------------------
  313|     33|            setMode = 2;
  314|     33|        }
  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|     43|        else {
  325|       |            // Prepare to backup if necessary
  326|     43|            chars.getPos(backup);
  327|     43|            c = chars.next(opts, literal, ec);
  328|     43|            if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (328:17): [True: 0, False: 43]
  ------------------
  329|       |
  330|     43|            if (c == u'[' && !literal) {
  ------------------
  |  Branch (330:17): [True: 12, False: 31]
  |  Branch (330:30): [True: 12, False: 0]
  ------------------
  331|     12|                if (mode == 1) {
  ------------------
  |  Branch (331:21): [True: 0, False: 12]
  ------------------
  332|      0|                    chars.setPos(backup); // backup
  333|      0|                    setMode = 1;
  334|     12|                } else {
  335|       |                    // Handle opening '[' delimiter
  336|     12|                    mode = 1;
  337|     12|                    patLocal.append(u'[');
  338|     12|                    chars.getPos(backup); // prepare to backup
  339|     12|                    c = chars.next(opts, literal, ec); 
  340|     12|                    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (340:25): [True: 0, False: 12]
  ------------------
  341|     12|                    if (c == u'^' && !literal) {
  ------------------
  |  Branch (341:25): [True: 0, False: 12]
  |  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|     12|                    if (c == u'-') {
  ------------------
  |  Branch (350:25): [True: 0, False: 12]
  ------------------
  351|      0|                        literal = true;
  352|       |                        // Fall through to handle literal '-' below
  353|     12|                    } else {
  354|     12|                        chars.setPos(backup); // backup
  355|     12|                        continue;
  356|     12|                    }
  357|     12|                }
  358|     31|            } else if (symbols != nullptr) {
  ------------------
  |  Branch (358:24): [True: 0, False: 31]
  ------------------
  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|     43|        }
  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|     64|        if (setMode != 0) {
  ------------------
  |  Branch (379:13): [True: 33, False: 31]
  ------------------
  380|     33|            if (lastItem == 1) {
  ------------------
  |  Branch (380:17): [True: 0, False: 33]
  ------------------
  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|     33|            if (op == u'-' || op == u'&') {
  ------------------
  |  Branch (392:17): [True: 0, False: 33]
  |  Branch (392:31): [True: 12, False: 21]
  ------------------
  393|     12|                patLocal.append(op);
  394|     12|            }
  395|       |
  396|     33|            if (nested == nullptr) {
  ------------------
  |  Branch (396:17): [True: 33, False: 0]
  ------------------
  397|       |                // lazy allocation
  398|     33|                if (!scratch.allocate()) {
  ------------------
  |  Branch (398:21): [True: 0, False: 33]
  ------------------
  399|      0|                    ec = U_MEMORY_ALLOCATION_ERROR;
  400|      0|                    return;
  401|      0|                }
  402|     33|                nested = scratch.pointer();
  403|     33|            }
  404|     33|            switch (setMode) {
  ------------------
  |  Branch (404:21): [True: 0, False: 33]
  ------------------
  405|      0|            case 1:
  ------------------
  |  Branch (405:13): [True: 0, False: 33]
  ------------------
  406|      0|                nested->applyPattern(chars, symbols, patLocal, options, caseClosure, depth + 1, ec);
  407|      0|                break;
  408|     33|            case 2:
  ------------------
  |  Branch (408:13): [True: 33, False: 0]
  ------------------
  409|     33|                chars.skipIgnored(opts);
  410|     33|                nested->applyPropertyPattern(chars, patLocal, ec);
  411|     33|                if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (411:21): [True: 0, False: 33]
  ------------------
  412|     33|                break;
  413|     33|            case 3: // `nested' already parsed
  ------------------
  |  Branch (413:13): [True: 0, False: 33]
  ------------------
  414|      0|                nested->_toPattern(patLocal, false);
  415|      0|                break;
  416|     33|            }
  417|       |
  418|     33|            usePat = true;
  419|       |
  420|     33|            if (mode == 0) {
  ------------------
  |  Branch (420:17): [True: 1, False: 32]
  ------------------
  421|       |                // Entire pattern is a category; leave parse loop
  422|      1|                *this = *nested;
  423|      1|                mode = 2;
  424|      1|                break;
  425|      1|            }
  426|       |
  427|     32|            switch (op) {
  ------------------
  |  Branch (427:21): [True: 0, False: 32]
  ------------------
  428|      0|            case u'-':
  ------------------
  |  Branch (428:13): [True: 0, False: 32]
  ------------------
  429|      0|                removeAll(*nested);
  430|      0|                break;
  431|     12|            case u'&':
  ------------------
  |  Branch (431:13): [True: 12, False: 20]
  ------------------
  432|     12|                retainAll(*nested);
  433|     12|                break;
  434|     20|            case 0:
  ------------------
  |  Branch (434:13): [True: 20, False: 12]
  ------------------
  435|     20|                addAll(*nested);
  436|     20|                break;
  437|     32|            }
  438|       |
  439|     32|            op = 0;
  440|     32|            lastItem = 2;
  441|       |
  442|     32|            continue;
  443|     32|        }
  444|       |
  445|     31|        if (mode == 0) {
  ------------------
  |  Branch (445:13): [True: 0, False: 31]
  ------------------
  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|     31|        if (!literal) {
  ------------------
  |  Branch (455:13): [True: 25, False: 6]
  ------------------
  456|     25|            switch (c) {
  457|     12|            case u']':
  ------------------
  |  Branch (457:13): [True: 12, False: 13]
  ------------------
  458|     12|                if (lastItem == 1) {
  ------------------
  |  Branch (458:21): [True: 1, False: 11]
  ------------------
  459|      1|                    add(lastChar, lastChar);
  460|      1|                    _appendToPat(patLocal, lastChar, false);
  461|      1|                }
  462|       |                // Treat final trailing '-' as a literal
  463|     12|                if (op == u'-') {
  ------------------
  |  Branch (463:21): [True: 0, False: 12]
  ------------------
  464|      0|                    add(op, op);
  465|      0|                    patLocal.append(op);
  466|     12|                } else if (op == u'&') {
  ------------------
  |  Branch (466:28): [True: 0, False: 12]
  ------------------
  467|       |                    // syntaxError(chars, "Trailing '&'");
  468|      0|                    ec = U_MALFORMED_SET;
  469|      0|                    return;
  470|      0|                }
  471|     12|                patLocal.append(u']');
  472|     12|                mode = 2;
  473|     12|                continue;
  474|      1|            case u'-':
  ------------------
  |  Branch (474:13): [True: 1, False: 24]
  ------------------
  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|     12|            case u'&':
  ------------------
  |  Branch (494:13): [True: 12, False: 13]
  ------------------
  495|     12|                if (lastItem == 2 && op == 0) {
  ------------------
  |  Branch (495:21): [True: 12, False: 0]
  |  Branch (495:38): [True: 12, False: 0]
  ------------------
  496|     12|                    op = static_cast<char16_t>(c);
  497|     12|                    continue;
  498|     12|                }
  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: 25]
  ------------------
  503|       |                // syntaxError(chars, "'^' not after '['");
  504|      0|                ec = U_MALFORMED_SET;
  505|      0|                return;
  506|      0|            case u'{':
  ------------------
  |  Branch (506:13): [True: 0, False: 25]
  ------------------
  507|      0|                if (op != 0) {
  ------------------
  |  Branch (507:21): [True: 0, False: 0]
  ------------------
  508|       |                    // syntaxError(chars, "Missing operand after operator");
  509|      0|                    ec = U_MALFORMED_SET;
  510|      0|                    return;
  511|      0|                }
  512|      0|                if (lastItem == 1) {
  ------------------
  |  Branch (512:21): [True: 0, False: 0]
  ------------------
  513|      0|                    add(lastChar, lastChar);
  514|      0|                    _appendToPat(patLocal, lastChar, false);
  515|      0|                }
  516|      0|                lastItem = 0;
  517|      0|                buf.truncate(0);
  518|      0|                {
  519|      0|                    UBool ok = false;
  520|      0|                    while (!chars.atEnd()) {
  ------------------
  |  Branch (520:28): [True: 0, False: 0]
  ------------------
  521|      0|                        c = chars.next(opts, literal, ec);
  522|      0|                        if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (522:29): [True: 0, False: 0]
  ------------------
  523|      0|                        if (c == u'}' && !literal) {
  ------------------
  |  Branch (523:29): [True: 0, False: 0]
  |  Branch (523:42): [True: 0, False: 0]
  ------------------
  524|      0|                            ok = true;
  525|      0|                            break;
  526|      0|                        }
  527|      0|                        buf.append(c);
  528|      0|                    }
  529|      0|                    if (!ok) {
  ------------------
  |  Branch (529:25): [True: 0, False: 0]
  ------------------
  530|       |                        // syntaxError(chars, "Invalid multicharacter string");
  531|      0|                        ec = U_MALFORMED_SET;
  532|      0|                        return;
  533|      0|                    }
  534|      0|                }
  535|       |                // We have new string. Add it to set and continue;
  536|       |                // we don't need to drop through to the further
  537|       |                // processing
  538|      0|                add(buf);
  539|      0|                patLocal.append(u'{');
  540|      0|                _appendToPat(patLocal, buf, false);
  541|      0|                patLocal.append(u'}');
  542|      0|                continue;
  543|      0|            case SymbolTable::SYMBOL_REF:
  ------------------
  |  Branch (543:13): [True: 0, False: 25]
  ------------------
  544|       |                //         symbols  nosymbols
  545|       |                // [a-$]   error    error (ambiguous)
  546|       |                // [a$]    anchor   anchor
  547|       |                // [a-$x]  var "x"* literal '$'
  548|       |                // [a-$.]  error    literal '$'
  549|       |                // *We won't get here in the case of var "x"
  550|      0|                {
  551|      0|                    chars.getPos(backup);
  552|      0|                    c = chars.next(opts, literal, ec);
  553|      0|                    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (553:25): [True: 0, False: 0]
  ------------------
  554|      0|                    UBool anchor = (c == u']' && !literal);
  ------------------
  |  Branch (554:37): [True: 0, False: 0]
  |  Branch (554:50): [True: 0, False: 0]
  ------------------
  555|      0|                    if (symbols == nullptr && !anchor) {
  ------------------
  |  Branch (555:25): [True: 0, False: 0]
  |  Branch (555:47): [True: 0, False: 0]
  ------------------
  556|      0|                        c = SymbolTable::SYMBOL_REF;
  557|      0|                        chars.setPos(backup);
  558|      0|                        break; // literal '$'
  559|      0|                    }
  560|      0|                    if (anchor && op == 0) {
  ------------------
  |  Branch (560:25): [True: 0, False: 0]
  |  Branch (560:35): [True: 0, False: 0]
  ------------------
  561|      0|                        if (lastItem == 1) {
  ------------------
  |  Branch (561:29): [True: 0, False: 0]
  ------------------
  562|      0|                            add(lastChar, lastChar);
  563|      0|                            _appendToPat(patLocal, lastChar, false);
  564|      0|                        }
  565|      0|                        add(U_ETHER);
  ------------------
  |  |   37|      0|#define U_ETHER ((char16_t)0xFFFF)
  ------------------
  566|      0|                        usePat = true;
  567|      0|                        patLocal.append(static_cast<char16_t>(SymbolTable::SYMBOL_REF));
  568|      0|                        patLocal.append(u']');
  569|      0|                        mode = 2;
  570|      0|                        continue;
  571|      0|                    }
  572|       |                    // syntaxError(chars, "Unquoted '$'");
  573|      0|                    ec = U_MALFORMED_SET;
  574|      0|                    return;
  575|      0|                }
  576|      0|            default:
  ------------------
  |  Branch (576:13): [True: 0, False: 25]
  ------------------
  577|      0|                break;
  578|     25|            }
  579|     25|        }
  580|       |
  581|       |        // -------- Parse literal characters.  This includes both
  582|       |        // escaped chars ("\u4E01") and non-syntax characters
  583|       |        // ("a").
  584|       |
  585|      6|        switch (lastItem) {
  ------------------
  |  Branch (585:17): [True: 0, False: 6]
  ------------------
  586|      1|        case 0:
  ------------------
  |  Branch (586:9): [True: 1, False: 5]
  ------------------
  587|      1|            lastItem = 1;
  588|      1|            lastChar = c;
  589|      1|            break;
  590|      4|        case 1:
  ------------------
  |  Branch (590:9): [True: 4, False: 2]
  ------------------
  591|      4|            if (op == u'-') {
  ------------------
  |  Branch (591:17): [True: 1, False: 3]
  ------------------
  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|      3|            } else {
  606|      3|                add(lastChar, lastChar);
  607|      3|                _appendToPat(patLocal, lastChar, false);
  608|      3|                lastChar = c;
  609|      3|            }
  610|      4|            break;
  611|      4|        case 2:
  ------------------
  |  Branch (611:9): [True: 1, False: 5]
  ------------------
  612|      1|            if (op != 0) {
  ------------------
  |  Branch (612:17): [True: 0, False: 1]
  ------------------
  613|       |                // syntaxError(chars, "Set expected after operator");
  614|      0|                ec = U_MALFORMED_SET;
  615|      0|                return;
  616|      0|            }
  617|      1|            lastChar = c;
  618|      1|            lastItem = 1;
  619|      1|            break;
  620|      6|        }
  621|      6|    }
  622|       |
  623|     13|    if (mode != 2) {
  ------------------
  |  Branch (623:9): [True: 0, False: 13]
  ------------------
  624|       |        // syntaxError(chars, "Missing ']'");
  625|      0|        ec = U_MALFORMED_SET;
  626|      0|        return;
  627|      0|    }
  628|       |
  629|     13|    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|     13|    if ((options & USET_CASE_MASK) != 0) {
  ------------------
  |  Branch (637:9): [True: 0, False: 13]
  ------------------
  638|      0|        (this->*caseClosure)(options);
  639|      0|    }
  640|     13|    if (invert) {
  ------------------
  |  Branch (640:9): [True: 0, False: 13]
  ------------------
  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|     13|    if (usePat) {
  ------------------
  |  Branch (646:9): [True: 12, False: 1]
  ------------------
  647|     12|        rebuiltPat.append(patLocal);
  648|     12|    } else {
  649|      1|        _generatePattern(rebuiltPat, false);
  650|      1|    }
  651|     13|    if (isBogus() && U_SUCCESS(ec)) {
  ------------------
  |  Branch (651:9): [True: 0, False: 13]
  |  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|     13|}
_ZN6icu_7810UnicodeSet11applyFilterEPFaiPvES1_PKS0_R10UErrorCode:
  706|  40.5k|                             UErrorCode &status) {
  707|  40.5k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (707:9): [True: 0, False: 40.5k]
  ------------------
  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|  40.5k|    clear();
  720|       |
  721|  40.5k|    UChar32 startHasProperty = -1;
  722|  40.5k|    int32_t limitRange = inclusions->getRangeCount();
  723|       |
  724|  53.5M|    for (int j=0; j<limitRange; ++j) {
  ------------------
  |  Branch (724:19): [True: 53.5M, False: 40.5k]
  ------------------
  725|       |        // get current range
  726|  53.5M|        UChar32 start = inclusions->getRangeStart(j);
  727|  53.5M|        UChar32 end = inclusions->getRangeEnd(j);
  728|       |
  729|       |        // for all the code points in the range, process
  730|   122M|        for (UChar32 ch = start; ch <= end; ++ch) {
  ------------------
  |  Branch (730:34): [True: 69.4M, False: 53.5M]
  ------------------
  731|       |            // only add to this UnicodeSet on inflection points --
  732|       |            // where the hasProperty value changes to false
  733|  69.4M|            if ((*filter)(ch, context)) {
  ------------------
  |  Branch (733:17): [True: 743k, False: 68.6M]
  ------------------
  734|   743k|                if (startHasProperty < 0) {
  ------------------
  |  Branch (734:21): [True: 741k, False: 1.62k]
  ------------------
  735|   741k|                    startHasProperty = ch;
  736|   741k|                }
  737|  68.6M|            } else if (startHasProperty >= 0) {
  ------------------
  |  Branch (737:24): [True: 741k, False: 67.9M]
  ------------------
  738|   741k|                add(startHasProperty, ch-1);
  739|   741k|                startHasProperty = -1;
  740|   741k|            }
  741|  69.4M|        }
  742|  53.5M|    }
  743|  40.5k|    if (startHasProperty >= 0) {
  ------------------
  |  Branch (743:9): [True: 0, False: 40.5k]
  ------------------
  744|      0|        add(startHasProperty, static_cast<UChar32>(0x10FFFF));
  745|      0|    }
  746|  40.5k|    if (isBogus() && U_SUCCESS(status)) {
  ------------------
  |  Branch (746:9): [True: 0, False: 40.5k]
  |  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|  40.5k|}
_ZN6icu_7810UnicodeSet21applyIntPropertyValueE9UPropertyiR10UErrorCode:
  783|  40.5k|UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) {
  784|  40.5k|    if (U_FAILURE(ec) || isFrozen()) { return *this; }
  ------------------
  |  Branch (784:9): [True: 0, False: 40.5k]
  |  Branch (784:26): [True: 0, False: 40.5k]
  ------------------
  785|  40.5k|    if (prop == UCHAR_GENERAL_CATEGORY_MASK) {
  ------------------
  |  Branch (785:9): [True: 12, False: 40.5k]
  ------------------
  786|     12|        const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
  787|     12|        applyFilter(generalCategoryMaskFilter, &value, inclusions, ec);
  788|  40.5k|    } else if (prop == UCHAR_SCRIPT_EXTENSIONS) {
  ------------------
  |  Branch (788:16): [True: 0, False: 40.5k]
  ------------------
  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|  40.5k|    } else if (prop == UCHAR_IDENTIFIER_TYPE) {
  ------------------
  |  Branch (792:16): [True: 0, False: 40.5k]
  ------------------
  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|  40.5k|    } else if (0 <= prop && prop < UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (796:16): [True: 40.5k, False: 0]
  |  Branch (796:29): [True: 1, False: 40.5k]
  ------------------
  797|      1|        if (value == 0 || value == 1) {
  ------------------
  |  Branch (797:13): [True: 0, False: 1]
  |  Branch (797:27): [True: 1, False: 0]
  ------------------
  798|      1|            const USet *set = u_getBinaryPropertySet(prop, &ec);
  ------------------
  |  |  269|      1|#define u_getBinaryPropertySet U_ICU_ENTRY_POINT_RENAME(u_getBinaryPropertySet)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  799|      1|            if (U_FAILURE(ec)) { return *this; }
  ------------------
  |  Branch (799:17): [True: 0, False: 1]
  ------------------
  800|      1|            copyFrom(*UnicodeSet::fromUSet(set), true);
  801|      1|            if (value == 0) {
  ------------------
  |  Branch (801:17): [True: 0, False: 1]
  ------------------
  802|      0|                complement().removeAllStrings();  // code point complement
  803|      0|            }
  804|      1|        } else {
  805|      0|            clear();
  806|      0|        }
  807|  40.5k|    } else if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (807:16): [True: 40.5k, False: 0]
  |  Branch (807:43): [True: 40.5k, False: 0]
  ------------------
  808|  40.5k|        const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
  809|  40.5k|        IntPropertyContext c = {prop, value};
  810|  40.5k|        applyFilter(intPropertyFilter, &c, inclusions, ec);
  811|  40.5k|    } else {
  812|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
  813|      0|    }
  814|  40.5k|    return *this;
  815|  40.5k|}
_ZN6icu_7810UnicodeSet18applyPropertyAliasERKNS_13UnicodeStringES3_R10UErrorCode:
  820|     33|                               UErrorCode& ec) {
  821|     33|    if (U_FAILURE(ec) || isFrozen()) return *this;
  ------------------
  |  Branch (821:9): [True: 0, False: 33]
  |  Branch (821:26): [True: 0, False: 33]
  ------------------
  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|     33|    if( !uprv_isInvariantUString(prop.getBuffer(), prop.length()) ||
  ------------------
  |  | 1518|     33|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  123|     33|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     33|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     33|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (829:9): [True: 0, False: 33]
  ------------------
  830|     33|        !uprv_isInvariantUString(value.getBuffer(), value.length())
  ------------------
  |  | 1518|     33|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  123|     33|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     33|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     33|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (830:9): [True: 0, False: 33]
  ------------------
  831|     33|    ) {
  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|     33|    CharString pname, vname;
  835|     33|    pname.appendInvariantChars(prop, ec);
  836|     33|    vname.appendInvariantChars(value, ec);
  837|     33|    if (U_FAILURE(ec)) return *this;
  ------------------
  |  Branch (837:9): [True: 0, False: 33]
  ------------------
  838|       |
  839|     33|    UProperty p;
  840|     33|    int32_t v;
  841|     33|    UBool invert = false;
  842|       |
  843|     33|    if (value.length() > 0) {
  ------------------
  |  Branch (843:9): [True: 8, False: 25]
  ------------------
  844|      8|        p = u_getPropertyEnum(pname.data());
  ------------------
  |  |  283|      8|#define u_getPropertyEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyEnum)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  845|      8|        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: 8]
  ------------------
  846|       |
  847|       |        // Treat gc as gcm
  848|      8|        if (p == UCHAR_GENERAL_CATEGORY) {
  ------------------
  |  Branch (848:13): [True: 0, False: 8]
  ------------------
  849|      0|            p = UCHAR_GENERAL_CATEGORY_MASK;
  850|      0|        }
  851|       |
  852|      8|        if ((p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) ||
  ------------------
  |  Branch (852:14): [True: 8, False: 0]
  |  Branch (852:41): [True: 0, False: 8]
  ------------------
  853|      8|            (p >= UCHAR_INT_START && p < UCHAR_INT_LIMIT) ||
  ------------------
  |  Branch (853:14): [True: 8, False: 0]
  |  Branch (853:38): [True: 8, False: 0]
  ------------------
  854|      8|            (p >= UCHAR_MASK_START && p < UCHAR_MASK_LIMIT)) {
  ------------------
  |  Branch (854:14): [True: 0, False: 0]
  |  Branch (854:39): [True: 0, False: 0]
  ------------------
  855|      8|            v = u_getPropertyValueEnum(p, vname.data());
  ------------------
  |  |  285|      8|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  856|      8|            if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (856:17): [True: 0, False: 8]
  ------------------
  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|      8|        }
  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|      8|    }
  943|       |
  944|     25|    else {
  945|       |        // value is empty.  Interpret as General Category, Script, or
  946|       |        // Binary property.
  947|     25|        p = UCHAR_GENERAL_CATEGORY_MASK;
  948|     25|        v = u_getPropertyValueEnum(p, pname.data());
  ------------------
  |  |  285|     25|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  949|     25|        if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (949:13): [True: 13, False: 12]
  ------------------
  950|     13|            p = UCHAR_SCRIPT;
  951|     13|            v = u_getPropertyValueEnum(p, pname.data());
  ------------------
  |  |  285|     13|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  952|     13|            if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (952:17): [True: 1, False: 12]
  ------------------
  953|      1|                p = u_getPropertyEnum(pname.data());
  ------------------
  |  |  283|      1|#define u_getPropertyEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyEnum)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  954|      1|                if (p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (954:21): [True: 1, False: 0]
  |  Branch (954:48): [True: 1, False: 0]
  ------------------
  955|      1|                    v = 1;
  956|      1|                } 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|      1|            }
  971|     13|        }
  972|     25|    }
  973|       |
  974|     33|    applyIntPropertyValue(p, v, ec);
  975|     33|    if(invert) {
  ------------------
  |  Branch (975:8): [True: 0, False: 33]
  ------------------
  976|      0|        complement().removeAllStrings();  // code point complement
  977|      0|    }
  978|       |
  979|     33|    if (isBogus() && U_SUCCESS(ec)) {
  ------------------
  |  Branch (979:9): [True: 0, False: 33]
  |  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|     33|    return *this;
  984|     33|}
_ZN6icu_7810UnicodeSet24resemblesPropertyPatternERNS_21RuleCharacterIteratorEi:
 1014|     76|                                           int32_t iterOpts) {
 1015|       |    // NOTE: literal will always be false, because we don't parse escapes.
 1016|     76|    UBool result = false, literal;
 1017|     76|    UErrorCode ec = U_ZERO_ERROR;
 1018|     76|    iterOpts &= ~RuleCharacterIterator::PARSE_ESCAPES;
 1019|     76|    RuleCharacterIterator::Pos pos;
 1020|     76|    chars.getPos(pos);
 1021|     76|    UChar32 c = chars.next(iterOpts, literal, ec);
 1022|     76|    if (c == u'[' || c == u'\\') {
  ------------------
  |  Branch (1022:9): [True: 45, False: 31]
  |  Branch (1022:22): [True: 6, False: 25]
  ------------------
 1023|     51|        UChar32 d = chars.next(iterOpts & ~RuleCharacterIterator::SKIP_WHITESPACE,
 1024|     51|                               literal, ec);
 1025|     51|        result = (c == u'[') ? (d == u':') :
  ------------------
  |  Branch (1025:18): [True: 45, False: 6]
  ------------------
 1026|     51|                               (d == u'N' || d == u'p' || d == u'P');
  ------------------
  |  Branch (1026:33): [True: 0, False: 6]
  |  Branch (1026:46): [True: 0, False: 6]
  |  Branch (1026:59): [True: 0, False: 6]
  ------------------
 1027|     51|    }
 1028|     76|    chars.setPos(pos);
 1029|     76|    return result && U_SUCCESS(ec);
  ------------------
  |  Branch (1029:12): [True: 33, False: 43]
  |  Branch (1029:22): [True: 33, False: 0]
  ------------------
 1030|     76|}
_ZN6icu_7810UnicodeSet20applyPropertyPatternERKNS_13UnicodeStringERNS_13ParsePositionER10UErrorCode:
 1037|     33|                                             UErrorCode &ec) {
 1038|     33|    int32_t pos = ppos.getIndex();
 1039|       |
 1040|     33|    UBool posix = false; // true for [:pat:], false for \p{pat} \P{pat} \N{pat}
 1041|     33|    UBool isName = false; // true for \N{pat}, o/w false
 1042|     33|    UBool invert = false;
 1043|       |
 1044|     33|    if (U_FAILURE(ec)) return *this;
  ------------------
  |  Branch (1044:9): [True: 0, False: 33]
  ------------------
 1045|       |
 1046|       |    // Minimum length is 5 characters, e.g. \p{L}
 1047|     33|    if ((pos+5) > pattern.length()) {
  ------------------
  |  Branch (1047:9): [True: 0, False: 33]
  ------------------
 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|     33|    if (isPOSIXOpen(pattern, pos)) {
  ------------------
  |  Branch (1053:9): [True: 33, False: 0]
  ------------------
 1054|     33|        posix = true;
 1055|     33|        pos += 2;
 1056|     33|        pos = ICU_Utility::skipWhitespace(pattern, pos);
 1057|     33|        if (pos < pattern.length() && pattern.charAt(pos) == u'^') {
  ------------------
  |  Branch (1057:13): [True: 33, False: 0]
  |  Branch (1057:39): [True: 0, False: 33]
  ------------------
 1058|      0|            ++pos;
 1059|      0|            invert = true;
 1060|      0|        }
 1061|     33|    } 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|     33|    int32_t close;
 1078|     33|    if (posix) {
  ------------------
  |  Branch (1078:9): [True: 33, False: 0]
  ------------------
 1079|     33|      close = pattern.indexOf(u":]", 2, pos);
 1080|     33|    } else {
 1081|      0|      close = pattern.indexOf(u'}', pos);
 1082|      0|    }
 1083|     33|    if (close < 0) {
  ------------------
  |  Branch (1083:9): [True: 0, False: 33]
  ------------------
 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|     33|    int32_t equals = pattern.indexOf(u'=', pos);
 1092|     33|    UnicodeString propName, valueName;
 1093|     33|    if (equals >= 0 && equals < close && !isName) {
  ------------------
  |  Branch (1093:9): [True: 16, False: 17]
  |  Branch (1093:24): [True: 8, False: 8]
  |  Branch (1093:42): [True: 8, False: 0]
  ------------------
 1094|       |        // Equals seen; parse medium/long pattern
 1095|      8|        pattern.extractBetween(pos, equals, propName);
 1096|      8|        pattern.extractBetween(equals+1, close, valueName);
 1097|      8|    }
 1098|       |
 1099|     25|    else {
 1100|       |        // Handle case where no '=' is seen, and \N{}
 1101|     25|        pattern.extractBetween(pos, close, propName);
 1102|       |            
 1103|       |        // Handle \N{name}
 1104|     25|        if (isName) {
  ------------------
  |  Branch (1104:13): [True: 0, False: 25]
  ------------------
 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|     25|    }
 1114|       |
 1115|     33|    applyPropertyAlias(propName, valueName, ec);
 1116|       |
 1117|     33|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (1117:9): [True: 33, False: 0]
  ------------------
 1118|     33|        if (invert) {
  ------------------
  |  Branch (1118:13): [True: 0, False: 33]
  ------------------
 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|     33|        ppos.setIndex(close + (posix ? 2 : 1));
  ------------------
  |  Branch (1124:32): [True: 33, False: 0]
  ------------------
 1125|     33|    }
 1126|       |
 1127|     33|    return *this;
 1128|     33|}
_ZN6icu_7810UnicodeSet20applyPropertyPatternERNS_21RuleCharacterIteratorERNS_13UnicodeStringER10UErrorCode:
 1141|     33|                                      UErrorCode& ec) {
 1142|     33|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (1142:9): [True: 0, False: 33]
  ------------------
 1143|     33|    UnicodeString pattern;
 1144|     33|    chars.lookahead(pattern);
 1145|     33|    ParsePosition pos(0);
 1146|     33|    applyPropertyPattern(pattern, pos, ec);
 1147|     33|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (1147:9): [True: 0, False: 33]
  ------------------
 1148|     33|    if (pos.getIndex() == 0) {
  ------------------
  |  Branch (1148:9): [True: 0, False: 33]
  ------------------
 1149|       |        // syntaxError(chars, "Invalid property pattern");
 1150|      0|        ec = U_MALFORMED_SET;
 1151|      0|        return;
 1152|      0|    }
 1153|     33|    chars.jumpahead(pos.getIndex());
 1154|     33|    rebuiltPat.append(pattern, 0, pos.getIndex());
 1155|     33|}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointerC2Ev:
  232|     13|    inline UnicodeSetPointer() : p(nullptr) {}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointer8allocateEv:
  235|     33|    inline UBool allocate() {
  236|     33|        if (p == nullptr) {
  ------------------
  |  Branch (236:13): [True: 12, False: 21]
  ------------------
  237|     12|            p = new UnicodeSet();
  238|     12|        }
  239|     33|        return p != nullptr;
  240|     33|    }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointer7pointerEv:
  234|     33|    inline UnicodeSet* pointer() { return p; }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointerD2Ev:
  233|     13|    inline ~UnicodeSetPointer() { delete p; }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_125generalCategoryMaskFilterEiPv:
  667|  72.0k|UBool generalCategoryMaskFilter(UChar32 ch, void* context) {
  668|  72.0k|    int32_t value = *static_cast<int32_t*>(context);
  669|  72.0k|    return (U_GET_GC_MASK((UChar32) ch) & value) != 0;
  ------------------
  |  | 3644|  72.0k|#define U_GET_GC_MASK(c) U_MASK(u_charType(c))
  |  |  ------------------
  |  |  |  |  174|  72.0k|#define U_MASK(x) ((uint32_t)1<<(x))
  |  |  ------------------
  ------------------
  670|  72.0k|}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117intPropertyFilterEiPv:
  685|  69.3M|UBool intPropertyFilter(UChar32 ch, void* context) {
  686|  69.3M|    IntPropertyContext* c = static_cast<IntPropertyContext*>(context);
  687|  69.3M|    return u_getIntPropertyValue(ch, c->prop) == c->value;
  ------------------
  |  |  280|  69.3M|#define u_getIntPropertyValue U_ICU_ENTRY_POINT_RENAME(u_getIntPropertyValue)
  |  |  ------------------
  |  |  |  |  123|  69.3M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  69.3M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  69.3M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  688|  69.3M|}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_111isPOSIXOpenERKNS_13UnicodeStringEi:
  129|     33|isPOSIXOpen(const UnicodeString &pattern, int32_t pos) {
  130|     33|    return pattern.charAt(pos)==u'[' && pattern.charAt(pos+1)==u':';
  ------------------
  |  Branch (130:12): [True: 33, False: 0]
  |  Branch (130:41): [True: 33, False: 0]
  ------------------
  131|     33|}

_ZN6icu_7811ReplaceableD2Ev:
  106|  5.14M|Replaceable::~Replaceable() {}
_ZN6icu_7813UnicodeString9removeRefEv:
  151|  75.4k|UnicodeString::removeRef() {
  152|  75.4k|  return umtx_atomic_dec(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1);
  153|  75.4k|}
_ZNK6icu_7813UnicodeString8refCountEv:
  156|  26.2M|UnicodeString::refCount() const {
  157|  26.2M|  return umtx_loadAcquire(*(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1));
  158|  26.2M|}
_ZN6icu_7813UnicodeString12releaseArrayEv:
  161|  7.58M|UnicodeString::releaseArray() {
  162|  7.58M|  if((fUnion.fFields.fLengthAndFlags & kRefCounted) && removeRef() == 0) {
  ------------------
  |  Branch (162:6): [True: 75.4k, False: 7.51M]
  |  Branch (162:56): [True: 75.4k, False: 0]
  ------------------
  163|  75.4k|    uprv_free(reinterpret_cast<int32_t*>(fUnion.fFields.fArray) - 1);
  ------------------
  |  | 1503|  75.4k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  75.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  75.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  75.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|  75.4k|  }
  165|  7.58M|}
_ZN6icu_7813UnicodeStringC2Ei:
  221|    381|UnicodeString::UnicodeString(UChar32 ch) {
  222|    381|  fUnion.fFields.fLengthAndFlags = kShortString;
  223|    381|  int32_t i = 0;
  224|    381|  UBool isError = false;
  225|    381|  U16_APPEND(fUnion.fStackFields.fBuffer, i, US_STACKBUF_SIZE, ch, isError);
  ------------------
  |  |  393|    381|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    381|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|    381|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 89, False: 292]
  |  |  ------------------
  |  |  395|     89|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|    292|    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
  |  |  ------------------
  |  |  |  Branch (396:15): [True: 292, False: 0]
  |  |  |  Branch (396:42): [True: 292, False: 0]
  |  |  ------------------
  |  |  397|    292|        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
  |  |  398|    292|        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
  |  |  399|    292|    } else /* c>0x10ffff or not enough space */ { \
  |  |  400|      0|        (isError)=true; \
  |  |  401|      0|    } \
  |  |  402|    381|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    381|#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|    381|  if(!isError) {
  ------------------
  |  Branch (228:6): [True: 381, False: 0]
  ------------------
  229|    381|    setShortLength(i);
  230|    381|  }
  231|    381|}
_ZN6icu_7813UnicodeStringC2EaNS_14ConstChar16PtrEi:
  241|  91.7k|                             int32_t textLength) {
  242|  91.7k|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
  243|  91.7k|  const char16_t *text = textPtr;
  244|  91.7k|  if(text == nullptr) {
  ------------------
  |  Branch (244:6): [True: 0, False: 91.7k]
  ------------------
  245|       |    // treat as an empty string, do not alias
  246|      0|    setToEmpty();
  247|  91.7k|  } else if(textLength < -1 ||
  ------------------
  |  Branch (247:13): [True: 0, False: 91.7k]
  ------------------
  248|  91.7k|            (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (248:14): [True: 0, False: 91.7k]
  |  Branch (248:34): [True: 0, False: 0]
  ------------------
  249|  91.7k|            (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (249:14): [True: 91.7k, False: 0]
  |  Branch (249:33): [True: 224, False: 91.5k]
  |  Branch (249:49): [True: 0, False: 224]
  ------------------
  250|  91.7k|  ) {
  251|      0|    setToBogus();
  252|  91.7k|  } else {
  253|  91.7k|    if(textLength == -1) {
  ------------------
  |  Branch (253:8): [True: 0, False: 91.7k]
  ------------------
  254|       |      // text is terminated, or else it would have failed the above test
  255|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|      0|    }
  257|  91.7k|    setArray(const_cast<char16_t *>(text), textLength,
  258|  91.7k|             isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (258:14): [True: 224, False: 91.5k]
  ------------------
  259|  91.7k|  }
  260|  91.7k|}
_ZN6icu_7813UnicodeStringC2ERKS0_:
  345|  5.99k|UnicodeString::UnicodeString(const UnicodeString& that) {
  346|  5.99k|  fUnion.fFields.fLengthAndFlags = kShortString;
  347|  5.99k|  copyFrom(that);
  348|  5.99k|}
_ZN6icu_7813UnicodeStringC2ERKS0_ii:
  362|    988|                             int32_t srcLength) {
  363|    988|  fUnion.fFields.fLengthAndFlags = kShortString;
  364|    988|  setTo(that, srcStart, srcLength);
  365|    988|}
_ZN6icu_7813UnicodeString8allocateEi:
  409|   113k|UnicodeString::allocate(int32_t capacity) {
  410|   113k|  if(capacity <= US_STACKBUF_SIZE) {
  ------------------
  |  Branch (410:6): [True: 5.61k, False: 107k]
  ------------------
  411|  5.61k|    fUnion.fFields.fLengthAndFlags = kShortString;
  412|  5.61k|    return true;
  413|  5.61k|  }
  414|   107k|  if(capacity <= kMaxCapacity) {
  ------------------
  |  Branch (414:6): [True: 107k, False: 0]
  ------------------
  415|   107k|    ++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|   107k|    size_t numBytes = sizeof(int32_t) + static_cast<size_t>(capacity) * U_SIZEOF_UCHAR;
  ------------------
  |  |  352|   107k|#define U_SIZEOF_UCHAR 2
  ------------------
  419|       |    // Round up to a multiple of 16.
  420|   107k|    numBytes = (numBytes + 15) & ~15;
  421|   107k|    int32_t* array = static_cast<int32_t*>(uprv_malloc(numBytes));
  ------------------
  |  | 1524|   107k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|   107k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   107k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   107k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  422|   107k|    if(array != nullptr) {
  ------------------
  |  Branch (422:8): [True: 107k, False: 0]
  ------------------
  423|       |      // set initial refCount and point behind the refCount
  424|   107k|      *array++ = 1;
  425|   107k|      numBytes -= sizeof(int32_t);
  426|       |
  427|       |      // have fArray point to the first char16_t
  428|   107k|      fUnion.fFields.fArray = reinterpret_cast<char16_t*>(array);
  429|   107k|      fUnion.fFields.fCapacity = static_cast<int32_t>(numBytes / U_SIZEOF_UCHAR);
  ------------------
  |  |  352|   107k|#define U_SIZEOF_UCHAR 2
  ------------------
  430|   107k|      fUnion.fFields.fLengthAndFlags = kLongString;
  431|   107k|      return true;
  432|   107k|    }
  433|   107k|  }
  434|      0|  fUnion.fFields.fLengthAndFlags = kIsBogus;
  435|      0|  fUnion.fFields.fArray = nullptr;
  436|      0|  fUnion.fFields.fCapacity = 0;
  437|      0|  return false;
  438|   107k|}
_ZN6icu_7813UnicodeStringD2Ev:
  462|  5.14M|{
  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|  5.14M|  releaseArray();
  478|  5.14M|}
_ZN6icu_7813UnicodeString8fromUTF8ENS_11StringPieceE:
  484|  14.7k|UnicodeString UnicodeString::fromUTF8(StringPiece utf8) {
  485|  14.7k|  UnicodeString result;
  486|  14.7k|  result.setToUTF8(utf8);
  487|  14.7k|  return result;
  488|  14.7k|}
_ZN6icu_7813UnicodeStringaSERKS0_:
  527|  4.68k|UnicodeString::operator=(const UnicodeString &src) {
  528|  4.68k|  return copyFrom(src);
  529|  4.68k|}
_ZN6icu_7813UnicodeString12fastCopyFromERKS0_:
  532|  5.10k|UnicodeString::fastCopyFrom(const UnicodeString &src) {
  533|  5.10k|  return copyFrom(src, true);
  534|  5.10k|}
_ZN6icu_7813UnicodeString8copyFromERKS0_a:
  537|  15.7k|UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) {
  538|       |  // if assigning to ourselves, do nothing
  539|  15.7k|  if(this == &src) {
  ------------------
  |  Branch (539:6): [True: 0, False: 15.7k]
  ------------------
  540|      0|    return *this;
  541|      0|  }
  542|       |
  543|       |  // is the right side bogus?
  544|  15.7k|  if(src.isBogus()) {
  ------------------
  |  Branch (544:6): [True: 0, False: 15.7k]
  ------------------
  545|      0|    setToBogus();
  546|      0|    return *this;
  547|      0|  }
  548|       |
  549|       |  // delete the current contents
  550|  15.7k|  releaseArray();
  551|       |
  552|  15.7k|  if(src.isEmpty()) {
  ------------------
  |  Branch (552:6): [True: 0, False: 15.7k]
  ------------------
  553|       |    // empty string - use the stack buffer
  554|      0|    setToEmpty();
  555|      0|    return *this;
  556|      0|  }
  557|       |
  558|       |  // fLength>0 and not an "open" src.getBuffer(minCapacity)
  559|  15.7k|  fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  560|  15.7k|  switch(src.fUnion.fFields.fLengthAndFlags & kAllStorageFlags) {
  561|  5.06k|  case kShortString:
  ------------------
  |  Branch (561:3): [True: 5.06k, False: 10.7k]
  ------------------
  562|       |    // short string using the stack buffer, do the same
  563|  5.06k|    uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|  5.06k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  5.06k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  5.06k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  5.06k|    _Pragma("clang diagnostic push") \
  |  |   45|  5.06k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  5.06k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  5.06k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  5.06k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  5.06k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  5.06k|    _Pragma("clang diagnostic pop") \
  |  |   49|  5.06k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  5.06k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  5.06k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  5.06k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  564|  5.06k|                getShortLength() * U_SIZEOF_UCHAR);
  565|  5.06k|    break;
  566|      0|  case kLongString:
  ------------------
  |  Branch (566:3): [True: 0, False: 15.7k]
  ------------------
  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|      0|    const_cast<UnicodeString &>(src).addRef();
  570|       |    // copy all fields, share the reference-counted buffer
  571|      0|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  572|      0|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  573|      0|    if(!hasShortLength()) {
  ------------------
  |  Branch (573:8): [True: 0, False: 0]
  ------------------
  574|      0|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  575|      0|    }
  576|      0|    break;
  577|  10.7k|  case kReadonlyAlias:
  ------------------
  |  Branch (577:3): [True: 10.7k, False: 5.06k]
  ------------------
  578|  10.7k|    if(fastCopy) {
  ------------------
  |  Branch (578:8): [True: 5.10k, False: 5.61k]
  ------------------
  579|       |      // src is a readonly alias, do the same
  580|       |      // -> maintain the readonly alias as such
  581|  5.10k|      fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  582|  5.10k|      fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  583|  5.10k|      if(!hasShortLength()) {
  ------------------
  |  Branch (583:10): [True: 0, False: 5.10k]
  ------------------
  584|      0|        fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  585|      0|      }
  586|  5.10k|      break;
  587|  5.10k|    }
  588|       |    // else if(!fastCopy) fall through to case kWritableAlias
  589|       |    // -> allocate a new buffer and copy the contents
  590|  5.61k|    U_FALLTHROUGH;
  ------------------
  |  |  511|  5.61k|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  591|  5.61k|  case kWritableAlias: {
  ------------------
  |  Branch (591:3): [True: 0, False: 15.7k]
  ------------------
  592|       |    // src is a writable alias; we make a copy of that instead
  593|  5.61k|    int32_t srcLength = src.length();
  594|  5.61k|    if(allocate(srcLength)) {
  ------------------
  |  Branch (594:8): [True: 5.61k, False: 0]
  ------------------
  595|  5.61k|      u_memcpy(getArrayStart(), src.getArrayStart(), srcLength);
  ------------------
  |  |  334|  5.61k|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|  5.61k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.61k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.61k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  596|  5.61k|      setLength(srcLength);
  597|  5.61k|      break;
  598|  5.61k|    }
  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: 15.7k]
  ------------------
  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|  15.7k|  }
  610|       |
  611|  15.7k|  return *this;
  612|  15.7k|}
_ZN6icu_7813UnicodeStringaSEOS0_:
  614|   220k|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|   220k|  releaseArray();
  618|   220k|  copyFieldsFrom(src, true);
  619|   220k|  return *this;
  620|   220k|}
_ZN6icu_7813UnicodeString14copyFieldsFromERS0_a:
  623|   220k|void UnicodeString::copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) noexcept {
  624|   220k|  int16_t lengthAndFlags = fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  625|   220k|  if(lengthAndFlags & kUsingStackBuffer) {
  ------------------
  |  Branch (625:6): [True: 171k, False: 48.5k]
  ------------------
  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|   171k|    if(this != &src) {
  ------------------
  |  Branch (629:8): [True: 171k, False: 0]
  ------------------
  630|   171k|      uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|   171k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   171k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   171k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   171k|    _Pragma("clang diagnostic push") \
  |  |   45|   171k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   171k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   171k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   171k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   171k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   171k|    _Pragma("clang diagnostic pop") \
  |  |   49|   171k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   171k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   171k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   171k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  631|   171k|                  getShortLength() * U_SIZEOF_UCHAR);
  632|   171k|    }
  633|   171k|  } else {
  634|       |    // In all other cases, copy all fields.
  635|  48.5k|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  636|  48.5k|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  637|  48.5k|    if(!hasShortLength()) {
  ------------------
  |  Branch (637:8): [True: 16.1k, False: 32.4k]
  ------------------
  638|  16.1k|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  639|  16.1k|    }
  640|  48.5k|    if(setSrcToBogus) {
  ------------------
  |  Branch (640:8): [True: 48.5k, False: 0]
  ------------------
  641|       |      // Set src to bogus without releasing any memory.
  642|  48.5k|      src.fUnion.fFields.fLengthAndFlags = kIsBogus;
  643|  48.5k|      src.fUnion.fFields.fArray = nullptr;
  644|  48.5k|      src.fUnion.fFields.fCapacity = 0;
  645|  48.5k|    }
  646|  48.5k|  }
  647|   220k|}
_ZNK6icu_7813UnicodeString10unescapeAtERi:
  690|      7|UChar32 UnicodeString::unescapeAt(int32_t &offset) const {
  691|      7|    return u_unescapeAt(UnicodeString_charAt, &offset, length(), (void*)this);
  ------------------
  |  |  416|      7|#define u_unescapeAt U_ICU_ENTRY_POINT_RENAME(u_unescapeAt)
  |  |  ------------------
  |  |  |  |  123|      7|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      7|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      7|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|      7|}
_ZNK6icu_7813UnicodeString8doEqualsEPKDsi:
  698|   132k|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|   132k|  return uprv_memcmp(getArrayStart(), text, len * U_SIZEOF_UCHAR) == 0;
  ------------------
  |  |  101|   132k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|   132k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  702|   132k|}
_ZNK6icu_7813UnicodeString9doCompareEiiPKDsii:
  752|   252k|{
  753|       |  // compare illegal string values
  754|   252k|  if(isBogus()) {
  ------------------
  |  Branch (754:6): [True: 0, False: 252k]
  ------------------
  755|      0|    return -1;
  756|      0|  }
  757|       |  
  758|       |  // pin indices to legal values
  759|   252k|  pinIndices(start, length);
  760|       |
  761|   252k|  if(srcChars == nullptr) {
  ------------------
  |  Branch (761:6): [True: 0, False: 252k]
  ------------------
  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|   252k|  const char16_t *chars = getArrayStart();
  768|       |
  769|   252k|  chars += start;
  770|   252k|  srcChars += srcStart;
  771|       |
  772|   252k|  int32_t minLength;
  773|   252k|  int8_t lengthResult;
  774|       |
  775|       |  // get the srcLength if necessary
  776|   252k|  if(srcLength < 0) {
  ------------------
  |  Branch (776:6): [True: 0, False: 252k]
  ------------------
  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|   252k|  if(length != srcLength) {
  ------------------
  |  Branch (781:6): [True: 55.4k, False: 196k]
  ------------------
  782|  55.4k|    if(length < srcLength) {
  ------------------
  |  Branch (782:8): [True: 25.1k, False: 30.2k]
  ------------------
  783|  25.1k|      minLength = length;
  784|  25.1k|      lengthResult = -1;
  785|  30.2k|    } else {
  786|  30.2k|      minLength = srcLength;
  787|  30.2k|      lengthResult = 1;
  788|  30.2k|    }
  789|   196k|  } else {
  790|   196k|    minLength = length;
  791|   196k|    lengthResult = 0;
  792|   196k|  }
  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|   252k|  if(minLength > 0 && chars != srcChars) {
  ------------------
  |  Branch (802:6): [True: 252k, False: 0]
  |  Branch (802:23): [True: 250k, False: 1.29k]
  ------------------
  803|   250k|    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|   316k|      do {
  814|   316k|        result = static_cast<int32_t>(*(chars++)) - static_cast<int32_t>(*(srcChars++));
  815|   316k|        if(result != 0) {
  ------------------
  |  Branch (815:12): [True: 246k, False: 69.1k]
  ------------------
  816|   246k|          return static_cast<int8_t>(result >> 15 | 1);
  817|   246k|        }
  818|   316k|      } while(--minLength > 0);
  ------------------
  |  Branch (818:15): [True: 65.2k, False: 3.94k]
  ------------------
  819|   250k|#   endif
  820|   250k|  }
  821|  5.23k|  return lengthResult;
  822|   252k|}
_ZNK6icu_7813UnicodeString8char32AtEi:
  871|   241M|{
  872|   241M|  int32_t len = length();
  873|   241M|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(len)) {
  ------------------
  |  Branch (873:7): [True: 241M, False: 0]
  ------------------
  874|   241M|    const char16_t *array = getArrayStart();
  875|   241M|    UChar32 c;
  876|   241M|    U16_GET(array, 0, offset, len, c);
  ------------------
  |  |  201|   241M|#define U16_GET(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   241M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  202|   241M|    (c)=(s)[i]; \
  |  |  203|   241M|    if(U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|   241M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   241M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:27): [True: 711k, False: 240M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  204|   711k|        uint16_t __c2; \
  |  |  205|   711k|        if(U16_IS_SURROGATE_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   84|   711k|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 711k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  206|   711k|            if((i)+1!=(length) && U16_IS_TRAIL(__c2=(s)[(i)+1])) { \
  |  |  ------------------
  |  |  |  |   67|   711k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 711k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (206:16): [True: 711k, False: 0]
  |  |  ------------------
  |  |  207|   711k|                (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|   711k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|   711k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  208|   711k|            } \
  |  |  209|   711k|        } else { \
  |  |  210|      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 (210:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  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|      0|        } \
  |  |  214|   711k|    } \
  |  |  215|   241M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   241M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  877|   241M|    return c;
  878|   241M|  } else {
  879|      0|    return kInvalidUChar;
  880|      0|  }
  881|   241M|}
_ZNK6icu_7813UnicodeString11countChar32Eii:
  907|  2.19M|UnicodeString::countChar32(int32_t start, int32_t length) const {
  908|  2.19M|  pinIndices(start, length);
  909|       |  // if(isBogus()) then fArray==0 and start==0 - u_countChar32() checks for nullptr
  910|  2.19M|  return u_countChar32(getArrayStart()+start, length);
  ------------------
  |  |  228|  2.19M|#define u_countChar32 U_ICU_ENTRY_POINT_RENAME(u_countChar32)
  |  |  ------------------
  |  |  |  |  123|  2.19M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.19M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.19M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  911|  2.19M|}
_ZNK6icu_7813UnicodeString11moveIndex32Eii:
  921|   185M|UnicodeString::moveIndex32(int32_t index, int32_t delta) const {
  922|       |  // pin index
  923|   185M|  int32_t len = length();
  924|   185M|  if(index<0) {
  ------------------
  |  Branch (924:6): [True: 0, False: 185M]
  ------------------
  925|      0|    index=0;
  926|   185M|  } else if(index>len) {
  ------------------
  |  Branch (926:13): [True: 0, False: 185M]
  ------------------
  927|      0|    index=len;
  928|      0|  }
  929|       |
  930|   185M|  const char16_t *array = getArrayStart();
  931|   185M|  if(delta>0) {
  ------------------
  |  Branch (931:6): [True: 185M, False: 0]
  ------------------
  932|   185M|    U16_FWD_N(array, index, len, delta);
  ------------------
  |  |  474|   185M|#define U16_FWD_N(s, i, length, n) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   185M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  475|   185M|    int32_t __N=(n); \
  |  |  476|   370M|    while(__N>0 && ((i)<(length) || ((length)<0 && (s)[i]!=0))) { \
  |  |  ------------------
  |  |  |  Branch (476:11): [True: 185M, False: 185M]
  |  |  |  Branch (476:21): [True: 185M, False: 0]
  |  |  |  Branch (476:38): [True: 0, False: 0]
  |  |  |  Branch (476:52): [True: 0, False: 0]
  |  |  ------------------
  |  |  477|   185M|        U16_FWD_1(s, i, length); \
  |  |  ------------------
  |  |  |  |  433|   185M|#define U16_FWD_1(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  |  |  ------------------
  |  |  |  |  |  |  169|   185M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  |  |  ------------------
  |  |  |  |  434|   185M|    if(U16_IS_LEAD((s)[(i)++]) && (i)!=(length) && U16_IS_TRAIL((s)[i])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|   370M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (59:24): [True: 701k, False: 184M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |                   if(U16_IS_LEAD((s)[(i)++]) && (i)!=(length) && U16_IS_TRAIL((s)[i])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   67|   701k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:25): [True: 701k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (434:35): [True: 701k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  435|   701k|        ++(i); \
  |  |  |  |  436|   701k|    } \
  |  |  |  |  437|   185M|} UPRV_BLOCK_MACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  178|   185M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  478|   185M|        --__N; \
  |  |  479|   185M|    } \
  |  |  480|   185M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   185M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|   185M|  } else {
  934|      0|    U16_BACK_N(array, 0, index, -delta);
  ------------------
  |  |  684|      0|#define U16_BACK_N(s, start, i, n) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  685|      0|    int32_t __N=(n); \
  |  |  686|      0|    while(__N>0 && (i)>(start)) { \
  |  |  ------------------
  |  |  |  Branch (686:11): [True: 0, False: 0]
  |  |  |  Branch (686:20): [True: 0, False: 0]
  |  |  ------------------
  |  |  687|      0|        U16_BACK_1(s, start, i); \
  |  |  ------------------
  |  |  |  |  643|      0|#define U16_BACK_1(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  |  |  ------------------
  |  |  |  |  644|      0|    if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |                   if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (644:36): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  645|      0|        --(i); \
  |  |  |  |  646|      0|    } \
  |  |  |  |  647|      0|} UPRV_BLOCK_MACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  688|      0|        --__N; \
  |  |  689|      0|    } \
  |  |  690|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  935|      0|  }
  936|       |
  937|   185M|  return index;
  938|   185M|}
_ZNK6icu_7813UnicodeString13tempSubStringEii:
  998|  91.5k|UnicodeString::tempSubString(int32_t start, int32_t len) const {
  999|  91.5k|  pinIndices(start, len);
 1000|  91.5k|  const char16_t *array = getBuffer();  // not getArrayStart() to check kIsBogus & kOpenGetBuffer
 1001|  91.5k|  if(array==nullptr) {
  ------------------
  |  Branch (1001:6): [True: 0, False: 91.5k]
  ------------------
 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|  91.5k|  return UnicodeString(false, array + start, len);
 1006|  91.5k|}
_ZNK6icu_7813UnicodeString14extractBetweenEiiRS0_:
 1040|     41|                  UnicodeString& target) const {
 1041|     41|  pinIndex(start);
 1042|     41|  pinIndex(limit);
 1043|     41|  doExtract(start, limit - start, target);
 1044|     41|}
_ZNK6icu_7813UnicodeString7indexOfEPKDsiiii:
 1112|     33|{
 1113|     33|  if (isBogus() || srcChars == nullptr || srcStart < 0 || srcLength == 0) {
  ------------------
  |  Branch (1113:7): [True: 0, False: 33]
  |  Branch (1113:20): [True: 0, False: 33]
  |  Branch (1113:43): [True: 0, False: 33]
  |  Branch (1113:59): [True: 0, False: 33]
  ------------------
 1114|      0|    return -1;
 1115|      0|  }
 1116|       |
 1117|       |  // UnicodeString does not find empty substrings
 1118|     33|  if(srcLength < 0 && srcChars[srcStart] == 0) {
  ------------------
  |  Branch (1118:6): [True: 0, False: 33]
  |  Branch (1118:23): [True: 0, False: 0]
  ------------------
 1119|      0|    return -1;
 1120|      0|  }
 1121|       |
 1122|       |  // get the indices within bounds
 1123|     33|  pinIndices(start, length);
 1124|       |
 1125|       |  // find the first occurrence of the substring
 1126|     33|  const char16_t *array = getArrayStart();
 1127|     33|  const char16_t *match = u_strFindFirst(array + start, length, srcChars + srcStart, srcLength);
  ------------------
  |  |  361|     33|#define u_strFindFirst U_ICU_ENTRY_POINT_RENAME(u_strFindFirst)
  |  |  ------------------
  |  |  |  |  123|     33|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     33|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     33|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1128|     33|  if(match == nullptr) {
  ------------------
  |  Branch (1128:6): [True: 0, False: 33]
  ------------------
 1129|      0|    return -1;
 1130|     33|  } else {
 1131|     33|    return static_cast<int32_t>(match - array);
 1132|     33|  }
 1133|     33|}
_ZNK6icu_7813UnicodeString9doIndexOfEDsii:
 1139|  4.71k|{
 1140|       |  // pin indices
 1141|  4.71k|  pinIndices(start, length);
 1142|       |
 1143|       |  // find the first occurrence of c
 1144|  4.71k|  const char16_t *array = getArrayStart();
 1145|  4.71k|  const char16_t *match = u_memchr(array + start, c, length);
  ------------------
  |  |  330|  4.71k|#define u_memchr U_ICU_ENTRY_POINT_RENAME(u_memchr)
  |  |  ------------------
  |  |  |  |  123|  4.71k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.71k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.71k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1146|  4.71k|  if(match == nullptr) {
  ------------------
  |  Branch (1146:6): [True: 23, False: 4.69k]
  ------------------
 1147|     23|    return -1;
 1148|  4.69k|  } else {
 1149|  4.69k|    return static_cast<int32_t>(match - array);
 1150|  4.69k|  }
 1151|  4.71k|}
_ZN6icu_7813UnicodeString10setToBogusEv:
 1283|      2|{
 1284|      2|  releaseArray();
 1285|       |
 1286|      2|  fUnion.fFields.fLengthAndFlags = kIsBogus;
 1287|      2|  fUnion.fFields.fArray = nullptr;
 1288|      2|  fUnion.fFields.fCapacity = 0;
 1289|      2|}
_ZN6icu_7813UnicodeString7unBogusEv:
 1293|  15.7k|UnicodeString::unBogus() {
 1294|  15.7k|  if(fUnion.fFields.fLengthAndFlags & kIsBogus) {
  ------------------
  |  Branch (1294:6): [True: 0, False: 15.7k]
  ------------------
 1295|      0|    setToEmpty();
 1296|      0|  }
 1297|  15.7k|}
_ZN6icu_7813UnicodeString5setToEaNS_14ConstChar16PtrEi:
 1342|  2.20M|{
 1343|  2.20M|  if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) {
  ------------------
  |  Branch (1343:6): [True: 0, False: 2.20M]
  ------------------
 1344|       |    // do not modify a string that has an "open" getBuffer(minCapacity)
 1345|      0|    return *this;
 1346|      0|  }
 1347|       |
 1348|  2.20M|  const char16_t *text = textPtr;
 1349|  2.20M|  if(text == nullptr) {
  ------------------
  |  Branch (1349:6): [True: 0, False: 2.20M]
  ------------------
 1350|       |    // treat as an empty string, do not alias
 1351|      0|    releaseArray();
 1352|      0|    setToEmpty();
 1353|      0|    return *this;
 1354|      0|  }
 1355|       |
 1356|  2.20M|  if( textLength < -1 ||
  ------------------
  |  Branch (1356:7): [True: 0, False: 2.20M]
  ------------------
 1357|  2.20M|      (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (1357:8): [True: 0, False: 2.20M]
  |  Branch (1357:28): [True: 0, False: 0]
  ------------------
 1358|  2.20M|      (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (1358:8): [True: 2.20M, False: 0]
  |  Branch (1358:27): [True: 6.48k, False: 2.19M]
  |  Branch (1358:43): [True: 0, False: 6.48k]
  ------------------
 1359|  2.20M|  ) {
 1360|      0|    setToBogus();
 1361|      0|    return *this;
 1362|      0|  }
 1363|       |
 1364|  2.20M|  releaseArray();
 1365|       |
 1366|  2.20M|  if(textLength == -1) {
  ------------------
  |  Branch (1366:6): [True: 0, False: 2.20M]
  ------------------
 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|  2.20M|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
 1371|  2.20M|  setArray(const_cast<char16_t*>(text), textLength, isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (1371:53): [True: 6.48k, False: 2.19M]
  ------------------
 1372|  2.20M|  return *this;
 1373|  2.20M|}
_ZN6icu_7813UnicodeString9setToUTF8ENS_11StringPieceE:
 1411|  14.7k|UnicodeString &UnicodeString::setToUTF8(StringPiece utf8) {
 1412|  14.7k|  unBogus();
 1413|  14.7k|  int32_t length = utf8.length();
 1414|  14.7k|  int32_t capacity;
 1415|       |  // The UTF-16 string will be at most as long as the UTF-8 string.
 1416|  14.7k|  if(length <= US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1416:6): [True: 0, False: 14.7k]
  ------------------
 1417|      0|    capacity = US_STACKBUF_SIZE;
 1418|  14.7k|  } else {
 1419|  14.7k|    capacity = length + 1;  // +1 for the terminating NUL.
 1420|  14.7k|  }
 1421|  14.7k|  char16_t *utf16 = getBuffer(capacity);
 1422|  14.7k|  int32_t length16;
 1423|  14.7k|  UErrorCode errorCode = U_ZERO_ERROR;
 1424|  14.7k|  u_strFromUTF8WithSub(utf16, getCapacity(), &length16,
  ------------------
  |  |  370|  14.7k|#define u_strFromUTF8WithSub U_ICU_ENTRY_POINT_RENAME(u_strFromUTF8WithSub)
  |  |  ------------------
  |  |  |  |  123|  14.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1425|  14.7k|      utf8.data(), length,
 1426|  14.7k|      0xfffd,  // Substitution character.
 1427|  14.7k|      nullptr,    // Don't care about number of substitutions.
 1428|  14.7k|      &errorCode);
 1429|  14.7k|  releaseBuffer(length16);
 1430|  14.7k|  if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (1430:6): [True: 0, False: 14.7k]
  ------------------
 1431|      0|    setToBogus();
 1432|      0|  }
 1433|  14.7k|  return *this;
 1434|  14.7k|}
_ZN6icu_7813UnicodeString6appendEi:
 1468|  27.0M|UnicodeString::append(UChar32 srcChar) {
 1469|  27.0M|  char16_t buffer[U16_MAX_LENGTH];
 1470|  27.0M|  int32_t _length = 0;
 1471|  27.0M|  UBool isError = false;
 1472|  27.0M|  U16_APPEND(buffer, _length, U16_MAX_LENGTH, srcChar, isError);
  ------------------
  |  |  393|  27.0M|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  27.0M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  27.0M|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 26.8M, False: 195k]
  |  |  ------------------
  |  |  395|  26.8M|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  26.8M|    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
  |  |  ------------------
  |  |  |  Branch (396:15): [True: 195k, False: 0]
  |  |  |  Branch (396:42): [True: 195k, False: 0]
  |  |  ------------------
  |  |  397|   195k|        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
  |  |  398|   195k|        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
  |  |  399|   195k|    } else /* c>0x10ffff or not enough space */ { \
  |  |  400|      0|        (isError)=true; \
  |  |  401|      0|    } \
  |  |  402|  27.0M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  27.0M|#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|  27.0M|  return isError ? *this : doAppend(buffer, 0, _length);
  ------------------
  |  Branch (1475:10): [True: 0, False: 27.0M]
  ------------------
 1476|  27.0M|}
_ZN6icu_7813UnicodeString9doReplaceEiiRKS0_ii:
 1484|  1.06k|{
 1485|       |  // pin the indices to legal values
 1486|  1.06k|  src.pinIndices(srcStart, srcLength);
 1487|       |
 1488|       |  // get the characters from src
 1489|       |  // and replace the range in ourselves with them
 1490|  1.06k|  return doReplace(start, length, src.getArrayStart(), srcStart, srcLength);
 1491|  1.06k|}
_ZN6icu_7813UnicodeString9doReplaceEiiPKDsii:
 1499|  1.06k|{
 1500|  1.06k|  if(!isWritable()) {
  ------------------
  |  Branch (1500:6): [True: 0, False: 1.06k]
  ------------------
 1501|      0|    return *this;
 1502|      0|  }
 1503|       |
 1504|  1.06k|  int32_t oldLength = this->length();
 1505|       |
 1506|       |  // optimize (read-only alias).remove(0, start) and .remove(start, end)
 1507|  1.06k|  if((fUnion.fFields.fLengthAndFlags&kBufferIsReadonly) && srcLength == 0) {
  ------------------
  |  Branch (1507:6): [True: 0, False: 1.06k]
  |  Branch (1507:60): [True: 0, False: 0]
  ------------------
 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|  1.06k|  if(start == oldLength) {
  ------------------
  |  Branch (1526:6): [True: 1.06k, False: 0]
  ------------------
 1527|  1.06k|    return doAppend(srcChars, srcStart, srcLength);
 1528|  1.06k|  }
 1529|       |
 1530|      0|  if (srcChars == nullptr) {
  ------------------
  |  Branch (1530:7): [True: 0, False: 0]
  ------------------
 1531|      0|    srcLength = 0;
 1532|      0|  } else {
 1533|       |    // Perform all remaining operations relative to srcChars + srcStart.
 1534|       |    // From this point forward, do not use srcStart.
 1535|      0|    srcChars += srcStart;
 1536|      0|    if (srcLength < 0) {
  ------------------
  |  Branch (1536:9): [True: 0, False: 0]
  ------------------
 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|      0|  }
 1541|       |
 1542|       |  // pin the indices to legal values
 1543|      0|  pinIndices(start, length);
 1544|       |
 1545|       |  // Calculate the size of the string after the replace.
 1546|       |  // Avoid int32_t overflow.
 1547|      0|  int32_t newLength = oldLength - length;
 1548|      0|  if(srcLength > (INT32_MAX - newLength)) {
  ------------------
  |  Branch (1548:6): [True: 0, False: 0]
  ------------------
 1549|      0|    setToBogus();
 1550|      0|    return *this;
 1551|      0|  }
 1552|      0|  newLength += srcLength;
 1553|       |
 1554|       |  // Check for insertion into ourself
 1555|      0|  const char16_t *oldArray = getArrayStart();
 1556|      0|  if (isBufferWritable() &&
  ------------------
  |  Branch (1556:7): [True: 0, False: 0]
  ------------------
 1557|      0|      oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1557:7): [True: 0, False: 0]
  ------------------
 1558|      0|      srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1558:7): [True: 0, False: 0]
  ------------------
 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|      0|  char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1571|      0|  if((fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) && (newLength > US_STACKBUF_SIZE)) {
  ------------------
  |  Branch (1571:6): [True: 0, False: 0]
  |  Branch (1571:60): [True: 0, False: 0]
  ------------------
 1572|       |    // copy the stack buffer contents because it will be overwritten with
 1573|       |    // fUnion.fFields values
 1574|      0|    u_memcpy(oldStackBuffer, oldArray, oldLength);
  ------------------
  |  |  334|      0|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1575|      0|    oldArray = oldStackBuffer;
 1576|      0|  }
 1577|       |
 1578|       |  // clone our array and allocate a bigger array if needed
 1579|      0|  int32_t *bufferToDelete = nullptr;
 1580|      0|  if(!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength),
  ------------------
  |  Branch (1580:6): [True: 0, False: 0]
  ------------------
 1581|      0|                         false, &bufferToDelete)
 1582|      0|  ) {
 1583|      0|    return *this;
 1584|      0|  }
 1585|       |
 1586|       |  // now do the replace
 1587|       |
 1588|      0|  char16_t *newArray = getArrayStart();
 1589|      0|  if(newArray != oldArray) {
  ------------------
  |  Branch (1589:6): [True: 0, False: 0]
  ------------------
 1590|       |    // if fArray changed, then we need to copy everything except what will change
 1591|      0|    us_arrayCopy(oldArray, 0, newArray, 0, start);
 1592|      0|    us_arrayCopy(oldArray, start + length,
 1593|      0|                 newArray, start + srcLength,
 1594|      0|                 oldLength - (start + length));
 1595|      0|  } else if(length != srcLength) {
  ------------------
  |  Branch (1595:13): [True: 0, False: 0]
  ------------------
 1596|       |    // fArray did not change; copy only the portion that isn't changing, leaving a hole
 1597|      0|    us_arrayCopy(oldArray, start + length,
 1598|      0|                 newArray, start + srcLength,
 1599|      0|                 oldLength - (start + length));
 1600|      0|  }
 1601|       |
 1602|       |  // now fill in the hole with the new string
 1603|      0|  us_arrayCopy(srcChars, 0, newArray, start, srcLength);
 1604|       |
 1605|      0|  setLength(newLength);
 1606|       |
 1607|       |  // delayed delete in case srcChars == fArray when we started, and
 1608|       |  // to keep oldArray alive for the above operations
 1609|      0|  if (bufferToDelete) {
  ------------------
  |  Branch (1609:7): [True: 0, False: 0]
  ------------------
 1610|      0|    uprv_free(bufferToDelete);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1611|      0|  }
 1612|       |
 1613|      0|  return *this;
 1614|      0|}
_ZN6icu_7813UnicodeString8doAppendERKS0_ii:
 1632|  23.1M|UnicodeString::doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength) {
 1633|  23.1M|  if(srcLength == 0) {
  ------------------
  |  Branch (1633:6): [True: 0, False: 23.1M]
  ------------------
 1634|      0|    return *this;
 1635|      0|  }
 1636|       |
 1637|       |  // pin the indices to legal values
 1638|  23.1M|  src.pinIndices(srcStart, srcLength);
 1639|  23.1M|  return doAppend(src.getArrayStart(), srcStart, srcLength);
 1640|  23.1M|}
_ZN6icu_7813UnicodeString8doAppendEPKDsii:
 1643|  50.1M|UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) {
 1644|  50.1M|  if(!isWritable() || srcLength == 0 || srcChars == nullptr) {
  ------------------
  |  Branch (1644:6): [True: 0, False: 50.1M]
  |  Branch (1644:23): [True: 0, False: 50.1M]
  |  Branch (1644:41): [True: 0, False: 50.1M]
  ------------------
 1645|      0|    return *this;
 1646|      0|  }
 1647|       |
 1648|       |  // Perform all remaining operations relative to srcChars + srcStart.
 1649|       |  // From this point forward, do not use srcStart.
 1650|  50.1M|  srcChars += srcStart;
 1651|       |
 1652|  50.1M|  if(srcLength < 0) {
  ------------------
  |  Branch (1652:6): [True: 0, False: 50.1M]
  ------------------
 1653|       |    // get the srcLength if necessary
 1654|      0|    if((srcLength = u_strlen(srcChars)) == 0) {
  ------------------
  |  |  393|      0|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1654:8): [True: 0, False: 0]
  ------------------
 1655|      0|      return *this;
 1656|      0|    }
 1657|      0|  }
 1658|       |
 1659|  50.1M|  int32_t oldLength = length();
 1660|  50.1M|  int32_t newLength;
 1661|       |
 1662|  50.1M|  if (srcLength <= getCapacity() - oldLength && isBufferWritable()) {
  ------------------
  |  Branch (1662:7): [True: 50.1M, False: 70.0k]
  |  Branch (1662:49): [True: 50.1M, False: 0]
  ------------------
 1663|  50.1M|    newLength = oldLength + srcLength;
 1664|       |    // Faster than a memmove
 1665|  50.1M|    if (srcLength <= 4) {
  ------------------
  |  Branch (1665:9): [True: 35.5M, False: 14.6M]
  ------------------
 1666|  35.5M|      char16_t *arr = getArrayStart();
 1667|  35.5M|      arr[oldLength] = srcChars[0];
 1668|  35.5M|      if (srcLength > 1) arr[oldLength+1] = srcChars[1];
  ------------------
  |  Branch (1668:11): [True: 426k, False: 35.0M]
  ------------------
 1669|  35.5M|      if (srcLength > 2) arr[oldLength+2] = srcChars[2];
  ------------------
  |  Branch (1669:11): [True: 190k, False: 35.3M]
  ------------------
 1670|  35.5M|      if (srcLength > 3) arr[oldLength+3] = srcChars[3];
  ------------------
  |  Branch (1670:11): [True: 162k, False: 35.3M]
  ------------------
 1671|  35.5M|      setLength(newLength);
 1672|  35.5M|      return *this;
 1673|  35.5M|    }
 1674|  50.1M|  } else {
 1675|  70.0k|    if (uprv_add32_overflow(oldLength, srcLength, &newLength)) {
  ------------------
  |  | 1394|  70.0k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  70.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  70.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  70.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1675:9): [True: 0, False: 70.0k]
  ------------------
 1676|      0|      setToBogus();
 1677|      0|      return *this;
 1678|      0|    }
 1679|       |
 1680|       |    // Check for append onto ourself
 1681|  70.0k|    const char16_t* oldArray = getArrayStart();
 1682|  70.0k|    if (isBufferWritable() &&
  ------------------
  |  Branch (1682:9): [True: 70.0k, False: 0]
  ------------------
 1683|  70.0k|        oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1683:9): [True: 44.5k, False: 25.4k]
  ------------------
 1684|  70.0k|        srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1684:9): [True: 0, False: 44.5k]
  ------------------
 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|  70.0k|    if (!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) {
  ------------------
  |  Branch (1695:9): [True: 0, False: 70.0k]
  ------------------
 1696|      0|      return *this;
 1697|      0|    }
 1698|  70.0k|  }
 1699|       |
 1700|  14.6M|  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|  14.6M|  if(srcChars != newArray + oldLength) {
  ------------------
  |  Branch (1708:6): [True: 14.6M, False: 0]
  ------------------
 1709|  14.6M|    us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength);
 1710|  14.6M|  }
 1711|  14.6M|  setLength(newLength);
 1712|       |
 1713|  14.6M|  return *this;
 1714|  50.1M|}
_ZN6icu_7813UnicodeString8doAppendENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
 1717|     13|UnicodeString::doAppend(std::u16string_view src) {
 1718|     13|  if (!isWritable() || src.empty()) {
  ------------------
  |  Branch (1718:7): [True: 0, False: 13]
  |  Branch (1718:24): [True: 0, False: 13]
  ------------------
 1719|      0|    return *this;
 1720|      0|  }
 1721|     13|  if (src.length() > INT32_MAX) {
  ------------------
  |  Branch (1721:7): [True: 0, False: 13]
  ------------------
 1722|      0|    setToBogus();
 1723|      0|    return *this;
 1724|      0|  }
 1725|     13|  return doAppend(src.data(), 0, static_cast<int32_t>(src.length()));
 1726|     13|}
_ZN6icu_7813UnicodeString9doReverseEii:
 1773|  3.96k|UnicodeString::doReverse(int32_t start, int32_t length) {
 1774|  3.96k|  if(length <= 1 || !cloneArrayIfNeeded()) {
  ------------------
  |  Branch (1774:6): [True: 0, False: 3.96k]
  |  Branch (1774:21): [True: 0, False: 3.96k]
  ------------------
 1775|      0|    return *this;
 1776|      0|  }
 1777|       |
 1778|       |  // pin the indices to legal values
 1779|  3.96k|  pinIndices(start, length);
 1780|  3.96k|  if(length <= 1) {  // pinIndices() might have shrunk the length
  ------------------
  |  Branch (1780:6): [True: 0, False: 3.96k]
  ------------------
 1781|      0|    return *this;
 1782|      0|  }
 1783|       |
 1784|  3.96k|  char16_t *left = getArrayStart() + start;
 1785|  3.96k|  char16_t *right = left + length - 1;  // -1 for inclusive boundary (length>=2)
 1786|  3.96k|  char16_t swap;
 1787|  3.96k|  UBool hasSupplementary = false;
 1788|       |
 1789|       |  // Before the loop we know left<right because length>=2.
 1790|  6.99k|  do {
 1791|  6.99k|    hasSupplementary |= static_cast<UBool>(U16_IS_LEAD(swap = *left));
  ------------------
  |  |   59|  6.99k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  ------------------
 1792|  6.99k|    hasSupplementary |= static_cast<UBool>(U16_IS_LEAD(*left++ = *right));
  ------------------
  |  |   59|  6.99k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  ------------------
 1793|  6.99k|    *right-- = swap;
 1794|  6.99k|  } while(left < right);
  ------------------
  |  Branch (1794:11): [True: 3.02k, False: 3.96k]
  ------------------
 1795|       |  // Make sure to test the middle code unit of an odd-length string.
 1796|       |  // Redundant if the length is even.
 1797|  3.96k|  hasSupplementary |= static_cast<UBool>(U16_IS_LEAD(*left));
  ------------------
  |  |   59|  3.96k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  ------------------
 1798|       |
 1799|       |  /* if there are supplementary code points in the reversed range, then re-swap their surrogates */
 1800|  3.96k|  if(hasSupplementary) {
  ------------------
  |  Branch (1800:6): [True: 0, False: 3.96k]
  ------------------
 1801|      0|    char16_t swap2;
 1802|       |
 1803|      0|    left = getArrayStart() + start;
 1804|      0|    right = left + length - 1; // -1 so that we can look at *(left+1) if left<right
 1805|      0|    while(left < right) {
  ------------------
  |  Branch (1805:11): [True: 0, False: 0]
  ------------------
 1806|      0|      if(U16_IS_TRAIL(swap = *left) && U16_IS_LEAD(swap2 = *(left + 1))) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                    if(U16_IS_TRAIL(swap = *left) && U16_IS_LEAD(swap2 = *(left + 1))) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1807|      0|        *left++ = swap2;
 1808|      0|        *left++ = swap;
 1809|      0|      } else {
 1810|      0|        ++left;
 1811|      0|      }
 1812|      0|    }
 1813|      0|  }
 1814|       |
 1815|  3.96k|  return *this;
 1816|  3.96k|}
_ZNK6icu_7813UnicodeString10doHashCodeEv:
 1864|    605|{
 1865|       |    /* Delegate hash computation to uhash.  This makes UnicodeString
 1866|       |     * hashing consistent with char16_t* hashing.  */
 1867|    605|    int32_t hashCode = ustr_hashUCharsN(getArrayStart(), length());
  ------------------
  |  | 1880|    605|#define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN)
  |  |  ------------------
  |  |  |  |  123|    605|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    605|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    605|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1868|    605|    if (hashCode == kInvalidHashCode) {
  ------------------
  |  Branch (1868:9): [True: 0, False: 605]
  ------------------
 1869|      0|        hashCode = kEmptyHashCode;
 1870|      0|    }
 1871|    605|    return hashCode;
 1872|    605|}
_ZN6icu_7813UnicodeString9getBufferEi:
 1879|  25.3M|UnicodeString::getBuffer(int32_t minCapacity) {
 1880|  25.3M|  if(minCapacity>=-1 && cloneArrayIfNeeded(minCapacity)) {
  ------------------
  |  Branch (1880:6): [True: 25.3M, False: 0]
  |  Branch (1880:25): [True: 25.3M, False: 0]
  ------------------
 1881|  25.3M|    fUnion.fFields.fLengthAndFlags|=kOpenGetBuffer;
 1882|  25.3M|    setZeroLength();
 1883|  25.3M|    return getArrayStart();
 1884|  25.3M|  } else {
 1885|      0|    return nullptr;
 1886|      0|  }
 1887|  25.3M|}
_ZN6icu_7813UnicodeString13releaseBufferEi:
 1890|  25.3M|UnicodeString::releaseBuffer(int32_t newLength) {
 1891|  25.3M|  if(fUnion.fFields.fLengthAndFlags&kOpenGetBuffer && newLength>=-1) {
  ------------------
  |  Branch (1891:6): [True: 25.3M, False: 0]
  |  Branch (1891:55): [True: 25.3M, False: 0]
  ------------------
 1892|       |    // set the new fLength
 1893|  25.3M|    int32_t capacity=getCapacity();
 1894|  25.3M|    if(newLength==-1) {
  ------------------
  |  Branch (1894:8): [True: 0, False: 25.3M]
  ------------------
 1895|       |      // the new length is the string length, capped by fCapacity
 1896|      0|      const char16_t *array=getArrayStart(), *p=array, *limit=array+capacity;
 1897|      0|      while(p<limit && *p!=0) {
  ------------------
  |  Branch (1897:13): [True: 0, False: 0]
  |  Branch (1897:24): [True: 0, False: 0]
  ------------------
 1898|      0|        ++p;
 1899|      0|      }
 1900|      0|      newLength = static_cast<int32_t>(p - array);
 1901|  25.3M|    } else if(newLength>capacity) {
  ------------------
  |  Branch (1901:15): [True: 0, False: 25.3M]
  ------------------
 1902|      0|      newLength=capacity;
 1903|      0|    }
 1904|  25.3M|    setLength(newLength);
 1905|  25.3M|    fUnion.fFields.fLengthAndFlags&=~kOpenGetBuffer;
 1906|  25.3M|  }
 1907|  25.3M|}
_ZN6icu_7813UnicodeString18cloneArrayIfNeededEiiaPPia:
 1917|  25.4M|                                  UBool forceClone) {
 1918|       |  // default parameters need to be static, therefore
 1919|       |  // the defaults are -1 to have convenience defaults
 1920|  25.4M|  if(newCapacity == -1) {
  ------------------
  |  Branch (1920:6): [True: 3.96k, False: 25.4M]
  ------------------
 1921|  3.96k|    newCapacity = getCapacity();
 1922|  3.96k|  }
 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|  25.4M|  if(!isWritable()) {
  ------------------
  |  Branch (1927:6): [True: 0, False: 25.4M]
  ------------------
 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|  25.4M|  if(forceClone ||
  ------------------
  |  Branch (1938:6): [True: 0, False: 25.4M]
  ------------------
 1939|  25.4M|     fUnion.fFields.fLengthAndFlags & kBufferIsReadonly ||
  ------------------
  |  Branch (1939:6): [True: 0, False: 25.4M]
  ------------------
 1940|  25.4M|     (fUnion.fFields.fLengthAndFlags & kRefCounted && refCount() > 1) ||
  ------------------
  |  Branch (1940:7): [True: 394k, False: 25.0M]
  |  Branch (1940:55): [True: 0, False: 394k]
  ------------------
 1941|  25.4M|     newCapacity > getCapacity()
  ------------------
  |  Branch (1941:6): [True: 107k, False: 25.3M]
  ------------------
 1942|  25.4M|  ) {
 1943|       |    // check growCapacity for default value and use of the stack buffer
 1944|   107k|    if(growCapacity < 0) {
  ------------------
  |  Branch (1944:8): [True: 37.5k, False: 70.0k]
  ------------------
 1945|  37.5k|      growCapacity = newCapacity;
 1946|  70.0k|    } else if(newCapacity <= US_STACKBUF_SIZE && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1946:15): [True: 0, False: 70.0k]
  |  Branch (1946:50): [True: 0, False: 0]
  ------------------
 1947|      0|      growCapacity = US_STACKBUF_SIZE;
 1948|  70.0k|    } else if(newCapacity > growCapacity) {
  ------------------
  |  Branch (1948:15): [True: 0, False: 70.0k]
  ------------------
 1949|      0|      setToBogus();
 1950|      0|      return false;  // bad inputs
 1951|      0|    }
 1952|   107k|    if(growCapacity > kMaxCapacity) {
  ------------------
  |  Branch (1952:8): [True: 0, False: 107k]
  ------------------
 1953|      0|      setToBogus();
 1954|      0|      return false;
 1955|      0|    }
 1956|       |
 1957|       |    // save old values
 1958|   107k|    char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1959|   107k|    char16_t *oldArray;
 1960|   107k|    int32_t oldLength = length();
 1961|   107k|    int16_t flags = fUnion.fFields.fLengthAndFlags;
 1962|       |
 1963|   107k|    if(flags&kUsingStackBuffer) {
  ------------------
  |  Branch (1963:8): [True: 75.4k, False: 32.0k]
  ------------------
 1964|  75.4k|      U_ASSERT(!(flags&kRefCounted)); /* kRefCounted and kUsingStackBuffer are mutally exclusive */
  ------------------
  |  |   35|  75.4k|#   define U_ASSERT(exp) (void)0
  ------------------
 1965|  75.4k|      if(doCopyArray && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1965:10): [True: 75.4k, False: 0]
  |  Branch (1965:25): [True: 75.4k, False: 0]
  ------------------
 1966|       |        // copy the stack buffer contents because it will be overwritten with
 1967|       |        // fUnion.fFields values
 1968|  75.4k|        us_arrayCopy(fUnion.fStackFields.fBuffer, 0, oldStackBuffer, 0, oldLength);
 1969|  75.4k|        oldArray = oldStackBuffer;
 1970|  75.4k|      } else {
 1971|      0|        oldArray = nullptr; // no need to copy from the stack buffer to itself
 1972|      0|      }
 1973|  75.4k|    } else {
 1974|  32.0k|      oldArray = fUnion.fFields.fArray;
 1975|  32.0k|      U_ASSERT(oldArray!=nullptr); /* when stack buffer is not used, oldArray must have a non-nullptr reference */
  ------------------
  |  |   35|  32.0k|#   define U_ASSERT(exp) (void)0
  ------------------
 1976|  32.0k|    }
 1977|       |
 1978|       |    // allocate a new array
 1979|   107k|    if(allocate(growCapacity) ||
  ------------------
  |  Branch (1979:8): [True: 107k, False: 0]
  ------------------
 1980|   107k|       (newCapacity < growCapacity && allocate(newCapacity))
  ------------------
  |  Branch (1980:9): [True: 0, False: 0]
  |  Branch (1980:39): [True: 0, False: 0]
  ------------------
 1981|   107k|    ) {
 1982|   107k|      if(doCopyArray) {
  ------------------
  |  Branch (1982:10): [True: 107k, False: 0]
  ------------------
 1983|       |        // copy the contents
 1984|       |        // do not copy more than what fits - it may be smaller than before
 1985|   107k|        int32_t minLength = oldLength;
 1986|   107k|        newCapacity = getCapacity();
 1987|   107k|        if(newCapacity < minLength) {
  ------------------
  |  Branch (1987:12): [True: 0, False: 107k]
  ------------------
 1988|      0|          minLength = newCapacity;
 1989|      0|        }
 1990|   107k|        if(oldArray != nullptr) {
  ------------------
  |  Branch (1990:12): [True: 107k, False: 0]
  ------------------
 1991|   107k|          us_arrayCopy(oldArray, 0, getArrayStart(), 0, minLength);
 1992|   107k|        }
 1993|   107k|        setLength(minLength);
 1994|   107k|      } else {
 1995|      0|        setZeroLength();
 1996|      0|      }
 1997|       |
 1998|       |      // release the old array
 1999|   107k|      if(flags & kRefCounted) {
  ------------------
  |  Branch (1999:10): [True: 32.0k, False: 75.4k]
  ------------------
 2000|       |        // the array is refCounted; decrement and release if 0
 2001|  32.0k|        u_atomic_int32_t* pRefCount = reinterpret_cast<u_atomic_int32_t*>(oldArray) - 1;
 2002|  32.0k|        if(umtx_atomic_dec(pRefCount) == 0) {
  ------------------
  |  Branch (2002:12): [True: 32.0k, False: 0]
  ------------------
 2003|  32.0k|          if (pBufferToDelete == nullptr) {
  ------------------
  |  Branch (2003:15): [True: 32.0k, False: 0]
  ------------------
 2004|       |              // Note: cast to (void *) is needed with MSVC, where u_atomic_int32_t
 2005|       |              // is defined as volatile. (Volatile has useful non-standard behavior
 2006|       |              //   with this compiler.)
 2007|  32.0k|            uprv_free((void *)pRefCount);
  ------------------
  |  | 1503|  32.0k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  32.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  32.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  32.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2008|  32.0k|          } else {
 2009|       |            // the caller requested to delete it himself
 2010|      0|            *pBufferToDelete = reinterpret_cast<int32_t*>(pRefCount);
 2011|      0|          }
 2012|  32.0k|        }
 2013|  32.0k|      }
 2014|   107k|    } 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|   107k|  }
 2025|  25.4M|  return true;
 2026|  25.4M|}
uhash_hashUnicodeString_78:
 2081|    605|uhash_hashUnicodeString(const UElement key) {
 2082|    605|    const UnicodeString *str = (const UnicodeString*) key.pointer;
 2083|    605|    return (str == nullptr) ? 0 : str->hashCode();
  ------------------
  |  Branch (2083:12): [True: 0, False: 605]
  ------------------
 2084|    605|}
uhash_compareUnicodeString_78:
 2089|   470k|uhash_compareUnicodeString(const UElement key1, const UElement key2) {
 2090|   470k|    const UnicodeString *str1 = (const UnicodeString*) key1.pointer;
 2091|   470k|    const UnicodeString *str2 = (const UnicodeString*) key2.pointer;
 2092|   470k|    if (str1 == str2) {
  ------------------
  |  Branch (2092:9): [True: 0, False: 470k]
  ------------------
 2093|      0|        return true;
 2094|      0|    }
 2095|   470k|    if (str1 == nullptr || str2 == nullptr) {
  ------------------
  |  Branch (2095:9): [True: 0, False: 470k]
  |  Branch (2095:28): [True: 0, False: 470k]
  ------------------
 2096|      0|        return false;
 2097|      0|    }
 2098|   470k|    return *str1 == *str2;
 2099|   470k|}
unistr.cpp:_ZL20UnicodeString_charAtiPv:
   96|     35|UnicodeString_charAt(int32_t offset, void *context) {
   97|     35|    return ((icu::UnicodeString*) context)->charAt(offset);
   98|     35|}
unistr.cpp:_ZL12us_arrayCopyPKDsiPDsii:
   87|  14.8M|{
   88|  14.8M|  if(count>0) {
  ------------------
  |  Branch (88:6): [True: 14.7M, False: 76.0k]
  ------------------
   89|  14.7M|    uprv_memmove(dst+dstStart, src+srcStart, (size_t)count*sizeof(*src));
  ------------------
  |  |   51|  14.7M|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  14.7M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|  14.7M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|  14.7M|    _Pragma("clang diagnostic push") \
  |  |   54|  14.7M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|  14.7M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  14.7M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|  14.7M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  14.7M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|  14.7M|    _Pragma("clang diagnostic pop") \
  |  |   58|  14.7M|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  14.7M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|  14.7M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  14.7M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   90|  14.7M|  }
   91|  14.8M|}
unistr.cpp:_ZN6icu_7812_GLOBAL__N_115getGrowCapacityEi:
  397|  70.0k|int32_t getGrowCapacity(int32_t newLength) {
  398|  70.0k|  int32_t growSize = (newLength >> 2) + kGrowSize;
  399|  70.0k|  if(growSize <= (kMaxCapacity - newLength)) {
  ------------------
  |  Branch (399:6): [True: 70.0k, False: 0]
  ------------------
  400|  70.0k|    return newLength + growSize;
  401|  70.0k|  } else {
  402|      0|    return kMaxCapacity;
  403|      0|  }
  404|  70.0k|}

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

u_hasBinaryProperty_78:
  487|  7.12k|u_hasBinaryProperty(UChar32 c, UProperty which) {
  488|       |    /* c is range-checked in the functions that are called from here */
  489|  7.12k|    if(which<UCHAR_BINARY_START || UCHAR_BINARY_LIMIT<=which) {
  ------------------
  |  Branch (489:8): [True: 0, False: 7.12k]
  |  Branch (489:36): [True: 0, False: 7.12k]
  ------------------
  490|       |        /* not a known binary property */
  491|      0|        return false;
  492|  7.12k|    } else {
  493|  7.12k|        const BinaryProperty &prop=binProps[which];
  494|  7.12k|        return prop.contains(prop, c, which);
  495|  7.12k|    }
  496|  7.12k|}
u_getIntPropertyValue_78:
  757|  69.3M|u_getIntPropertyValue(UChar32 c, UProperty which) {
  758|  69.3M|    if(which<UCHAR_INT_START) {
  ------------------
  |  Branch (758:8): [True: 0, False: 69.3M]
  ------------------
  759|      0|        if(UCHAR_BINARY_START<=which && which<UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (759:12): [True: 0, False: 0]
  |  Branch (759:41): [True: 0, False: 0]
  ------------------
  760|      0|            const BinaryProperty &prop=binProps[which];
  761|      0|            return prop.contains(prop, c, which);
  762|      0|        }
  763|  69.3M|    } else if(which<UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (763:15): [True: 69.3M, False: 0]
  ------------------
  764|  69.3M|        const IntProperty &prop=intProps[which-UCHAR_INT_START];
  765|  69.3M|        return prop.getValue(prop, c, which);
  766|  69.3M|    } else if(which==UCHAR_GENERAL_CATEGORY_MASK) {
  ------------------
  |  Branch (766:15): [True: 0, False: 0]
  ------------------
  767|      0|        return U_MASK(u_charType(c));
  ------------------
  |  |  174|      0|#define U_MASK(x) ((uint32_t)1<<(x))
  ------------------
  768|      0|    }
  769|      0|    return 0;  // undefined
  770|  69.3M|}
uprops_getSource_78:
  791|     15|uprops_getSource(UProperty which) {
  792|     15|    if(which<UCHAR_BINARY_START) {
  ------------------
  |  Branch (792:8): [True: 0, False: 15]
  ------------------
  793|      0|        return UPROPS_SRC_NONE; /* undefined */
  794|     15|    } else if(which<UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (794:15): [True: 1, False: 14]
  ------------------
  795|      1|        const BinaryProperty &prop=binProps[which];
  796|      1|        if(prop.mask!=0) {
  ------------------
  |  Branch (796:12): [True: 1, False: 0]
  ------------------
  797|      1|            return UPROPS_SRC_PROPSVEC;
  798|      1|        } else {
  799|      0|            return (UPropertySource)prop.column;
  800|      0|        }
  801|     14|    } else if(which<UCHAR_INT_START) {
  ------------------
  |  Branch (801:15): [True: 0, False: 14]
  ------------------
  802|      0|        return UPROPS_SRC_NONE; /* undefined */
  803|     14|    } else if(which<UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (803:15): [True: 2, False: 12]
  ------------------
  804|      2|        const IntProperty &prop=intProps[which-UCHAR_INT_START];
  805|      2|        if(prop.mask!=0) {
  ------------------
  |  Branch (805:12): [True: 1, False: 1]
  ------------------
  806|      1|            return UPROPS_SRC_PROPSVEC;
  807|      1|        } else {
  808|      1|            return (UPropertySource)prop.column;
  809|      1|        }
  810|     12|    } else if(which<UCHAR_STRING_START) {
  ------------------
  |  Branch (810:15): [True: 12, False: 0]
  ------------------
  811|     12|        switch(which) {
  812|     12|        case UCHAR_GENERAL_CATEGORY_MASK:
  ------------------
  |  Branch (812:9): [True: 12, False: 0]
  ------------------
  813|     12|        case UCHAR_NUMERIC_VALUE:
  ------------------
  |  Branch (813:9): [True: 0, False: 12]
  ------------------
  814|     12|            return UPROPS_SRC_CHAR;
  815|       |
  816|      0|        default:
  ------------------
  |  Branch (816:9): [True: 0, False: 12]
  ------------------
  817|      0|            return UPROPS_SRC_NONE;
  818|     12|        }
  819|     12|    } 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|     15|}
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:_ZL15defaultGetValueRK11IntPropertyi9UProperty:
  544|  35.8k|static int32_t defaultGetValue(const IntProperty &prop, UChar32 c, UProperty /*which*/) {
  545|       |    /* systematic, directly stored properties */
  546|  35.8k|    return static_cast<int32_t>(u_getUnicodeProperties(c, prop.column) & prop.mask) >> prop.shift;
  ------------------
  |  |  288|  35.8k|#define u_getUnicodeProperties U_ICU_ENTRY_POINT_RENAME(u_getUnicodeProperties)
  |  |  ------------------
  |  |  |  |  123|  35.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  35.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  35.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  547|  35.8k|}
uprops.cpp:_ZL9getScriptRK11IntPropertyi9UProperty:
  604|  69.3M|static int32_t getScript(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
  605|  69.3M|    UErrorCode errorCode=U_ZERO_ERROR;
  606|  69.3M|    return static_cast<int32_t>(uscript_getScript(c, &errorCode));
  ------------------
  |  | 1706|  69.3M|#define uscript_getScript U_ICU_ENTRY_POINT_RENAME(uscript_getScript)
  |  |  ------------------
  |  |  |  |  123|  69.3M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  69.3M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  69.3M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  607|  69.3M|}

ures_initStackObject_78:
  726|  70.1k|U_CFUNC void ures_initStackObject(UResourceBundle* resB) {
  727|  70.1k|  uprv_memset(resB, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|  70.1k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  70.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  728|  70.1k|  ures_setIsStackObject(resB, true);
  729|  70.1k|}
_ZN6icu_7820StackUResourceBundleC2Ev:
  733|      1|StackUResourceBundle::StackUResourceBundle() {
  734|      1|    ures_initStackObject(&bundle);
  ------------------
  |  | 1690|      1|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  735|      1|}
_ZN6icu_7820StackUResourceBundleD2Ev:
  737|      1|StackUResourceBundle::~StackUResourceBundle() {
  738|      1|    ures_close(&bundle);
  ------------------
  |  | 1652|      1|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  739|      1|}
ures_close_78:
 1147|   238k|{
 1148|   238k|    ures_closeBundle(resB, true);
 1149|   238k|}
ures_copyResb_78:
 1488|      1|UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *original, UErrorCode *status) {
 1489|      1|    UBool isStackObject;
 1490|      1|    if(U_FAILURE(*status) || r == original) {
  ------------------
  |  Branch (1490:8): [True: 0, False: 1]
  |  Branch (1490:30): [True: 0, False: 1]
  ------------------
 1491|      0|        return r;
 1492|      0|    }
 1493|      1|    if(original != nullptr) {
  ------------------
  |  Branch (1493:8): [True: 1, False: 0]
  ------------------
 1494|      1|        if(r == nullptr) {
  ------------------
  |  Branch (1494:12): [True: 1, False: 0]
  ------------------
 1495|      1|            isStackObject = false;
 1496|      1|            r = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1497|       |            /* test for nullptr */
 1498|      1|            if (r == nullptr) {
  ------------------
  |  Branch (1498:17): [True: 0, False: 1]
  ------------------
 1499|      0|                *status = U_MEMORY_ALLOCATION_ERROR;
 1500|      0|                return nullptr;
 1501|      0|            }
 1502|      1|        } else {
 1503|      0|            isStackObject = ures_isStackObject(r);
 1504|      0|            ures_closeBundle(r, false);
 1505|      0|        }
 1506|      1|        uprv_memcpy(r, original, sizeof(UResourceBundle));
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1507|      1|        r->fResPath = nullptr;
 1508|      1|        r->fResPathLen = 0;
 1509|      1|        if(original->fResPath) {
  ------------------
  |  Branch (1509:12): [True: 1, False: 0]
  ------------------
 1510|      1|            ures_appendResPath(r, original->fResPath, original->fResPathLen, status);
 1511|      1|        }
 1512|      1|        ures_setIsStackObject(r, isStackObject);
 1513|      1|        if(r->fData != nullptr) {
  ------------------
  |  Branch (1513:12): [True: 1, False: 0]
  ------------------
 1514|      1|            entryIncrease(r->fData);
 1515|      1|        }
 1516|      1|    }
 1517|      1|    return r;
 1518|      1|}
ures_getString_78:
 1524|   140k|U_CAPI const char16_t* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_t* len, UErrorCode* status) {
 1525|   140k|    const char16_t *s;
 1526|   140k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1526:9): [True: 0, False: 140k]
  |  Branch (1526:28): [True: 40.5k, False: 99.9k]
  ------------------
 1527|  40.5k|        return nullptr;
 1528|  40.5k|    }
 1529|  99.9k|    if(resB == nullptr) {
  ------------------
  |  Branch (1529:8): [True: 0, False: 99.9k]
  ------------------
 1530|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1531|      0|        return nullptr;
 1532|      0|    }
 1533|  99.9k|    s = res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1534|  99.9k|    if (s == nullptr) {
  ------------------
  |  Branch (1534:9): [True: 0, False: 99.9k]
  ------------------
 1535|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 1536|      0|    }
 1537|  99.9k|    return s;
 1538|  99.9k|}
ures_getKey_78:
 1685|  2.55k|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|  2.55k|  if(resB == nullptr) {
  ------------------
  |  Branch (1695:6): [True: 0, False: 2.55k]
  ------------------
 1696|      0|    return nullptr;
 1697|      0|  }
 1698|  2.55k|  return(resB->fKey);
 1699|  2.55k|}
ures_getSize_78:
 1701|      5|U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) {
 1702|      5|  if(resB == nullptr) {
  ------------------
  |  Branch (1702:6): [True: 0, False: 5]
  ------------------
 1703|      0|    return 0;
 1704|      0|  }
 1705|       |  
 1706|      5|  return resB->fSize;
 1707|      5|}
ures_resetIterator_78:
 1721|    917|U_CAPI void U_EXPORT2 ures_resetIterator(UResourceBundle *resB){
 1722|    917|  if(resB == nullptr) {
  ------------------
  |  Branch (1722:6): [True: 0, False: 917]
  ------------------
 1723|      0|    return;
 1724|      0|  }
 1725|    917|  resB->fIndex = -1;
 1726|    917|}
ures_hasNext_78:
 1728|  82.2k|U_CAPI UBool U_EXPORT2 ures_hasNext(const UResourceBundle *resB) {
 1729|  82.2k|  if(resB == nullptr) {
  ------------------
  |  Branch (1729:6): [True: 0, False: 82.2k]
  ------------------
 1730|      0|    return false;
 1731|      0|  }
 1732|  82.2k|  return resB->fIndex < resB->fSize-1;
 1733|  82.2k|}
ures_getNextString_78:
 1735|    224|U_CAPI const char16_t* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t* len, const char ** key, UErrorCode *status) {
 1736|    224|  Resource r = RES_BOGUS;
  ------------------
  |  |   65|    224|#define RES_BOGUS 0xffffffff
  ------------------
 1737|       |  
 1738|    224|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1738:7): [True: 0, False: 224]
  |  Branch (1738:26): [True: 0, False: 224]
  ------------------
 1739|      0|    return nullptr;
 1740|      0|  }
 1741|    224|  if(resB == nullptr) {
  ------------------
  |  Branch (1741:6): [True: 0, False: 224]
  ------------------
 1742|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1743|      0|    return nullptr;
 1744|      0|  }
 1745|       |  
 1746|    224|  if(resB->fIndex == resB->fSize-1) {
  ------------------
  |  Branch (1746:6): [True: 0, False: 224]
  ------------------
 1747|      0|    *status = U_INDEX_OUTOFBOUNDS_ERROR;
 1748|    224|  } else {
 1749|    224|    resB->fIndex++;
 1750|    224|    switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|    224|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1751|      0|    case URES_STRING:
  ------------------
  |  Branch (1751:5): [True: 0, False: 224]
  ------------------
 1752|      0|    case URES_STRING_V2:
  ------------------
  |  Branch (1752:5): [True: 0, False: 224]
  ------------------
 1753|      0|      return res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1754|      0|    case URES_TABLE:
  ------------------
  |  Branch (1754:5): [True: 0, False: 224]
  ------------------
 1755|      0|    case URES_TABLE16:
  ------------------
  |  Branch (1755:5): [True: 0, False: 224]
  ------------------
 1756|      0|    case URES_TABLE32:
  ------------------
  |  Branch (1756:5): [True: 0, False: 224]
  ------------------
 1757|      0|      r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, resB->fIndex, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1758|      0|      if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1758:10): [True: 0, False: 0]
  |  Branch (1758:28): [True: 0, False: 0]
  ------------------
 1759|       |        /* TODO: do the fallback */
 1760|      0|      }
 1761|      0|      return ures_getStringWithAlias(resB, r, resB->fIndex, len, status);
 1762|      0|    case URES_ARRAY:
  ------------------
  |  Branch (1762:5): [True: 0, False: 224]
  ------------------
 1763|    224|    case URES_ARRAY16:
  ------------------
  |  Branch (1763:5): [True: 224, False: 0]
  ------------------
 1764|    224|      r = res_getArrayItem(&resB->getResData(), resB->fRes, resB->fIndex);
  ------------------
  |  |  200|    224|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|    224|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    224|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    224|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1765|    224|      if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|    448|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1765:10): [True: 0, False: 224]
  |  Branch (1765:28): [True: 0, False: 0]
  ------------------
 1766|       |        /* TODO: do the fallback */
 1767|      0|      }
 1768|    224|      return ures_getStringWithAlias(resB, r, resB->fIndex, len, status);
 1769|      0|    case URES_ALIAS:
  ------------------
  |  Branch (1769:5): [True: 0, False: 224]
  ------------------
 1770|      0|      return ures_getStringWithAlias(resB, resB->fRes, resB->fIndex, len, status);
 1771|      0|    case URES_INT:
  ------------------
  |  Branch (1771:5): [True: 0, False: 224]
  ------------------
 1772|      0|    case URES_BINARY:
  ------------------
  |  Branch (1772:5): [True: 0, False: 224]
  ------------------
 1773|      0|    case URES_INT_VECTOR:
  ------------------
  |  Branch (1773:5): [True: 0, False: 224]
  ------------------
 1774|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 1775|      0|        U_FALLTHROUGH;
  ------------------
  |  |  511|      0|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
 1776|      0|    default:
  ------------------
  |  Branch (1776:5): [True: 0, False: 224]
  ------------------
 1777|      0|      return nullptr;
 1778|    224|    }
 1779|    224|  }
 1780|       |
 1781|      0|  return nullptr;
 1782|    224|}
ures_getNextResource_78:
 1784|  86.5k|U_CAPI UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resB, UResourceBundle *fillIn, UErrorCode *status) {
 1785|  86.5k|    const char *key = nullptr;
 1786|  86.5k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|  86.5k|#define RES_BOGUS 0xffffffff
  ------------------
 1787|       |
 1788|  86.5k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1788:9): [True: 0, False: 86.5k]
  |  Branch (1788:28): [True: 0, False: 86.5k]
  ------------------
 1789|       |            /*return nullptr;*/
 1790|      0|            return fillIn;
 1791|      0|    }
 1792|  86.5k|    if(resB == nullptr) {
  ------------------
  |  Branch (1792:8): [True: 0, False: 86.5k]
  ------------------
 1793|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 1794|       |            /*return nullptr;*/
 1795|      0|            return fillIn;
 1796|      0|    }
 1797|       |
 1798|  86.5k|    if(resB->fIndex == resB->fSize-1) {
  ------------------
  |  Branch (1798:8): [True: 39, False: 86.4k]
  ------------------
 1799|     39|      *status = U_INDEX_OUTOFBOUNDS_ERROR;
 1800|       |      /*return nullptr;*/
 1801|  86.4k|    } else {
 1802|  86.4k|        resB->fIndex++;
 1803|  86.4k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  86.4k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1804|      0|        case URES_INT:
  ------------------
  |  Branch (1804:9): [True: 0, False: 86.4k]
  ------------------
 1805|      0|        case URES_BINARY:
  ------------------
  |  Branch (1805:9): [True: 0, False: 86.4k]
  ------------------
 1806|      0|        case URES_STRING:
  ------------------
  |  Branch (1806:9): [True: 0, False: 86.4k]
  ------------------
 1807|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1807:9): [True: 0, False: 86.4k]
  ------------------
 1808|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1808:9): [True: 0, False: 86.4k]
  ------------------
 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: 85.1k]
  ------------------
 1811|  81.0k|        case URES_TABLE16:
  ------------------
  |  Branch (1811:9): [True: 79.7k, False: 6.68k]
  ------------------
 1812|  81.0k|        case URES_TABLE32:
  ------------------
  |  Branch (1812:9): [True: 0, False: 86.4k]
  ------------------
 1813|  81.0k|            r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, resB->fIndex, &key);
  ------------------
  |  |  206|  81.0k|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|  81.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  81.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  81.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1814|  81.0k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|   162k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1814:16): [True: 0, False: 81.0k]
  |  Branch (1814:34): [True: 0, False: 0]
  ------------------
 1815|       |                /* TODO: do the fallback */
 1816|      0|            }
 1817|  81.0k|            return init_resb_result(resB->fData, r, key, resB->fIndex, resB, fillIn, status);
 1818|      0|        case URES_ARRAY:
  ------------------
  |  Branch (1818:9): [True: 0, False: 86.4k]
  ------------------
 1819|  5.39k|        case URES_ARRAY16:
  ------------------
  |  Branch (1819:9): [True: 5.39k, False: 81.0k]
  ------------------
 1820|  5.39k|            r = res_getArrayItem(&resB->getResData(), resB->fRes, resB->fIndex);
  ------------------
  |  |  200|  5.39k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|  5.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1821|  5.39k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|  10.7k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1821:16): [True: 0, False: 5.39k]
  |  Branch (1821:34): [True: 0, False: 0]
  ------------------
 1822|       |                /* TODO: do the fallback */
 1823|      0|            }
 1824|  5.39k|            return init_resb_result(resB->fData, r, key, resB->fIndex, resB, fillIn, status);
 1825|      0|        default:
  ------------------
  |  Branch (1825:9): [True: 0, False: 86.4k]
  ------------------
 1826|       |            /*return nullptr;*/
 1827|      0|            return fillIn;
 1828|  86.4k|        }
 1829|  86.4k|    }
 1830|       |    /*return nullptr;*/
 1831|     39|    return fillIn;
 1832|  86.5k|}
ures_getStringByKeyWithFallback_78:
 2033|  40.5k|                                UErrorCode *status) {
 2034|       |
 2035|  40.5k|    UResourceBundle stack;
 2036|  40.5k|    const char16_t* retVal = nullptr;
 2037|  40.5k|    ures_initStackObject(&stack);
  ------------------
  |  | 1690|  40.5k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2038|  40.5k|    ures_getByKeyWithFallback(resB, inKey, &stack, status);
  ------------------
  |  | 1662|  40.5k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2039|  40.5k|    int32_t length;
 2040|  40.5k|    retVal = ures_getString(&stack, &length, status);
  ------------------
  |  | 1675|  40.5k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|  40.5k|    ures_close(&stack);
  ------------------
  |  | 1652|  40.5k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  40.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2042|  40.5k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2042:9): [True: 40.5k, False: 5]
  ------------------
 2043|  40.5k|        return nullptr;
 2044|  40.5k|    }
 2045|      5|    if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|      5|#define EMPTY_SET 0x2205
  ------------------
                  if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|      5|#define EMPTY_SET 0x2205
  ------------------
                  if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|      0|#define EMPTY_SET 0x2205
  ------------------
  |  Branch (2045:9): [True: 0, False: 5]
  |  Branch (2045:24): [True: 0, False: 0]
  |  Branch (2045:50): [True: 0, False: 0]
  |  Branch (2045:76): [True: 0, False: 0]
  ------------------
 2046|      0|        retVal = nullptr;
 2047|      0|        length = 0;
 2048|      0|        *status = U_MISSING_RESOURCE_ERROR;
 2049|      0|    }
 2050|      5|    if (len != nullptr) {
  ------------------
  |  Branch (2050:9): [True: 5, False: 0]
  ------------------
 2051|      5|        *len = length;
 2052|      5|    }
 2053|      5|    return retVal;
 2054|  40.5k|}
ures_getByKeyWithFallback_78:
 2164|   110k|                          UErrorCode *status) {
 2165|   110k|    Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|   110k|#define RES_BOGUS 0xffffffff
  ------------------
                  Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|   110k|#define RES_BOGUS 0xffffffff
  ------------------
 2166|   110k|    UResourceBundle *helper = nullptr;
 2167|       |
 2168|   110k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2168:9): [True: 0, False: 110k]
  |  Branch (2168:28): [True: 0, False: 110k]
  ------------------
 2169|      0|        return fillIn;
 2170|      0|    }
 2171|   110k|    if(resB == nullptr) {
  ------------------
  |  Branch (2171:8): [True: 0, False: 110k]
  ------------------
 2172|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2173|      0|        return fillIn;
 2174|      0|    }
 2175|       |
 2176|   110k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|   110k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2177|   110k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|   110k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 55.4k, False: 55.3k]
  |  |  |  Branch (84:61): [True: 55.3k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2178|   110k|        const char* origResPath = resB->fResPath;
 2179|   110k|        int32_t origResPathLen = resB->fResPathLen;
 2180|   110k|        res = getTableItemByKeyPath(&resB->getResData(), resB->fRes, inKey);
 2181|   110k|        const char* key = inKey;
 2182|   110k|        bool didRootOnce = false;
 2183|   110k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|   110k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2183:12): [True: 42.9k, False: 67.8k]
  ------------------
 2184|  42.9k|            UResourceDataEntry *dataEntry = resB->fData;
 2185|  42.9k|            CharString path;
 2186|  42.9k|            char *myPath = nullptr;
 2187|  42.9k|            const char* resPath = resB->fResPath;
 2188|  42.9k|            int32_t len = resB->fResPathLen;
 2189|  86.0k|            while(res == RES_BOGUS && (dataEntry->fParent != nullptr || !didRootOnce)) { /* Otherwise, we'll look in parents */
  ------------------
  |  |   65|   172k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2189:19): [True: 83.7k, False: 2.36k]
  |  Branch (2189:40): [True: 2.57k, False: 81.1k]
  |  Branch (2189:73): [True: 40.5k, False: 40.5k]
  ------------------
 2190|  43.1k|                if (dataEntry->fParent != nullptr) {
  ------------------
  |  Branch (2190:21): [True: 2.57k, False: 40.5k]
  ------------------
 2191|  2.57k|                    dataEntry = dataEntry->fParent;
 2192|  40.5k|                } else {
 2193|       |                    // We can't just stop when we get to a bundle whose fParent is nullptr.  That'll work most of the time,
 2194|       |                    // but if the bundle that the caller passed to us was "root" (which happens in getAllItemsWithFallback(),
 2195|       |                    // this function will drop right out without doing anything if "root" doesn't contain the exact key path
 2196|       |                    // specified.  In that case, we need one extra time through this loop to make sure we follow any
 2197|       |                    // applicable aliases at the root level.
 2198|  40.5k|                    didRootOnce = true;
 2199|  40.5k|                }
 2200|  43.1k|                rootRes = dataEntry->fData.rootRes;
 2201|       |
 2202|  43.1k|                if(dataEntry->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (2202:20): [True: 43.1k, False: 0]
  ------------------
 2203|  43.1k|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2204|  43.1k|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2204:25): [True: 0, False: 43.1k]
  ------------------
 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|  43.1k|                    myPath = path.data();
 2209|  43.1k|                    key = inKey;
 2210|  43.1k|                    do {
 2211|  43.1k|                        res = res_findResource(&(dataEntry->fData), rootRes, &myPath, &key);
  ------------------
  |  |  198|  43.1k|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|  43.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  43.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  43.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2212|  43.1k|                        if (RES_GET_TYPE(res) == URES_ALIAS && *myPath) {
  ------------------
  |  |   68|  43.1k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (2212:29): [True: 0, False: 43.1k]
  |  Branch (2212:64): [True: 0, False: 0]
  ------------------
 2213|       |                            /* We hit an alias, but we didn't finish following the path. */
 2214|      0|                            helper = init_resb_result(dataEntry, res, nullptr, -1, resB, helper, status);
 2215|       |                            /*helper = init_resb_result(dataEntry, res, inKey, -1, resB, helper, status);*/
 2216|      0|                            if(helper) {
  ------------------
  |  Branch (2216:32): [True: 0, False: 0]
  ------------------
 2217|      0|                              dataEntry = helper->fData;
 2218|      0|                              rootRes = helper->fRes;
 2219|      0|                              resPath = helper->fResPath;
 2220|      0|                              len = helper->fResPathLen;
 2221|       |
 2222|      0|                            } else {
 2223|      0|                              break;
 2224|      0|                            }
 2225|  43.1k|                        } else if (res == RES_BOGUS) {
  ------------------
  |  |   65|  43.1k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2225:36): [True: 40.7k, False: 2.36k]
  ------------------
 2226|  40.7k|                            break;
 2227|  40.7k|                        }
 2228|  43.1k|                    } while(*myPath); /* Continue until the whole path is consumed */
  ------------------
  |  Branch (2228:29): [True: 0, False: 2.36k]
  ------------------
 2229|  43.1k|                }
 2230|  43.1k|            }
 2231|       |            /*dataEntry = getFallbackData(resB, &key, &res, status);*/
 2232|  42.9k|            if(res != RES_BOGUS) {
  ------------------
  |  |   65|  42.9k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2232:16): [True: 2.36k, False: 40.5k]
  ------------------
 2233|       |              /* check if resB->fResPath gives the right name here */
 2234|  2.36k|                if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  2.36k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                              if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  2.36k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2234:20): [True: 0, False: 2.36k]
  |  Branch (2234:75): [True: 2.35k, False: 5]
  ------------------
 2235|  2.35k|                    *status = U_USING_DEFAULT_WARNING;
 2236|  2.35k|                } else {
 2237|      5|                    *status = U_USING_FALLBACK_WARNING;
 2238|      5|                }
 2239|       |
 2240|  2.36k|                fillIn = init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2241|  2.36k|                if (resPath != nullptr) {
  ------------------
  |  Branch (2241:21): [True: 245, False: 2.11k]
  ------------------
 2242|    245|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2243|  2.11k|                } else {
 2244|  2.11k|                    const char* separator = nullptr;
 2245|  2.11k|                    if (fillIn->fResPath != nullptr) {
  ------------------
  |  Branch (2245:25): [True: 2.11k, False: 0]
  ------------------
 2246|  2.11k|                        separator = uprv_strchr(fillIn->fResPath, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  2.11k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  2.11k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2247|  2.11k|                    }
 2248|  2.11k|                    if (separator != nullptr && separator[1] != '\0') {
  ------------------
  |  Branch (2248:25): [True: 2.11k, False: 0]
  |  Branch (2248:49): [True: 0, False: 2.11k]
  ------------------
 2249|      0|                        createPath(origResPath, origResPathLen, fillIn->fResPath,
 2250|      0|                                   static_cast<int32_t>(uprv_strlen(fillIn->fResPath)), inKey, path, status);
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2251|  2.11k|                    } else {
 2252|  2.11k|                        createPath(origResPath, origResPathLen, "", 0, inKey, path, status);
 2253|  2.11k|                    }
 2254|  2.11k|                }
 2255|  2.36k|                ures_freeResPath(fillIn);
 2256|  2.36k|                ures_appendResPath(fillIn, path.data(), path.length(), status);
 2257|  2.36k|                if(fillIn->fResPath[fillIn->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  2.36k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2257:20): [True: 2.36k, False: 0]
  ------------------
 2258|  2.36k|                    ures_appendResPath(fillIn, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  2.36k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 2259|  2.36k|                }
 2260|  40.5k|            } else {
 2261|  40.5k|                *status = U_MISSING_RESOURCE_ERROR;
 2262|  40.5k|            }
 2263|  67.8k|        } else {
 2264|  67.8k|            fillIn = init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2265|  67.8k|        }
 2266|   110k|    } 
 2267|      0|    else {
 2268|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 2269|      0|    }
 2270|   110k|    ures_close(helper);
  ------------------
  |  | 1652|   110k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2271|   110k|    return fillIn;
 2272|   110k|}
ures_getAllItemsWithFallback_78:
 2471|      1|                             icu::ResourceSink &sink, UErrorCode &errorCode) {
 2472|      1|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2472:9): [True: 0, False: 1]
  ------------------
 2473|      1|    if (path == nullptr) {
  ------------------
  |  Branch (2473:9): [True: 0, False: 1]
  ------------------
 2474|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
 2475|      0|        return;
 2476|      0|    }
 2477|      1|    StackUResourceBundle stackBundle;
 2478|      1|    const UResourceBundle *rb;
 2479|      1|    if (*path == 0) {
  ------------------
  |  Branch (2479:9): [True: 1, False: 0]
  ------------------
 2480|       |        // empty path
 2481|      1|        rb = bundle;
 2482|      1|    } else {
 2483|      0|        rb = ures_getByKeyWithFallback(bundle, path, stackBundle.getAlias(), &errorCode);
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2484|      0|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (2484:13): [True: 0, False: 0]
  ------------------
 2485|      0|            return;
 2486|      0|        }
 2487|      0|    }
 2488|       |    // Get all table items with fallback.
 2489|      1|    ResourceDataValue value;
 2490|      1|    getAllItemsWithFallback(rb, value, sink, errorCode);
 2491|      1|}
ures_getByKey_78:
 2493|    122|U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, const char* inKey, UResourceBundle *fillIn, UErrorCode *status) {
 2494|    122|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|    122|#define RES_BOGUS 0xffffffff
  ------------------
 2495|    122|    UResourceDataEntry *dataEntry = nullptr;
 2496|    122|    const char *key = inKey;
 2497|       |
 2498|    122|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2498:9): [True: 0, False: 122]
  |  Branch (2498:28): [True: 0, False: 122]
  ------------------
 2499|      0|        return fillIn;
 2500|      0|    }
 2501|    122|    if(resB == nullptr) {
  ------------------
  |  Branch (2501:8): [True: 0, False: 122]
  ------------------
 2502|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2503|      0|        return fillIn;
 2504|      0|    }
 2505|       |
 2506|    122|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|    122|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2507|    122|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|    122|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 122, False: 0]
  |  |  |  Branch (84:61): [True: 0, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2508|    122|        int32_t t;
 2509|    122|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|    122|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|    122|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    122|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    122|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2510|    122|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|    122|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2510:12): [True: 70, False: 52]
  ------------------
 2511|     70|            key = inKey;
 2512|     70|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2512:16): [True: 0, False: 70]
  ------------------
 2513|      0|                dataEntry = getFallbackData(resB, &key, &res, status);
 2514|      0|                if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (2514:20): [True: 0, False: 0]
  ------------------
 2515|       |                    /* check if resB->fResPath gives the right name here */
 2516|      0|                    return init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2517|      0|                } else {
 2518|      0|                    *status = U_MISSING_RESOURCE_ERROR;
 2519|      0|                }
 2520|     70|            } else {
 2521|     70|                *status = U_MISSING_RESOURCE_ERROR;
 2522|     70|            }
 2523|     70|        } else {
 2524|     52|            return init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2525|     52|        }
 2526|    122|    } 
 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|     70|    return fillIn;
 2544|    122|}
ures_getStringByKey_78:
 2546|  1.29k|U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, const char* inKey, int32_t* len, UErrorCode *status) {
 2547|  1.29k|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|  1.29k|#define RES_BOGUS 0xffffffff
  ------------------
 2548|  1.29k|    UResourceDataEntry *dataEntry = nullptr;
 2549|  1.29k|    const char* key = inKey;
 2550|       |
 2551|  1.29k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2551:9): [True: 0, False: 1.29k]
  |  Branch (2551:28): [True: 0, False: 1.29k]
  ------------------
 2552|      0|        return nullptr;
 2553|      0|    }
 2554|  1.29k|    if(resB == nullptr) {
  ------------------
  |  Branch (2554:8): [True: 0, False: 1.29k]
  ------------------
 2555|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2556|      0|        return nullptr;
 2557|      0|    }
 2558|       |
 2559|  1.29k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|  1.29k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2560|  1.29k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  1.29k|#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: 1.29k]
  |  |  |  Branch (84:61): [True: 1.29k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2561|  1.29k|        int32_t t=0;
 2562|       |
 2563|  1.29k|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|  1.29k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2564|       |
 2565|  1.29k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|  1.29k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2565:12): [True: 2, False: 1.29k]
  ------------------
 2566|      2|            key = inKey;
 2567|      2|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2567:16): [True: 0, False: 2]
  ------------------
 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|      2|            } else {
 2589|      2|                *status = U_MISSING_RESOURCE_ERROR;
 2590|      2|            }
 2591|  1.29k|        } else {
 2592|  1.29k|            switch (RES_GET_TYPE(res)) {
  ------------------
  |  |   68|  1.29k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2593|      0|            case URES_STRING:
  ------------------
  |  Branch (2593:13): [True: 0, False: 1.29k]
  ------------------
 2594|  1.29k|            case URES_STRING_V2:
  ------------------
  |  Branch (2594:13): [True: 1.29k, False: 0]
  ------------------
 2595|  1.29k|                return res_getString({resB, key}, &resB->getResData(), res, len);
 2596|      0|            case URES_ALIAS:
  ------------------
  |  Branch (2596:13): [True: 0, False: 1.29k]
  ------------------
 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: 1.29k]
  ------------------
 2605|      0|                *status = U_RESOURCE_TYPE_MISMATCH;
 2606|  1.29k|            }
 2607|  1.29k|        }
 2608|  1.29k|    } 
 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|      2|    return nullptr;
 2627|  1.29k|}
ures_getLocaleInternal_78:
 2648|  14.7k|{
 2649|  14.7k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2649:9): [True: 0, False: 14.7k]
  |  Branch (2649:28): [True: 0, False: 14.7k]
  ------------------
 2650|      0|        return nullptr;
 2651|      0|    }
 2652|  14.7k|    if (!resourceBundle) {
  ------------------
  |  Branch (2652:9): [True: 0, False: 14.7k]
  ------------------
 2653|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2654|      0|        return nullptr;
 2655|  14.7k|    } else {
 2656|  14.7k|      return resourceBundle->fData->fName;
 2657|  14.7k|    }
 2658|  14.7k|}
ures_getLocaleByType_78:
 2671|  14.7k|                     UErrorCode* status) {
 2672|  14.7k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2672:9): [True: 0, False: 14.7k]
  |  Branch (2672:28): [True: 0, False: 14.7k]
  ------------------
 2673|      0|        return nullptr;
 2674|      0|    }
 2675|  14.7k|    if (!resourceBundle) {
  ------------------
  |  Branch (2675:9): [True: 0, False: 14.7k]
  ------------------
 2676|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2677|      0|        return nullptr;
 2678|  14.7k|    } else {
 2679|  14.7k|        switch(type) {
 2680|      0|        case ULOC_ACTUAL_LOCALE:
  ------------------
  |  Branch (2680:9): [True: 0, False: 14.7k]
  ------------------
 2681|      0|            return resourceBundle->fData->fName;
 2682|  14.7k|        case ULOC_VALID_LOCALE:
  ------------------
  |  Branch (2682:9): [True: 14.7k, False: 0]
  ------------------
 2683|  14.7k|            return resourceBundle->fValidLocaleDataEntry->fName;
 2684|      0|        case ULOC_REQUESTED_LOCALE:
  ------------------
  |  Branch (2684:9): [True: 0, False: 14.7k]
  ------------------
 2685|      0|        default:
  ------------------
  |  Branch (2685:9): [True: 0, False: 14.7k]
  ------------------
 2686|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2687|      0|            return nullptr;
 2688|  14.7k|        }
 2689|  14.7k|    }
 2690|  14.7k|}
ures_open_78:
 2769|  40.7k|ures_open(const char* path, const char* localeID, UErrorCode* status) {
 2770|  40.7k|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_LOCALE_DEFAULT_ROOT, status);
 2771|  40.7k|}
ures_openNoDefault_78:
 2774|  14.7k|ures_openNoDefault(const char* path, const char* localeID, UErrorCode* status) {
 2775|  14.7k|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_LOCALE_ROOT, status);
 2776|  14.7k|}
ures_openDirect_78:
 2783|      8|ures_openDirect(const char* path, const char* localeID, UErrorCode* status) {
 2784|      8|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_DIRECT, status);
 2785|      8|}
uresbund.cpp:_ZL21ures_setIsStackObjectP15UResourceBundlea:
  711|   128k|static void ures_setIsStackObject( UResourceBundle* resB, UBool state) {
  712|   128k|    if(state) {
  ------------------
  |  Branch (712:8): [True: 70.1k, False: 57.9k]
  ------------------
  713|  70.1k|        resB->fMagic1 = 0;
  714|  70.1k|        resB->fMagic2 = 0;
  715|  70.1k|    } else {
  716|  57.9k|        resB->fMagic1 = MAGIC1;
  ------------------
  |  |   30|  57.9k|#define MAGIC1 19700503
  ------------------
  717|  57.9k|        resB->fMagic2 = MAGIC2;
  ------------------
  |  |   31|  57.9k|#define MAGIC2 19641227
  ------------------
  718|  57.9k|    }
  719|   128k|}
uresbund.cpp:_ZL16ures_closeBundleP15UResourceBundlea:
 1123|   238k|{
 1124|   238k|    if(resB != nullptr) {
  ------------------
  |  Branch (1124:8): [True: 128k, False: 110k]
  ------------------
 1125|   128k|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1125:12): [True: 87.4k, False: 40.6k]
  ------------------
 1126|  87.4k|            entryClose(resB->fData);
 1127|  87.4k|        }
 1128|   128k|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1128:12): [True: 0, False: 128k]
  ------------------
 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|   128k|        ures_freeResPath(resB);
 1132|       |
 1133|   128k|        if(ures_isStackObject(resB) == false && freeBundleObj) {
  ------------------
  |  Branch (1133:12): [True: 57.9k, False: 70.1k]
  |  Branch (1133:49): [True: 57.9k, False: 0]
  ------------------
 1134|  57.9k|            uprv_free(resB);
  ------------------
  |  | 1503|  57.9k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  57.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  57.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  57.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1135|  57.9k|        }
 1136|       |#if 0 /*U_DEBUG*/
 1137|       |        else {
 1138|       |            /* poison the data */
 1139|       |            uprv_memset(resB, -1, sizeof(UResourceBundle));
 1140|       |        }
 1141|       |#endif
 1142|   128k|    }
 1143|   238k|}
uresbund.cpp:_ZL10entryCloseP18UResourceDataEntry:
 1061|   212k|static void entryClose(UResourceDataEntry *resB) {
 1062|   212k|  Mutex lock(&resbMutex);
 1063|   212k|  entryCloseInt(resB);
 1064|   212k|}
uresbund.cpp:_ZL13entryCloseIntP18UResourceDataEntry:
 1028|   212k|static void entryCloseInt(UResourceDataEntry *resB) {
 1029|   212k|    UResourceDataEntry *p = resB;
 1030|       |
 1031|   434k|    while(resB != nullptr) {
  ------------------
  |  Branch (1031:11): [True: 222k, False: 212k]
  ------------------
 1032|   222k|        p = resB->fParent;
 1033|   222k|        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|   222k|        resB = p;
 1054|   222k|    }
 1055|   212k|}
uresbund.cpp:_ZL18ures_isStackObjectPK15UResourceBundle:
  721|   128k|static UBool ures_isStackObject(const UResourceBundle* resB) {
  722|   128k|  return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   30|   256k|#define MAGIC1 19700503
  ------------------
                return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   31|  57.9k|#define MAGIC2 19641227
  ------------------
  |  Branch (722:11): [True: 57.9k, False: 70.1k]
  |  Branch (722:38): [True: 57.9k, False: 0]
  ------------------
  723|   128k|}
uresbund.cpp:_ZL18ures_appendResPathP15UResourceBundlePKciP10UErrorCode:
 1083|   419k|static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd, UErrorCode *status) {
 1084|   419k|    int32_t resPathLenOrig = resB->fResPathLen;
 1085|   419k|    if(resB->fResPath == nullptr) {
  ------------------
  |  Branch (1085:8): [True: 159k, False: 260k]
  ------------------
 1086|   159k|        resB->fResPath = resB->fResBuf;
 1087|   159k|        *(resB->fResPath) = 0;
 1088|   159k|        resB->fResPathLen = 0;
 1089|   159k|    } 
 1090|   419k|    resB->fResPathLen += lenToAdd;
 1091|   419k|    if(RES_BUFSIZE <= resB->fResPathLen+1) {
  ------------------
  |  |   59|   419k|#define RES_BUFSIZE 64
  ------------------
  |  Branch (1091:8): [True: 0, False: 419k]
  ------------------
 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|   419k|    uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd);
  ------------------
  |  |   36|   419k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   419k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1111|   419k|}
uresbund.cpp:_ZL13entryIncreaseP18UResourceDataEntry:
  304|   156k|static void entryIncrease(UResourceDataEntry *entry) {
  305|   156k|    Mutex lock(&resbMutex);
  306|   156k|    entry->fCountExisting++;
  307|   163k|    while(entry->fParent != nullptr) {
  ------------------
  |  Branch (307:11): [True: 6.54k, False: 156k]
  ------------------
  308|  6.54k|      entry = entry->fParent;
  309|  6.54k|      entry->fCountExisting++;
  310|  6.54k|    }
  311|   156k|}
uresbund.cpp:_ZL23ures_getStringWithAliasPK15UResourceBundlejiPiP10UErrorCode:
 1709|    224|static const char16_t* ures_getStringWithAlias(const UResourceBundle *resB, Resource r, int32_t sIndex, int32_t *len, UErrorCode *status) {
 1710|    224|  if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|    224|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1710:6): [True: 0, False: 224]
  ------------------
 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|    224|  } else {
 1717|    224|    return res_getString({resB, sIndex}, &resB->getResData(), r, len); 
 1718|    224|  }
 1719|    224|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciPK15UResourceBundlePS4_P10UErrorCode:
 1480|   156k|        UResourceBundle *resB, UErrorCode *status) {
 1481|   156k|    return init_resb_result(
 1482|   156k|        dataEntry, r, key, idx,
 1483|   156k|        container->fValidLocaleDataEntry, container->fResPath, 0, resB, status);
 1484|   156k|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciS1_S3_iP15UResourceBundleP10UErrorCode:
 1389|   156k|        UResourceBundle *resB, UErrorCode *status) {
 1390|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1391|   156k|    if(status == nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1391:8): [True: 0, False: 156k]
  |  Branch (1391:29): [True: 0, False: 156k]
  ------------------
 1392|      0|        return resB;
 1393|      0|    }
 1394|   156k|    if (validLocaleDataEntry == nullptr) {
  ------------------
  |  Branch (1394:9): [True: 0, False: 156k]
  ------------------
 1395|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1396|      0|        return nullptr;
 1397|      0|    }
 1398|   156k|    if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|   156k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1398:8): [True: 3, False: 156k]
  ------------------
 1399|       |        // This is an alias, need to exchange with real data.
 1400|      3|        if(recursionDepth >= URES_MAX_ALIAS_LEVEL) {
  ------------------
  |  |   33|      3|#define URES_MAX_ALIAS_LEVEL 256
  ------------------
  |  Branch (1400:12): [True: 0, False: 3]
  ------------------
 1401|      0|            *status = U_TOO_MANY_ALIASES_ERROR;
 1402|      0|            return resB;
 1403|      0|        }
 1404|      3|        return getAliasTargetAsResourceBundle(
 1405|      3|            dataEntry->fData, r, key, idx,
 1406|      3|            validLocaleDataEntry, containerResPath, recursionDepth, resB, status);
 1407|      3|    }
 1408|   156k|    if(resB == nullptr) {
  ------------------
  |  Branch (1408:8): [True: 2.41k, False: 154k]
  ------------------
 1409|  2.41k|        resB = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|  2.41k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  2.41k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.41k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.41k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1410|  2.41k|        if (resB == nullptr) {
  ------------------
  |  Branch (1410:13): [True: 0, False: 2.41k]
  ------------------
 1411|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 1412|      0|            return nullptr;
 1413|      0|        }
 1414|  2.41k|        ures_setIsStackObject(resB, false);
 1415|  2.41k|        resB->fResPath = nullptr;
 1416|  2.41k|        resB->fResPathLen = 0;
 1417|   154k|    } else {
 1418|   154k|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1418:12): [True: 124k, False: 29.5k]
  ------------------
 1419|   124k|            entryClose(resB->fData);
 1420|   124k|        }
 1421|   154k|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1421:12): [True: 0, False: 154k]
  ------------------
 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|   154k|        if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1435:12): [True: 98.9k, False: 55.3k]
  ------------------
 1436|  98.9k|            ures_freeResPath(resB);
 1437|  98.9k|        }
 1438|   154k|    }
 1439|   156k|    resB->fData = dataEntry;
 1440|   156k|    entryIncrease(resB->fData);
 1441|   156k|    resB->fHasFallback = false;
 1442|   156k|    resB->fIsTopLevel = false;
 1443|   156k|    resB->fIndex = -1;
 1444|   156k|    resB->fKey = key; 
 1445|   156k|    resB->fValidLocaleDataEntry = validLocaleDataEntry;
 1446|   156k|    if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1446:8): [True: 101k, False: 55.3k]
  ------------------
 1447|   101k|        ures_appendResPath(
 1448|   101k|            resB, containerResPath, static_cast<int32_t>(uprv_strlen(containerResPath)), status);
  ------------------
  |  |   37|   101k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   101k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1449|   101k|    }
 1450|   156k|    if(key != nullptr) {
  ------------------
  |  Branch (1450:8): [True: 151k, False: 5.39k]
  ------------------
 1451|   151k|        ures_appendResPath(resB, key, static_cast<int32_t>(uprv_strlen(key)), status);
  ------------------
  |  |   37|   151k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   151k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1452|   151k|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   151k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1452:12): [True: 151k, False: 0]
  ------------------
 1453|   151k|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|   151k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1454|   151k|        }
 1455|   151k|    } else if(idx >= 0) {
  ------------------
  |  Branch (1455:15): [True: 5.39k, False: 0]
  ------------------
 1456|  5.39k|        char buf[256];
 1457|  5.39k|        int32_t len = T_CString_integerToString(buf, idx, 10);
  ------------------
  |  |   67|  5.39k|#define T_CString_integerToString U_ICU_ENTRY_POINT_RENAME(T_CString_integerToString)
  |  |  ------------------
  |  |  |  |  123|  5.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1458|  5.39k|        ures_appendResPath(resB, buf, len, status);
 1459|  5.39k|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  5.39k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1459:12): [True: 5.39k, False: 0]
  ------------------
 1460|  5.39k|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  5.39k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1461|  5.39k|        }
 1462|  5.39k|    }
 1463|       |    /* Make sure that Purify doesn't complain about uninitialized memory copies. */
 1464|   156k|    {
 1465|   156k|        int32_t usedLen = ((resB->fResBuf == resB->fResPath) ? resB->fResPathLen : 0);
  ------------------
  |  Branch (1465:28): [True: 156k, False: 0]
  ------------------
 1466|   156k|        uprv_memset(resB->fResBuf + usedLen, 0, sizeof(resB->fResBuf) - usedLen);
  ------------------
  |  |  100|   156k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|   156k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1467|   156k|    }
 1468|       |
 1469|   156k|    resB->fVersion = nullptr;
 1470|   156k|    resB->fRes = r;
 1471|   156k|    resB->fSize = res_countArrayItems(&resB->getResData(), resB->fRes);
  ------------------
  |  |  197|   156k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|   156k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   156k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   156k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1472|   156k|    ResourceTracer(resB).trace("get");
 1473|   156k|    return resB;
 1474|   156k|}
uresbund.cpp:_ZN12_GLOBAL__N_130getAliasTargetAsResourceBundleERK12ResourceDatajPKciP18UResourceDataEntryS4_iP15UResourceBundleP10UErrorCode:
 1166|      3|        UResourceBundle *resB, UErrorCode *status) {
 1167|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1168|      3|    if (U_FAILURE(*status)) { return resB; }
  ------------------
  |  Branch (1168:9): [True: 0, False: 3]
  ------------------
 1169|      3|    U_ASSERT(RES_GET_TYPE(r) == URES_ALIAS);
  ------------------
  |  |   35|      3|#   define U_ASSERT(exp) (void)0
  ------------------
 1170|      3|    int32_t len = 0;
 1171|      3|    const char16_t *alias = res_getAlias(&resData, r, &len);
  ------------------
  |  |  199|      3|#define res_getAlias U_ICU_ENTRY_POINT_RENAME(res_getAlias)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1172|      3|    if(len <= 0) {
  ------------------
  |  Branch (1172:8): [True: 0, False: 3]
  ------------------
 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|      3|    CharString chAlias;
 1189|      3|    chAlias.appendInvariantChars(alias, len, *status);
 1190|      3|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1190:9): [True: 0, False: 3]
  ------------------
 1191|      0|        return nullptr;
 1192|      0|    }
 1193|       |
 1194|       |    // We have an alias, now let's cut it up.
 1195|      3|    const char *path = nullptr, *locale = nullptr, *keyPath = nullptr;
 1196|      3|    if(chAlias[0] == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      3|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1196:8): [True: 3, False: 0]
  ------------------
 1197|       |        // There is a path included.
 1198|      3|        char *chAliasData = chAlias.data();
 1199|      3|        char *sep = chAliasData + 1;
 1200|      3|        path = sep;
 1201|      3|        sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|      3|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1202|      3|        if(sep != nullptr) {
  ------------------
  |  Branch (1202:12): [True: 3, False: 0]
  ------------------
 1203|      3|            *sep++ = 0;
 1204|      3|        }
 1205|      3|        if(uprv_strcmp(path, "LOCALE") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1205:12): [True: 0, False: 3]
  ------------------
 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|      0|            keyPath = sep;
 1213|       |            // Read from the valid locale which we already have.
 1214|      0|            path = locale = nullptr;
 1215|      3|        } else {
 1216|      3|            if(uprv_strcmp(path, "ICUDATA") == 0) { /* want ICU data */
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1216:16): [True: 3, False: 0]
  ------------------
 1217|      3|                path = nullptr;
 1218|      3|            }
 1219|      3|            if (sep == nullptr) {
  ------------------
  |  Branch (1219:17): [True: 0, False: 3]
  ------------------
 1220|       |                // TODO: This ends up using the root bundle. Can/should we forbid this?
 1221|      0|                locale = "";
 1222|      3|            } else {
 1223|      3|                locale = sep;
 1224|      3|                sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|      3|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1225|      3|                if(sep != nullptr) {
  ------------------
  |  Branch (1225:20): [True: 3, False: 0]
  ------------------
 1226|      3|                    *sep++ = 0;
 1227|      3|                }
 1228|      3|                keyPath = sep;
 1229|      3|            }
 1230|      3|        }
 1231|      3|    } 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|      3|    LocalUResourceBundlePointer mainRes;
 1246|      3|    UResourceDataEntry *dataEntry;
 1247|      3|    if (locale == nullptr) {
  ------------------
  |  Branch (1247:9): [True: 0, False: 3]
  ------------------
 1248|       |        // alias = /LOCALE/keyPath
 1249|       |        // Read from the valid locale which we already have.
 1250|      0|        dataEntry = validLocaleDataEntry;
 1251|      3|    } else {
 1252|      3|        UErrorCode intStatus = U_ZERO_ERROR;
 1253|       |        // TODO: Shouldn't we use ures_open() for locale data bundles (!noFallback)?
 1254|      3|        mainRes.adoptInstead(ures_openDirect(path, locale, &intStatus));
  ------------------
  |  | 1693|      3|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|      3|        if(U_FAILURE(intStatus)) {
  ------------------
  |  Branch (1255:12): [True: 0, False: 3]
  ------------------
 1256|       |            // We failed to open the resource bundle we're aliasing to.
 1257|      0|            *status = intStatus;
 1258|      0|            return resB;
 1259|      0|        }
 1260|      3|        dataEntry = mainRes->fData;
 1261|      3|    }
 1262|       |
 1263|      3|    const char* temp = nullptr;
 1264|      3|    if(keyPath == nullptr) {
  ------------------
  |  Branch (1264:8): [True: 0, False: 3]
  ------------------
 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|      3|    } 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|      3|        CharString pathBuf(keyPath, *status);
 1317|      3|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1317:13): [True: 0, False: 3]
  ------------------
 1318|      0|            return nullptr;
 1319|      0|        }
 1320|      3|        char *myPath = pathBuf.data();
 1321|      3|        containerResPath = nullptr;
 1322|       |        // Now we have fallback following here.
 1323|      3|        for(;;) {
 1324|      3|            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|      6|            while(*myPath && U_SUCCESS(*status)) {
  ------------------
  |  Branch (1329:19): [True: 3, False: 3]
  |  Branch (1329:30): [True: 3, False: 0]
  ------------------
 1330|      3|                r = res_findResource(&(dataEntry->fData), r, &myPath, &temp);
  ------------------
  |  |  198|      3|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1331|      3|                if(r == RES_BOGUS) {
  ------------------
  |  |   65|      3|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1331:20): [True: 0, False: 3]
  ------------------
 1332|       |                    // No resource found, we don't really want to look anymore on this level.
 1333|      0|                    break;
 1334|      0|                }
 1335|       |                // Found a resource, but it might be an indirection.
 1336|      3|                resB = init_resb_result(
 1337|      3|                    dataEntry, r, temp, -1,
 1338|      3|                    validLocaleDataEntry, containerResPath, recursionDepth+1,
 1339|      3|                    resB, status);
 1340|      3|                if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1340:21): [True: 0, False: 3]
  ------------------
 1341|      0|                    break;
 1342|      0|                }
 1343|      3|                if (temp == nullptr || uprv_strcmp(keyPath, temp) != 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1343:21): [True: 0, False: 3]
  |  Branch (1343:40): [True: 3, 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|      3|                    ures_freeResPath(resB);
 1350|      3|                    ures_appendResPath(resB, keyPath, static_cast<int32_t>(uprv_strlen(keyPath)), status);
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1351|      3|                    if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      3|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1351:24): [True: 3, False: 0]
  ------------------
 1352|      3|                        ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|      3|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1353|      3|                    }
 1354|      3|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1354:25): [True: 0, False: 3]
  ------------------
 1355|      0|                        break;
 1356|      0|                    }
 1357|      3|                }
 1358|      3|                r = resB->fRes; /* switch to a new resource, possibly a new tree */
 1359|      3|                dataEntry = resB->fData;
 1360|      3|                containerResPath = resB->fResPath;
 1361|      3|            }
 1362|      3|            if (U_FAILURE(*status) || r != RES_BOGUS) {
  ------------------
  |  |   65|      3|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1362:17): [True: 0, False: 3]
  |  Branch (1362:39): [True: 3, False: 0]
  ------------------
 1363|      3|                break;
 1364|      3|            }
 1365|       |            // Fall back to the parent bundle, if there is one.
 1366|      0|            dataEntry = dataEntry->fParent;
 1367|      0|            if (dataEntry == nullptr) {
  ------------------
  |  Branch (1367:17): [True: 0, False: 0]
  ------------------
 1368|      0|                *status = U_MISSING_RESOURCE_ERROR;
 1369|      0|                break;
 1370|      0|            }
 1371|       |            // Copy the same keyPath again.
 1372|      0|            myPath = pathBuf.data();
 1373|      0|            uprv_strcpy(myPath, keyPath);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1374|      0|        }
 1375|      3|    }
 1376|      3|    if(mainRes.getAlias() == resB) {
  ------------------
  |  Branch (1376:8): [True: 0, False: 3]
  ------------------
 1377|      0|        mainRes.orphan();
 1378|      0|    }
 1379|      3|    ResourceTracer(resB).maybeTrace("getalias");
 1380|      3|    return resB;
 1381|      3|}
uresbund.cpp:_ZL21getTableItemByKeyPathPK12ResourceDatajPKc:
 2059|   110k|static Resource getTableItemByKeyPath(const ResourceData *pResData, Resource table, const char *key) {
 2060|   110k|  Resource resource = table;  /* The current resource */
 2061|   110k|  icu::CharString path;
 2062|   110k|  UErrorCode errorCode = U_ZERO_ERROR;
 2063|   110k|  path.append(key, errorCode);
 2064|   110k|  if (U_FAILURE(errorCode)) { return RES_BOGUS; }
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2064:7): [True: 0, False: 110k]
  ------------------
 2065|   110k|  char *pathPart = path.data();  /* Path from current resource to desired resource */
 2066|   110k|  UResType type = static_cast<UResType>(RES_GET_TYPE(resource)); /* the current resource type */
  ------------------
  |  |   68|   110k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2067|   221k|  while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|   332k|#define RES_BOGUS 0xffffffff
  ------------------
                while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|   110k|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|   221k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 55.4k, False: 55.3k]
  |  |  |  |  |  Branch (84:61): [True: 55.3k, False: 0]
  |  |  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   83|      0|#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (83:30): [True: 0, False: 0]
  |  |  |  |  |  Branch (83:61): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2067:10): [True: 110k, False: 110k]
  |  Branch (2067:23): [True: 110k, False: 0]
  ------------------
 2068|   110k|    char *nextPathPart = uprv_strchr(pathPart, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|   110k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   110k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2069|   110k|    if (nextPathPart != nullptr) {
  ------------------
  |  Branch (2069:9): [True: 0, False: 110k]
  ------------------
 2070|      0|      *nextPathPart = 0;  /* Terminating null for this part of path. */
 2071|      0|      nextPathPart++;
 2072|   110k|    } else {
 2073|   110k|      nextPathPart = uprv_strchr(pathPart, 0);
  ------------------
  |  |   40|   110k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   110k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2074|   110k|    }
 2075|   110k|    int32_t t;
 2076|   110k|    const char *pathP = pathPart;
 2077|   110k|    resource = res_getTableItemByKey(pResData, resource, &t, &pathP);
  ------------------
  |  |  207|   110k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2078|   110k|    type = static_cast<UResType>(RES_GET_TYPE(resource));
  ------------------
  |  |   68|   110k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2079|   110k|    pathPart = nextPathPart; 
 2080|   110k|  }
 2081|   110k|  if (*pathPart) {
  ------------------
  |  Branch (2081:7): [True: 0, False: 110k]
  ------------------
 2082|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
 2083|      0|  }
 2084|   110k|  return resource;
 2085|   110k|}
uresbund.cpp:_ZL10createPathPKciS0_iS0_RN6icu_7810CharStringEP10UErrorCode:
 2093|  45.5k|                       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|  45.5k|    path.clear();
 2107|  45.5k|    const char* key = inKey;
 2108|  45.5k|    if (resPathLen > 0) {
  ------------------
  |  Branch (2108:9): [True: 41.2k, False: 4.31k]
  ------------------
 2109|  41.2k|        path.append(resPath, resPathLen, *status);
 2110|  41.2k|        if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (2110:13): [True: 41.2k, False: 0]
  ------------------
 2111|  41.2k|            const char* resPathLimit = resPath + resPathLen;
 2112|  41.2k|            const char* origResPathLimit = origResPath + origResPathLen;
 2113|  41.2k|            const char* resPathPtr = resPath;
 2114|  41.2k|            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|  82.4k|            while (origResPathPtr < origResPathLimit && resPathPtr < resPathLimit) {
  ------------------
  |  Branch (2118:20): [True: 41.2k, False: 41.2k]
  |  Branch (2118:57): [True: 41.2k, False: 0]
  ------------------
 2119|   534k|                while (origResPathPtr < origResPathLimit && *origResPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   534k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2119:24): [True: 534k, False: 0]
  |  Branch (2119:61): [True: 493k, False: 41.2k]
  ------------------
 2120|   493k|                    ++origResPathPtr;
 2121|   493k|                }
 2122|  41.2k|                if (origResPathPtr < origResPathLimit && *origResPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  41.2k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2122:21): [True: 41.2k, False: 0]
  |  Branch (2122:58): [True: 41.2k, False: 0]
  ------------------
 2123|  41.2k|                    ++origResPathPtr;
 2124|  41.2k|                }
 2125|   534k|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   534k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2125:24): [True: 534k, False: 0]
  |  Branch (2125:53): [True: 493k, False: 41.2k]
  ------------------
 2126|   493k|                    ++resPathPtr;
 2127|   493k|                }
 2128|  41.2k|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  41.2k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2128:21): [True: 41.2k, False: 0]
  |  Branch (2128:50): [True: 41.2k, False: 0]
  ------------------
 2129|  41.2k|                    ++resPathPtr;
 2130|  41.2k|                }
 2131|  41.2k|            }
 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|  41.2k|            while (resPathPtr < resPathLimit && *key != '\0') {
  ------------------
  |  Branch (2135:20): [True: 0, False: 41.2k]
  |  Branch (2135:49): [True: 0, False: 0]
  ------------------
 2136|      0|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2136:24): [True: 0, False: 0]
  |  Branch (2136:53): [True: 0, False: 0]
  ------------------
 2137|      0|                    ++resPathPtr;
 2138|      0|                }
 2139|      0|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2139:21): [True: 0, False: 0]
  |  Branch (2139:50): [True: 0, False: 0]
  ------------------
 2140|      0|                    ++resPathPtr;
 2141|      0|                }
 2142|      0|                while (*key != '\0' && *key != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2142:24): [True: 0, False: 0]
  |  Branch (2142:40): [True: 0, False: 0]
  ------------------
 2143|      0|                    ++key;
 2144|      0|                }
 2145|      0|                if (*key == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2145:21): [True: 0, False: 0]
  ------------------
 2146|      0|                    ++key;
 2147|      0|                }
 2148|      0|            }
 2149|  41.2k|        }
 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|  41.2k|        path.append(key, *status);
 2155|  41.2k|    } else {
 2156|  4.31k|        path.append(inKey, *status);
 2157|  4.31k|    }
 2158|  45.5k|}
uresbund.cpp:_ZL16ures_freeResPathP15UResourceBundle:
 1113|   229k|static void ures_freeResPath(UResourceBundle *resB) {
 1114|   229k|    if (resB->fResPath && resB->fResPath != resB->fResBuf) {
  ------------------
  |  Branch (1114:9): [True: 159k, False: 70.3k]
  |  Branch (1114:27): [True: 0, False: 159k]
  ------------------
 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|   229k|    resB->fResPath = nullptr;
 1118|   229k|    resB->fResPathLen = 0;
 1119|   229k|}
uresbund.cpp:_ZN12_GLOBAL__N_123getAllItemsWithFallbackEPK15UResourceBundleRN6icu_7817ResourceDataValueERNS3_12ResourceSinkER10UErrorCode:
 2278|      1|        ResourceSink &sink, UErrorCode &errorCode) {
 2279|      1|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2279:9): [True: 0, False: 1]
  ------------------
 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|      1|    value.setData(bundle->getResData());
 2291|      1|    value.setValidLocaleDataEntry(bundle->fValidLocaleDataEntry);
 2292|      1|    UResourceDataEntry *parentEntry = bundle->fData->fParent;
 2293|      1|    UBool hasParent = parentEntry != nullptr && U_SUCCESS(parentEntry->fBogus);
  ------------------
  |  Branch (2293:23): [True: 0, False: 1]
  |  Branch (2293:49): [True: 0, False: 0]
  ------------------
 2294|      1|    value.setResource(bundle->fRes, ResourceTracer(bundle));
 2295|      1|    sink.put(bundle->fKey, value, !hasParent, errorCode);
 2296|      1|    if (hasParent) {
  ------------------
  |  Branch (2296:9): [True: 0, False: 1]
  ------------------
 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|      0|        StackUResourceBundle parentBundle;
 2306|      0|        UResourceBundle &parentRef = parentBundle.ref();
 2307|      0|        parentRef.fData = parentEntry;
 2308|      0|        parentRef.fValidLocaleDataEntry = bundle->fValidLocaleDataEntry;
 2309|      0|        parentRef.fHasFallback = !parentRef.getResData().noFallback;
 2310|      0|        parentRef.fIsTopLevel = true;
 2311|      0|        parentRef.fRes = parentRef.getResData().rootRes;
 2312|      0|        parentRef.fSize = res_countArrayItems(&parentRef.getResData(), parentRef.fRes);
  ------------------
  |  |  197|      0|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2313|      0|        parentRef.fIndex = -1;
 2314|      0|        entryIncrease(parentEntry);
 2315|       |
 2316|       |        // Look up the container item in the parent bundle.
 2317|      0|        StackUResourceBundle containerBundle;
 2318|      0|        const UResourceBundle *rb;
 2319|      0|        UErrorCode pathErrorCode = U_ZERO_ERROR;  // Ignore if parents up to root do not have this path.
 2320|      0|        if (bundle->fResPath == nullptr || *bundle->fResPath == 0) {
  ------------------
  |  Branch (2320:13): [True: 0, False: 0]
  |  Branch (2320:44): [True: 0, False: 0]
  ------------------
 2321|      0|            rb = parentBundle.getAlias();
 2322|      0|        } else {
 2323|      0|            rb = ures_getByKeyWithFallback(parentBundle.getAlias(), bundle->fResPath,
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2324|      0|                                           containerBundle.getAlias(), &pathErrorCode);
 2325|      0|        }
 2326|      0|        if (U_SUCCESS(pathErrorCode)) {
  ------------------
  |  Branch (2326:13): [True: 0, False: 0]
  ------------------
 2327|      0|            getAllItemsWithFallback(rb, value, sink, errorCode);
 2328|      0|        }
 2329|      0|    }
 2330|      1|}
uresbund.cpp:_ZL17ures_openWithTypeP15UResourceBundlePKcS2_12UResOpenTypeP10UErrorCode:
 2712|  55.5k|                  UResOpenType openType, UErrorCode* status) {
 2713|  55.5k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2713:8): [True: 0, False: 55.5k]
  ------------------
 2714|      0|        return nullptr;
 2715|      0|    }
 2716|       |
 2717|  55.5k|    UResourceDataEntry *entry;
 2718|  55.5k|    if(openType != URES_OPEN_DIRECT) {
  ------------------
  |  Branch (2718:8): [True: 55.5k, False: 8]
  ------------------
 2719|  55.5k|        if (localeID == nullptr) {
  ------------------
  |  Branch (2719:13): [True: 0, False: 55.5k]
  ------------------
 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|  55.5k|        CharString canonLocaleID = ulocimp_getBaseName(localeID, *status);
  ------------------
  |  | 1199|  55.5k|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|  55.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2724|  55.5k|        if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2724:12): [True: 31, False: 55.5k]
  ------------------
 2725|     31|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2726|     31|            return nullptr;
 2727|     31|        }
 2728|  55.5k|        entry = entryOpen(path, canonLocaleID.data(), openType, status);
 2729|  55.5k|    } else {
 2730|      8|        entry = entryOpenDirect(path, localeID, status);
 2731|      8|    }
 2732|  55.5k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2732:8): [True: 0, False: 55.5k]
  ------------------
 2733|      0|        return nullptr;
 2734|      0|    }
 2735|  55.5k|    if(entry == nullptr) {
  ------------------
  |  Branch (2735:8): [True: 2, False: 55.5k]
  ------------------
 2736|      2|        *status = U_MISSING_RESOURCE_ERROR;
 2737|      2|        return nullptr;
 2738|      2|    }
 2739|       |
 2740|  55.5k|    UBool isStackObject;
 2741|  55.5k|    if(r == nullptr) {
  ------------------
  |  Branch (2741:8): [True: 55.5k, False: 0]
  ------------------
 2742|  55.5k|        r = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|  55.5k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  55.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2743|  55.5k|        if(r == nullptr) {
  ------------------
  |  Branch (2743:12): [True: 0, False: 55.5k]
  ------------------
 2744|      0|            entryClose(entry);
 2745|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 2746|      0|            return nullptr;
 2747|      0|        }
 2748|  55.5k|        isStackObject = false;
 2749|  55.5k|    } else {  // fill-in
 2750|      0|        isStackObject = ures_isStackObject(r);
 2751|      0|        ures_closeBundle(r, false);
 2752|      0|    }
 2753|  55.5k|    uprv_memset(r, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|  55.5k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  55.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2754|  55.5k|    ures_setIsStackObject(r, isStackObject);
 2755|       |
 2756|  55.5k|    r->fValidLocaleDataEntry = r->fData = entry;
 2757|  55.5k|    r->fHasFallback = openType != URES_OPEN_DIRECT && !r->getResData().noFallback;
  ------------------
  |  Branch (2757:23): [True: 55.5k, False: 6]
  |  Branch (2757:55): [True: 55.5k, False: 0]
  ------------------
 2758|  55.5k|    r->fIsTopLevel = true;
 2759|  55.5k|    r->fRes = r->getResData().rootRes;
 2760|  55.5k|    r->fSize = res_countArrayItems(&r->getResData(), r->fRes);
  ------------------
  |  |  197|  55.5k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|  55.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2761|  55.5k|    r->fIndex = -1;
 2762|       |
 2763|  55.5k|    ResourceTracer(r).traceOpen();
 2764|       |
 2765|  55.5k|    return r;
 2766|  55.5k|}
uresbund.cpp:_ZL9entryOpenPKcS0_12UResOpenTypeP10UErrorCode:
  812|  55.5k|                                     UResOpenType openType, UErrorCode* status) {
  813|  55.5k|    U_ASSERT(openType != URES_OPEN_DIRECT);
  ------------------
  |  |   35|  55.5k|#   define U_ASSERT(exp) (void)0
  ------------------
  814|  55.5k|    UErrorCode intStatus = U_ZERO_ERROR;
  815|  55.5k|    UResourceDataEntry *r = nullptr;
  816|  55.5k|    UResourceDataEntry *t1 = nullptr;
  817|  55.5k|    UBool isDefault = false;
  818|  55.5k|    UBool isRoot = false;
  819|  55.5k|    UBool hasRealData = false;
  820|  55.5k|    UBool hasChopped = true;
  821|  55.5k|    UBool usingUSRData = U_USE_USRDATA && ( path == nullptr || uprv_strncmp(path,U_ICUDATA_NAME,8) == 0);
  ------------------
  |  |  157|   111k|#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|  55.5k|    char name[ULOC_FULLNAME_CAPACITY];
  824|  55.5k|    char usrDataPath[96];
  825|       |
  826|  55.5k|    initCache(status);
  827|       |
  828|  55.5k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (828:8): [True: 0, False: 55.5k]
  ------------------
  829|      0|        return nullptr;
  830|      0|    }
  831|       |
  832|  55.5k|    uprv_strncpy(name, localeID, sizeof(name) - 1);
  ------------------
  |  |   43|  55.5k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|  55.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|  55.5k|    name[sizeof(name) - 1] = 0;
  834|       |
  835|  55.5k|    if ( usingUSRData ) {
  ------------------
  |  Branch (835:10): [True: 0, False: 55.5k]
  ------------------
  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|  55.5k|    const char *defaultLocale = uloc_getDefault();
  ------------------
  |  | 1118|  55.5k|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|  55.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|       |
  850|  55.5k|    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|  55.5k|    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|  55.5k|    if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (856:9): [True: 0, False: 55.5k]
  ------------------
  857|      0|        *status = intStatus;
  858|      0|        goto finish;
  859|      0|    }
  860|       |
  861|  55.5k|    if(r != nullptr) { /* if there is one real locale, we can look for parents. */
  ------------------
  |  Branch (861:8): [True: 46.4k, False: 9.07k]
  ------------------
  862|  46.4k|        t1 = r;
  863|  46.4k|        hasRealData = true;
  864|  46.4k|        if ( usingUSRData ) {  /* This code inserts user override data into the inheritance chain */
  ------------------
  |  Branch (864:14): [True: 0, False: 46.4k]
  ------------------
  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|  46.4k|        if ((hasChopped || mayHaveParent(name)) && !isRoot) {
  ------------------
  |  Branch (882:14): [True: 215, False: 46.2k]
  |  Branch (882:28): [True: 0, False: 46.2k]
  |  Branch (882:52): [True: 215, False: 0]
  ------------------
  883|    215|            if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
  ------------------
  |  |   99|    215|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (883:17): [True: 0, False: 215]
  ------------------
  884|      0|                goto finish;
  885|      0|            }
  886|    215|        }
  887|  46.4k|    }
  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|  55.5k|    if(r==nullptr && openType == URES_OPEN_LOCALE_DEFAULT_ROOT && !isDefault && !isRoot) {
  ------------------
  |  Branch (891:8): [True: 9.07k, False: 46.4k]
  |  Branch (891:22): [True: 141, False: 8.93k]
  |  Branch (891:67): [True: 139, False: 2]
  |  Branch (891:81): [True: 139, False: 0]
  ------------------
  892|       |        /* insert default locale */
  893|    139|        uprv_strcpy(name, defaultLocale);
  ------------------
  |  |   36|    139|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|    139|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  894|    139|        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|    139|        if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (896:13): [True: 0, False: 139]
  ------------------
  897|      0|            *status = intStatus;
  898|      0|            goto finish;
  899|      0|        }
  900|    139|        intStatus = U_USING_DEFAULT_WARNING;
  901|    139|        if(r != nullptr) { /* the default locale exists */
  ------------------
  |  Branch (901:12): [True: 139, False: 0]
  ------------------
  902|    139|            t1 = r;
  903|    139|            hasRealData = true;
  904|    139|            isDefault = true;
  905|       |            // TODO: Why not if (usingUSRData) { ... } like in the non-default-locale code path?
  906|    139|            if ((hasChopped || mayHaveParent(name)) && !isRoot) {
  ------------------
  |  Branch (906:18): [True: 139, False: 0]
  |  Branch (906:32): [True: 0, False: 0]
  |  Branch (906:56): [True: 139, False: 0]
  ------------------
  907|    139|                if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
  ------------------
  |  |   99|    139|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (907:21): [True: 0, False: 139]
  ------------------
  908|      0|                    goto finish;
  909|      0|                }
  910|    139|            }
  911|    139|        }
  912|    139|    }
  913|       |
  914|       |    /* we could still have r == nullptr at this point - maybe even default locale is not */
  915|       |    /* present */
  916|  55.5k|    if(r == nullptr) {
  ------------------
  |  Branch (916:8): [True: 8.93k, False: 46.6k]
  ------------------
  917|  8.93k|        uprv_strcpy(name, kRootLocaleName);
  ------------------
  |  |   36|  8.93k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  8.93k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  918|  8.93k|        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|  8.93k|        if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (920:13): [True: 0, False: 8.93k]
  ------------------
  921|      0|            *status = intStatus;
  922|      0|            goto finish;
  923|      0|        }
  924|  8.93k|        if(r != nullptr) {
  ------------------
  |  Branch (924:12): [True: 8.93k, False: 0]
  ------------------
  925|  8.93k|            t1 = r;
  926|  8.93k|            intStatus = U_USING_DEFAULT_WARNING;
  927|  8.93k|            hasRealData = true;
  928|  8.93k|        } else { /* we don't even have the root locale */
  929|      0|            *status = U_MISSING_RESOURCE_ERROR;
  930|      0|            goto finish;
  931|      0|        }
  932|  46.6k|    } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 &&
  ------------------
  |  |   38|  2.81k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.81k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (932:15): [True: 2.81k, False: 43.7k]
  |  Branch (932:26): [True: 2.81k, False: 0]
  ------------------
  933|  46.6k|            t1->fParent == nullptr && !r->fData.noFallback) {
  ------------------
  |  Branch (933:13): [True: 11, False: 2.80k]
  |  Branch (933:39): [True: 11, False: 0]
  ------------------
  934|     11|        if (!insertRootBundle(t1, status)) {
  ------------------
  |  Branch (934:13): [True: 0, False: 11]
  ------------------
  935|      0|            goto finish;
  936|      0|        }
  937|     11|        if(!hasRealData) {
  ------------------
  |  Branch (937:12): [True: 0, False: 11]
  ------------------
  938|      0|            r->fBogus = U_USING_DEFAULT_WARNING;
  939|      0|        }
  940|     11|    }
  941|       |
  942|       |    // TODO: Does this ever loop?
  943|  58.8k|    while(r != nullptr && !isRoot && t1->fParent != nullptr) {
  ------------------
  |  Branch (943:11): [True: 58.8k, False: 0]
  |  Branch (943:27): [True: 6.16k, False: 52.7k]
  |  Branch (943:38): [True: 3.35k, False: 2.81k]
  ------------------
  944|  3.35k|        t1->fParent->fCountExisting++;
  945|  3.35k|        t1 = t1->fParent;
  946|  3.35k|    }
  947|       |
  948|  55.5k|finish:
  949|  55.5k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (949:8): [True: 55.5k, False: 0]
  ------------------
  950|  55.5k|        if(intStatus != U_ZERO_ERROR) {
  ------------------
  |  Branch (950:12): [True: 11.1k, False: 44.3k]
  ------------------
  951|  11.1k|            *status = intStatus;  
  952|  11.1k|        }
  953|  55.5k|        return r;
  954|  55.5k|    } else {
  955|      0|        return nullptr;
  956|      0|    }
  957|  55.5k|}
uresbund.cpp:_ZL9initCacheP10UErrorCode:
  483|  55.5k|static void initCache(UErrorCode *status) {
  484|  55.5k|    umtx_initOnce(gCacheInitOnce, &createCache, *status);
  485|  55.5k|}
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|   120k|static int32_t U_CALLCONV hashEntry(const UHashTok parm) {
   59|   120k|    UResourceDataEntry* b = static_cast<UResourceDataEntry*>(parm.pointer);
   60|   120k|    UHashTok namekey, pathkey;
   61|   120k|    namekey.pointer = b->fName;
   62|   120k|    pathkey.pointer = b->fPath;
   63|   120k|    return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|   120k|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|   120k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   120k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   120k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|   120k|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|   120k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   120k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   120k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|   120k|}
uresbund.cpp:_ZL14compareEntries8UElementS_:
   67|  85.7k|static UBool U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) {
   68|  85.7k|    UResourceDataEntry* b1 = static_cast<UResourceDataEntry*>(p1.pointer);
   69|  85.7k|    UResourceDataEntry* b2 = static_cast<UResourceDataEntry*>(p2.pointer);
   70|  85.7k|    UHashTok name1, name2, path1, path2;
   71|  85.7k|    name1.pointer = b1->fName;
   72|  85.7k|    name2.pointer = b2->fName;
   73|  85.7k|    path1.pointer = b1->fPath;
   74|  85.7k|    path2.pointer = b2->fPath;
   75|  85.7k|    return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|  85.7k|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|  85.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  85.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  85.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|  78.0k|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|  78.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  78.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  78.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (75:12): [True: 78.0k, False: 7.72k]
  |  Branch (75:48): [True: 78.0k, False: 0]
  ------------------
   76|  85.7k|}
uresbund.cpp:_ZL17findFirstExistingPKcPcS0_12UResOpenTypePaS3_S3_P10UErrorCode:
  665|  64.6k|                  UBool *isRoot, UBool *foundParent, UBool *isDefault, UErrorCode* status) {
  666|  64.6k|    UResourceDataEntry *r = nullptr;
  667|  64.6k|    UBool hasRealData = false;
  668|  64.6k|    *foundParent = true; /* we're starting with a fresh name */
  669|  64.6k|    char origName[ULOC_FULLNAME_CAPACITY];
  670|       |
  671|  64.6k|    uprv_strcpy(origName, name);
  ------------------
  |  |   36|  64.6k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  64.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  672|   156k|    while(*foundParent && !hasRealData) {
  ------------------
  |  Branch (672:11): [True: 92.3k, False: 64.2k]
  |  Branch (672:27): [True: 91.9k, False: 354]
  ------------------
  673|  91.9k|        r = init_entry(name, path, status);
  674|       |        /* Null pointer test */
  675|  91.9k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (675:13): [True: 0, False: 91.9k]
  ------------------
  676|      0|            return nullptr;
  677|      0|        }
  678|  91.9k|        *isDefault = static_cast<UBool>(uprv_strncmp(name, defaultLocale, uprv_strlen(name)) == 0);
  ------------------
  |  |   44|  91.9k|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|  91.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  679|  91.9k|        hasRealData = static_cast<UBool>(r->fBogus == U_ZERO_ERROR);
  680|  91.9k|        if(!hasRealData) {
  ------------------
  |  Branch (680:12): [True: 36.4k, False: 55.5k]
  ------------------
  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|  36.4k|            r->fCountExisting--;
  687|       |            /*entryCloseInt(r);*/
  688|  36.4k|            r = nullptr;
  689|  36.4k|            *status = U_USING_FALLBACK_WARNING;
  690|  55.5k|        } else {
  691|  55.5k|            uprv_strcpy(name, r->fName); /* this is needed for supporting aliases */
  ------------------
  |  |   36|  55.5k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  55.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  692|  55.5k|        }
  693|       |
  694|  91.9k|        *isRoot = static_cast<UBool>(uprv_strcmp(name, kRootLocaleName) == 0);
  ------------------
  |  |   38|  91.9k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  91.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  695|       |
  696|       |        /*Fallback data stuff*/
  697|  91.9k|        if (!hasRealData) {
  ------------------
  |  Branch (697:13): [True: 36.4k, False: 55.5k]
  ------------------
  698|  36.4k|            *foundParent = getParentLocaleID(name, origName, openType);
  699|  55.5k|        } 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|  55.5k|            *foundParent = chopLocale(name);
  703|  55.5k|        }
  704|  91.9k|        if (*foundParent && *name == '\0') {
  ------------------
  |  Branch (704:13): [True: 27.7k, False: 64.2k]
  |  Branch (704:29): [True: 477, False: 27.2k]
  ------------------
  705|    477|            uprv_strcpy(name, "und");
  ------------------
  |  |   36|    477|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|    477|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  706|    477|        }
  707|  91.9k|    }
  708|  64.6k|    return r;
  709|  64.6k|}
uresbund.cpp:_ZL17getParentLocaleIDPcPKc12UResOpenType:
  211|  36.4k|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|  36.4k|    size_t nameLen = uprv_strlen(name);
  ------------------
  |  |   37|  36.4k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  36.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  214|  36.4k|    if (!nameLen || name[nameLen - 1] == '_' || hasVariant(name)) {
  ------------------
  |  Branch (214:9): [True: 0, False: 36.4k]
  |  Branch (214:21): [True: 7.45k, False: 28.9k]
  |  Branch (214:49): [True: 8.43k, False: 20.5k]
  ------------------
  215|  15.8k|        return chopLocale(name);
  216|  15.8k|    }
  217|       |    
  218|  20.5k|    UErrorCode err = U_ZERO_ERROR;
  219|  20.5k|    CharString language;
  220|  20.5k|    CharString script;
  221|  20.5k|    CharString region;
  222|  20.5k|    ulocimp_getSubtags(name, &language, &script, &region, nullptr, nullptr, err);
  ------------------
  |  | 1209|  20.5k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  20.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  20.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  20.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|       |
  224|  20.5k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (224:9): [True: 0, False: 20.5k]
  ------------------
  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|  20.5k|    if (openType == URES_OPEN_LOCALE_DEFAULT_ROOT) {
  ------------------
  |  Branch (234:9): [True: 293, False: 20.2k]
  ------------------
  235|    293|        const char* parentID = performFallbackLookup(name, parentLocaleChars, parentLocaleChars, parentLocaleTable, UPRV_LENGTHOF(parentLocaleTable));
  ------------------
  |  |   99|    293|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  236|    293|        if (parentID != nullptr) {
  ------------------
  |  Branch (236:13): [True: 10, False: 283]
  ------------------
  237|     10|            uprv_strcpy(name, parentID);
  ------------------
  |  |   36|     10|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  238|     10|            return true;
  239|     10|        }
  240|    293|    }
  241|       |
  242|  20.5k|    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|  20.5k|    if (!script.isEmpty() && !region.isEmpty()) {
  ------------------
  |  Branch (246:9): [True: 6.50k, False: 14.0k]
  |  Branch (246:30): [True: 693, False: 5.80k]
  ------------------
  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|    693|        if (getDefaultScript(language, region) == script) {
  ------------------
  |  Branch (250:13): [True: 417, False: 276]
  ------------------
  251|    417|            workingLocale.append(language, err).append("_", err).append(region, err);
  252|    417|        } else {
  253|    276|            workingLocale.append(language, err).append("_", err).append(script, err);
  254|    276|        }
  255|  19.8k|    } else if (!region.isEmpty()) {
  ------------------
  |  Branch (255:16): [True: 5.14k, False: 14.7k]
  ------------------
  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|  5.14k|        UErrorCode err = U_ZERO_ERROR;
  260|  5.14k|        CharString origNameLanguage;
  261|  5.14k|        CharString origNameScript;
  262|  5.14k|        ulocimp_getSubtags(origName, &origNameLanguage, &origNameScript, nullptr, nullptr, nullptr, err);
  ------------------
  |  | 1209|  5.14k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  5.14k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.14k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.14k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|  5.14k|        if (!origNameScript.isEmpty()) {
  ------------------
  |  Branch (263:13): [True: 417, False: 4.72k]
  ------------------
  264|    417|            workingLocale.append(language, err).append("_", err).append(origNameScript, err);
  265|  4.72k|        } else {
  266|  4.72k|            workingLocale.append(language, err).append("_", err).append(getDefaultScript(language, region), err);
  267|  4.72k|        }
  268|  14.7k|    } else if (!script.isEmpty()) {
  ------------------
  |  Branch (268:16): [True: 5.80k, False: 8.90k]
  ------------------
  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|  5.80k|        if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script) {
  ------------------
  |  Branch (275:13): [True: 5.72k, False: 84]
  |  Branch (275:13): [True: 5.79k, False: 15]
  |  Branch (275:58): [True: 69, False: 15]
  ------------------
  276|  5.79k|            workingLocale.append(language, err);
  277|  5.79k|        } else {
  278|     15|            return false;
  279|     15|        }
  280|  8.90k|    } else {
  281|       |        // if "name" just contains a language code, return false so the calling code falls back to "root"
  282|  8.90k|        return false;
  283|  8.90k|    }
  284|  11.6k|    if (U_SUCCESS(err) && !workingLocale.isEmpty()) {
  ------------------
  |  Branch (284:9): [True: 11.6k, False: 0]
  |  Branch (284:27): [True: 11.4k, False: 147]
  ------------------
  285|  11.4k|        uprv_strcpy(name, workingLocale.data());
  ------------------
  |  |   36|  11.4k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  11.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  286|  11.4k|        return true;
  287|  11.4k|    } else {
  288|    147|        return false;
  289|    147|    }
  290|  11.6k|}
uresbund.cpp:_ZL10hasVariantPKc:
   94|  28.9k|static UBool hasVariant(const char* localeID) {
   95|  28.9k|    UErrorCode err = U_ZERO_ERROR;
   96|  28.9k|    CheckedArrayByteSink sink(nullptr, 0);
   97|  28.9k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  28.9k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  28.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  28.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  28.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  28.9k|            localeID,
   99|  28.9k|            nullptr,
  100|  28.9k|            nullptr,
  101|  28.9k|            nullptr,
  102|  28.9k|            &sink,
  103|  28.9k|            nullptr,
  104|  28.9k|            err);
  105|  28.9k|    return sink.NumberOfBytesAppended() != 0;
  106|  28.9k|}
uresbund.cpp:_ZL21performFallbackLookupPKcS0_S0_PKii:
  118|  11.1k|                                         int32_t lookupTableLength) {
  119|  11.1k|    const int32_t* bottom = lookupTable;
  120|  11.1k|    const int32_t* top = lookupTable + lookupTableLength;
  121|       |
  122|   120k|    while (bottom < top) {
  ------------------
  |  Branch (122:12): [True: 110k, False: 9.60k]
  ------------------
  123|       |        // Effectively, divide by 2 and round down to an even index
  124|   110k|        const int32_t* middle = bottom + (((top - bottom) / 4) * 2);
  125|   110k|        const char* entryKey = &(keyStrs[*middle]);
  126|   110k|        int32_t strcmpResult = uprv_strcmp(key, entryKey);
  ------------------
  |  |   38|   110k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   110k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  127|   110k|        if (strcmpResult == 0) {
  ------------------
  |  Branch (127:13): [True: 1.51k, False: 109k]
  ------------------
  128|  1.51k|            return &(valueStrs[middle[1]]);
  129|   109k|        } else if (strcmpResult < 0) {
  ------------------
  |  Branch (129:20): [True: 56.6k, False: 52.4k]
  ------------------
  130|  56.6k|            top = middle;
  131|  56.6k|        } else {
  132|  52.4k|            bottom = middle + 2;
  133|  52.4k|        }
  134|   110k|    }
  135|  9.60k|    return nullptr;
  136|  11.1k|}
uresbund.cpp:_ZL16getDefaultScriptRKN6icu_7810CharStringES2_:
  138|  5.50k|static CharString getDefaultScript(const CharString& language, const CharString& region) {
  139|  5.50k|    const char* defaultScript = nullptr;
  140|  5.50k|    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|  5.50k|    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|  5.50k|    if (!region.isEmpty()) {
  ------------------
  |  Branch (147:9): [True: 5.41k, False: 84]
  ------------------
  148|  5.41k|        CharString localeID;
  149|  5.41k|        localeID.append(language, err).append("_", err).append(region, err);
  150|  5.41k|        if (U_FAILURE(err)) {
  ------------------
  |  Branch (150:13): [True: 0, False: 5.41k]
  ------------------
  151|      0|            return result;
  152|      0|        }
  153|  5.41k|        defaultScript = performFallbackLookup(localeID.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|  5.41k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  154|  5.41k|    }
  155|       |    
  156|       |    // if we didn't find anything, look up just the language in the default script table
  157|  5.50k|    if (defaultScript == nullptr) {
  ------------------
  |  Branch (157:9): [True: 5.40k, False: 93]
  ------------------
  158|  5.40k|        defaultScript = performFallbackLookup(language.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|  5.40k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  159|  5.40k|    }
  160|       |    
  161|       |    // if either lookup above succeeded, copy the result from "defaultScript" into "result"; otherwise, return "Latn"
  162|  5.50k|    if (defaultScript != nullptr) {
  ------------------
  |  Branch (162:9): [True: 1.50k, False: 3.99k]
  ------------------
  163|  1.50k|        result.clear();
  164|  1.50k|        result.append(defaultScript, err);
  165|  1.50k|    }
  166|  5.50k|    return result;
  167|  5.50k|}
uresbund.cpp:_ZL10chopLocalePc:
   83|  71.4k|static UBool chopLocale(char *name) {
   84|  71.4k|    char *i = uprv_strrchr(name, '_');
  ------------------
  |  |   42|  71.4k|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  71.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   85|       |
   86|  71.4k|    if(i != nullptr) {
  ------------------
  |  Branch (86:8): [True: 16.2k, False: 55.1k]
  ------------------
   87|  16.2k|        *i = '\0';
   88|  16.2k|        return true;
   89|  16.2k|    }
   90|       |
   91|  55.1k|    return false;
   92|  71.4k|}
uresbund.cpp:_ZL10init_entryPKcS0_P10UErrorCode:
  514|  92.0k|static UResourceDataEntry *init_entry(const char *localeID, const char *path, UErrorCode *status) {
  515|  92.0k|    UResourceDataEntry *r = nullptr;
  516|  92.0k|    UResourceDataEntry find;
  517|       |    /*int32_t hashValue;*/
  518|  92.0k|    const char *name;
  519|  92.0k|    char aliasName[100] = { 0 };
  520|  92.0k|    int32_t aliasLen = 0;
  521|       |    /*UBool isAlias = false;*/
  522|       |    /*UHashTok hashkey; */
  523|       |
  524|  92.0k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (524:8): [True: 0, False: 92.0k]
  ------------------
  525|      0|        return nullptr;
  526|      0|    }
  527|       |
  528|       |    /* here we try to deduce the right locale name */
  529|  92.0k|    if(localeID == nullptr) { /* if localeID is nullptr, we're trying to open default locale */
  ------------------
  |  Branch (529:8): [True: 0, False: 92.0k]
  ------------------
  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|  92.0k|    } else if(*localeID == 0) { /* if localeID is "" then we try to open root locale */
  ------------------
  |  Branch (531:15): [True: 43.7k, False: 48.2k]
  ------------------
  532|  43.7k|        name = kRootLocaleName;
  ------------------
  |  |   18|  43.7k|#define kRootLocaleName         "root"
  ------------------
  533|  48.2k|    } else { /* otherwise, we'll open what we're given */
  534|  48.2k|        name = localeID;
  535|  48.2k|    }
  536|       |
  537|  92.0k|    find.fName = const_cast<char*>(name);
  538|  92.0k|    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|  92.0k|    r = static_cast<UResourceDataEntry*>(uhash_get(cache, &find));
  ------------------
  |  | 1007|  92.0k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  92.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  92.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  92.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  546|  92.0k|    if(r == nullptr) {
  ------------------
  |  Branch (546:8): [True: 14.0k, False: 78.0k]
  ------------------
  547|       |        /* if the entry is not yet in the hash table, we'll try to construct a new one */
  548|  14.0k|        r = static_cast<UResourceDataEntry*>(uprv_malloc(sizeof(UResourceDataEntry)));
  ------------------
  |  | 1524|  14.0k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  14.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  549|  14.0k|        if(r == nullptr) {
  ------------------
  |  Branch (549:12): [True: 0, False: 14.0k]
  ------------------
  550|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
  551|      0|            return nullptr;
  552|      0|        }
  553|       |
  554|  14.0k|        uprv_memset(r, 0, sizeof(UResourceDataEntry));
  ------------------
  |  |  100|  14.0k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  14.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  555|       |        /*r->fHashKey = hashValue;*/
  556|       |
  557|  14.0k|        setEntryName(r, name, status);
  558|  14.0k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (558:13): [True: 0, False: 14.0k]
  ------------------
  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|  14.0k|        if(path != nullptr) {
  ------------------
  |  Branch (563:12): [True: 14.0k, False: 4]
  ------------------
  564|  14.0k|            r->fPath = uprv_strdup(path);
  ------------------
  |  | 1541|  14.0k|#define uprv_strdup U_ICU_ENTRY_POINT_RENAME(uprv_strdup)
  |  |  ------------------
  |  |  |  |  123|  14.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  565|  14.0k|            if(r->fPath == nullptr) {
  ------------------
  |  Branch (565:16): [True: 0, False: 14.0k]
  ------------------
  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|  14.0k|        }
  571|       |
  572|       |        /* this is the actual loading */
  573|  14.0k|        res_load(&(r->fData), r->fPath, r->fName, status);
  ------------------
  |  |  208|  14.0k|#define res_load U_ICU_ENTRY_POINT_RENAME(res_load)
  |  |  ------------------
  |  |  |  |  123|  14.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  574|       |
  575|  14.0k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (575:13): [True: 13.9k, False: 19]
  ------------------
  576|       |            /* if we failed to load due to an out-of-memory error, exit early. */
  577|  13.9k|            if (*status == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (577:17): [True: 0, False: 13.9k]
  ------------------
  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|  13.9k|            *status = U_USING_FALLBACK_WARNING;
  583|  13.9k|            r->fBogus = U_USING_FALLBACK_WARNING;
  584|  13.9k|        } else { /* if we have a regular entry */
  585|     19|            Resource aliasres;
  586|     19|            if (r->fData.usesPoolBundle) {
  ------------------
  |  Branch (586:17): [True: 0, False: 19]
  ------------------
  587|      0|                r->fPool = getPoolEntry(r->fPath, status);
  588|      0|                if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (588:21): [True: 0, False: 0]
  ------------------
  589|      0|                    const int32_t *poolIndexes = r->fPool->fData.pRoot + 1;
  590|      0|                    if(r->fData.pRoot[1 + URES_INDEX_POOL_CHECKSUM] == poolIndexes[URES_INDEX_POOL_CHECKSUM]) {
  ------------------
  |  Branch (590:24): [True: 0, False: 0]
  ------------------
  591|      0|                        r->fData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + (poolIndexes[URES_INDEX_LENGTH] & 0xff));
  592|      0|                        r->fData.poolBundleStrings = r->fPool->fData.p16BitUnits;
  593|      0|                    } else {
  594|      0|                        r->fBogus = *status = U_INVALID_FORMAT_ERROR;
  595|      0|                    }
  596|      0|                } else {
  597|      0|                    r->fBogus = *status;
  598|      0|                }
  599|      0|            }
  600|     19|            if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (600:17): [True: 19, False: 0]
  ------------------
  601|       |                /* handle the alias by trying to get out the %%Alias tag.*/
  602|       |                /* We'll try to get alias string from the bundle */
  603|     19|                aliasres = res_getResource(&(r->fData), "%%ALIAS");
  ------------------
  |  |  204|     19|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|     19|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     19|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     19|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  604|     19|                if (aliasres != RES_BOGUS) {
  ------------------
  |  |   65|     19|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (604:21): [True: 0, False: 19]
  ------------------
  605|       |                    // No tracing: called during initial data loading
  606|      0|                    const char16_t *alias = res_getStringNoTrace(&(r->fData), aliasres, &aliasLen);
  ------------------
  |  |  205|      0|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  607|      0|                    if(alias != nullptr && aliasLen > 0) { /* if there is actual alias - unload and load new data */
  ------------------
  |  Branch (607:24): [True: 0, False: 0]
  |  Branch (607:44): [True: 0, False: 0]
  ------------------
  608|      0|                        u_UCharsToChars(alias, aliasName, aliasLen+1);
  ------------------
  |  |  211|      0|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  609|      0|                        r->fAlias = init_entry(aliasName, path, status);
  610|      0|                    }
  611|      0|                }
  612|     19|            }
  613|     19|        }
  614|       |
  615|  14.0k|        {
  616|  14.0k|            UResourceDataEntry *oldR = nullptr;
  617|  14.0k|            if ((oldR = static_cast<UResourceDataEntry*>(uhash_get(cache, r))) == nullptr) { /* if the data is not cached */
  ------------------
  |  | 1007|  14.0k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  14.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (617:17): [True: 14.0k, False: 0]
  ------------------
  618|       |                /* just insert it in the cache */
  619|  14.0k|                UErrorCode cacheStatus = U_ZERO_ERROR;
  620|  14.0k|                uhash_put(cache, (void *)r, r, &cacheStatus);
  ------------------
  |  | 1032|  14.0k|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|  14.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  621|  14.0k|                if (U_FAILURE(cacheStatus)) {
  ------------------
  |  Branch (621:21): [True: 0, False: 14.0k]
  ------------------
  622|      0|                    *status = cacheStatus;
  623|      0|                    free_entry(r);
  624|      0|                    r = nullptr;
  625|      0|                }
  626|  14.0k|            } 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|  14.0k|        }
  633|       |
  634|  14.0k|    }
  635|  92.0k|    if(r != nullptr) {
  ------------------
  |  Branch (635:8): [True: 92.0k, False: 0]
  ------------------
  636|       |        /* return the real bundle */
  637|  92.0k|        while(r->fAlias != nullptr) {
  ------------------
  |  Branch (637:15): [True: 0, False: 92.0k]
  ------------------
  638|      0|            r = r->fAlias;
  639|      0|        }
  640|  92.0k|        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|  92.0k|        if(r->fBogus != U_ZERO_ERROR && U_SUCCESS(*status)) {
  ------------------
  |  Branch (643:12): [True: 36.4k, False: 55.5k]
  |  Branch (643:41): [True: 36.4k, False: 0]
  ------------------
  644|  36.4k|             *status = r->fBogus; /* set the returning status */
  645|  36.4k|        }
  646|  92.0k|    }
  647|  92.0k|    return r;
  648|  92.0k|}
uresbund.cpp:_ZL12setEntryNameP18UResourceDataEntryPKcP10UErrorCode:
  489|  14.0k|static void setEntryName(UResourceDataEntry *res, const char *name, UErrorCode *status) {
  490|  14.0k|    int32_t len = static_cast<int32_t>(uprv_strlen(name));
  ------------------
  |  |   37|  14.0k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  14.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  491|  14.0k|    if(res->fName != nullptr && res->fName != res->fNameBuffer) {
  ------------------
  |  Branch (491:8): [True: 0, False: 14.0k]
  |  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|  14.0k|    if (len < static_cast<int32_t>(sizeof(res->fNameBuffer))) {
  ------------------
  |  Branch (494:9): [True: 680, False: 13.3k]
  ------------------
  495|    680|        res->fName = res->fNameBuffer;
  496|    680|    }
  497|  13.3k|    else {
  498|  13.3k|        res->fName = static_cast<char*>(uprv_malloc(len + 1));
  ------------------
  |  | 1524|  13.3k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  13.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  13.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  13.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  499|  13.3k|    }
  500|  14.0k|    if(res->fName == nullptr) {
  ------------------
  |  Branch (500:8): [True: 0, False: 14.0k]
  ------------------
  501|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  502|  14.0k|    } else {
  503|  14.0k|        uprv_strcpy(res->fName, name);
  ------------------
  |  |   36|  14.0k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  14.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  504|  14.0k|    }
  505|  14.0k|}
uresbund.cpp:_ZL13mayHaveParentPc:
  297|  46.2k|static UBool mayHaveParent(char *name) {
  298|  46.2k|    return (name[0] != 0 && uprv_strstr("nb nn",name) != nullptr);
  ------------------
  |  |   41|  46.2k|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|  46.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (298:13): [True: 46.2k, False: 0]
  |  Branch (298:29): [True: 0, False: 46.2k]
  ------------------
  299|  46.2k|}
uresbund.cpp:_ZL21loadParentsExceptRootRP18UResourceDataEntryPciaS2_P10UErrorCode:
  746|    354|                      UBool usingUSRData, char usrDataPath[], UErrorCode *status) {
  747|    354|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (747:9): [True: 0, False: 354]
  ------------------
  748|    354|    UBool checkParent = true;
  749|    357|    while (checkParent && t1->fParent == nullptr && !t1->fData.noFallback &&
  ------------------
  |  Branch (749:12): [True: 355, False: 2]
  |  Branch (749:27): [True: 3, False: 352]
  |  Branch (749:53): [True: 3, False: 0]
  ------------------
  750|    357|            res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |  204|      3|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |   65|      3|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (750:13): [True: 3, False: 0]
  ------------------
  751|      3|        Resource parentRes = res_getResource(&t1->fData, "%%Parent");
  ------------------
  |  |  204|      3|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|      3|        if (parentRes != RES_BOGUS) {  // An explicit parent was found.
  ------------------
  |  |   65|      3|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (752:13): [True: 0, False: 3]
  ------------------
  753|      0|            int32_t parentLocaleLen = 0;
  754|       |            // No tracing: called during initial data loading
  755|      0|            const char16_t *parentLocaleName = res_getStringNoTrace(&(t1->fData), parentRes, &parentLocaleLen);
  ------------------
  |  |  205|      0|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  756|      0|            if(parentLocaleName != nullptr && 0 < parentLocaleLen && parentLocaleLen < nameCapacity) {
  ------------------
  |  Branch (756:16): [True: 0, False: 0]
  |  Branch (756:47): [True: 0, False: 0]
  |  Branch (756:70): [True: 0, False: 0]
  ------------------
  757|      0|                u_UCharsToChars(parentLocaleName, name, parentLocaleLen + 1);
  ------------------
  |  |  211|      0|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  758|      0|                if (uprv_strcmp(name, kRootLocaleName) == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (758:21): [True: 0, False: 0]
  ------------------
  759|      0|                    return true;
  760|      0|                }
  761|      0|            }
  762|      0|        }
  763|       |        // Insert regular parents.
  764|      3|        UErrorCode parentStatus = U_ZERO_ERROR;
  765|      3|        UResourceDataEntry *t2 = init_entry(name, t1->fPath, &parentStatus);
  766|      3|        if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (766:13): [True: 0, False: 3]
  ------------------
  767|      0|            *status = parentStatus;
  768|      0|            return false;
  769|      0|        }
  770|      3|        UResourceDataEntry *u2 = nullptr;
  771|      3|        UErrorCode usrStatus = U_ZERO_ERROR;
  772|      3|        if (usingUSRData) {  // This code inserts user override data into the inheritance chain.
  ------------------
  |  Branch (772:13): [True: 0, False: 3]
  ------------------
  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|      3|        if (usingUSRData && U_SUCCESS(usrStatus) && u2->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (781:13): [True: 0, False: 3]
  |  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|      3|        } else {
  785|      3|            t1->fParent = t2;
  786|      3|            if (usingUSRData) {
  ------------------
  |  Branch (786:17): [True: 0, False: 3]
  ------------------
  787|       |                // The USR override data wasn't found, set it to be deleted.
  788|      0|                u2->fCountExisting = 0;
  789|      0|            }
  790|      3|        }
  791|      3|        t1 = t2;
  792|      3|        checkParent = chopLocale(name) || mayHaveParent(name);
  ------------------
  |  Branch (792:23): [True: 1, False: 2]
  |  Branch (792:43): [True: 0, False: 2]
  ------------------
  793|      3|    }
  794|    354|    return true;
  795|    354|}
uresbund.cpp:_ZL16insertRootBundleRP18UResourceDataEntryP10UErrorCode:
  798|     11|insertRootBundle(UResourceDataEntry *&t1, UErrorCode *status) {
  799|     11|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (799:9): [True: 0, False: 11]
  ------------------
  800|     11|    UErrorCode parentStatus = U_ZERO_ERROR;
  801|     11|    UResourceDataEntry *t2 = init_entry(kRootLocaleName, t1->fPath, &parentStatus);
  ------------------
  |  |   18|     11|#define kRootLocaleName         "root"
  ------------------
  802|     11|    if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (802:9): [True: 0, False: 11]
  ------------------
  803|      0|        *status = parentStatus;
  804|      0|        return false;
  805|      0|    }
  806|     11|    t1->fParent = t2;
  807|     11|    t1 = t2;
  808|     11|    return true;
  809|     11|}
uresbund.cpp:_ZL15entryOpenDirectPKcS0_P10UErrorCode:
  966|      8|entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) {
  967|      8|    initCache(status);
  968|      8|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (968:8): [True: 0, False: 8]
  ------------------
  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|      8|    if (localeID == nullptr) {
  ------------------
  |  Branch (974:9): [True: 0, False: 8]
  ------------------
  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|      8|    } else if (*localeID == 0) {
  ------------------
  |  Branch (976:16): [True: 0, False: 8]
  ------------------
  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|      8|    Mutex lock(&resbMutex);
  982|       |
  983|       |    // findFirstExisting() without fallbacks.
  984|      8|    UResourceDataEntry *r = init_entry(localeID, path, status);
  985|      8|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (985:8): [True: 8, False: 0]
  ------------------
  986|      8|        if(r->fBogus != U_ZERO_ERROR) {
  ------------------
  |  Branch (986:12): [True: 2, False: 6]
  ------------------
  987|      2|            r->fCountExisting--;
  988|      2|            r = nullptr;
  989|      2|        }
  990|      8|    } 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|      8|    UResourceDataEntry *t1 = r;
  997|      8|    if(r != nullptr && uprv_strcmp(localeID, kRootLocaleName) != 0 &&  // not root
  ------------------
  |  |   38|      6|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      6|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (997:8): [True: 6, False: 2]
  |  Branch (997:24): [True: 6, False: 0]
  ------------------
  998|      8|            r->fParent == nullptr && !r->fData.noFallback &&
  ------------------
  |  Branch (998:13): [True: 6, False: 0]
  |  Branch (998:38): [True: 0, False: 6]
  ------------------
  999|      8|            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|      8|    if(r != nullptr) {
  ------------------
  |  Branch (1013:8): [True: 6, False: 2]
  ------------------
 1014|       |        // TODO: Does this ever loop?
 1015|      6|        while(t1->fParent != nullptr) {
  ------------------
  |  Branch (1015:15): [True: 0, False: 6]
  ------------------
 1016|      0|            t1->fParent->fCountExisting++;
 1017|      0|            t1 = t1->fParent;
 1018|      0|        }
 1019|      6|    }
 1020|      8|    return r;
 1021|      8|}

res_load_78:
  260|  14.0k|         const char *path, const char *name, UErrorCode *errorCode) {
  261|  14.0k|    UVersionInfo formatVersion;
  262|       |
  263|  14.0k|    uprv_memset(pResData, 0, sizeof(ResourceData));
  ------------------
  |  |  100|  14.0k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  14.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  264|       |
  265|       |    /* load the ResourceBundle file */
  266|  14.0k|    pResData->data=udata_openChoice(path, "res", name, isAcceptable, formatVersion, errorCode);
  ------------------
  |  |  894|  14.0k|#define udata_openChoice U_ICU_ENTRY_POINT_RENAME(udata_openChoice)
  |  |  ------------------
  |  |  |  |  123|  14.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|  14.0k|    if(U_FAILURE(*errorCode)) {
  ------------------
  |  Branch (267:8): [True: 13.9k, False: 19]
  ------------------
  268|  13.9k|        return;
  269|  13.9k|    }
  270|       |
  271|       |    /* get its memory and initialize *pResData */
  272|     19|    res_init(pResData, formatVersion, udata_getMemory(pResData->data), -1, errorCode);
  ------------------
  |  |  891|     19|#define udata_getMemory U_ICU_ENTRY_POINT_RENAME(udata_getMemory)
  |  |  ------------------
  |  |  |  |  123|     19|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     19|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     19|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|     19|}
res_getStringNoTrace_78:
  311|   101k|res_getStringNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
  312|   101k|    const char16_t *p;
  313|   101k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|   101k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  314|   101k|    int32_t length;
  315|   101k|    if(RES_GET_TYPE(res)==URES_STRING_V2) {
  ------------------
  |  |   68|   101k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (315:8): [True: 101k, False: 0]
  ------------------
  316|   101k|        int32_t first;
  317|   101k|        if((int32_t)offset<pResData->poolStringIndexLimit) {
  ------------------
  |  Branch (317:12): [True: 0, False: 101k]
  ------------------
  318|      0|            p=(const char16_t *)pResData->poolBundleStrings+offset;
  319|   101k|        } else {
  320|   101k|            p=(const char16_t *)pResData->p16BitUnits+(offset-pResData->poolStringIndexLimit);
  321|   101k|        }
  322|   101k|        first=*p;
  323|   101k|        if(!U16_IS_TRAIL(first)) {
  ------------------
  |  |   67|   101k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  ------------------
  |  Branch (323:12): [True: 101k, False: 5]
  ------------------
  324|   101k|            length=u_strlen(p);
  ------------------
  |  |  393|   101k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|   101k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   101k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   101k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|   101k|        } else if(first<0xdfef) {
  ------------------
  |  Branch (325:19): [True: 5, False: 0]
  ------------------
  326|      5|            length=first&0x3ff;
  327|      5|            ++p;
  328|      5|        } 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|   101k|    } 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|   101k|    if(pLength) {
  ------------------
  |  Branch (343:8): [True: 100k, False: 1.29k]
  ------------------
  344|   100k|        *pLength=length;
  345|   100k|    }
  346|   101k|    return p;
  347|   101k|}
res_getAlias_78:
  420|      3|res_getAlias(const ResourceData *pResData, Resource res, int32_t *pLength) {
  421|      3|    const char16_t *p;
  422|      3|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|      3|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  423|      3|    int32_t length;
  424|      3|    if(RES_GET_TYPE(res)==URES_ALIAS) {
  ------------------
  |  |   68|      3|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (424:8): [True: 3, False: 0]
  ------------------
  425|      3|        const int32_t *p32= offset==0 ? &gEmptyString.length : pResData->pRoot+offset;
  ------------------
  |  Branch (425:29): [True: 0, False: 3]
  ------------------
  426|      3|        length=*p32++;
  427|      3|        p=(const char16_t *)p32;
  428|      3|    } else {
  429|      0|        p=nullptr;
  430|      0|        length=0;
  431|      0|    }
  432|      3|    if(pLength) {
  ------------------
  |  Branch (432:8): [True: 3, False: 0]
  ------------------
  433|      3|        *pLength=length;
  434|      3|    }
  435|      3|    return p;
  436|      3|}
res_countArrayItems_78:
  477|   212k|res_countArrayItems(const ResourceData *pResData, Resource res) {
  478|   212k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|   212k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  479|   212k|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|   212k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  480|      0|    case URES_STRING:
  ------------------
  |  Branch (480:5): [True: 0, False: 212k]
  ------------------
  481|  99.9k|    case URES_STRING_V2:
  ------------------
  |  Branch (481:5): [True: 99.9k, False: 112k]
  ------------------
  482|  99.9k|    case URES_BINARY:
  ------------------
  |  Branch (482:5): [True: 0, False: 212k]
  ------------------
  483|  99.9k|    case URES_ALIAS:
  ------------------
  |  Branch (483:5): [True: 0, False: 212k]
  ------------------
  484|  99.9k|    case URES_INT:
  ------------------
  |  Branch (484:5): [True: 0, False: 212k]
  ------------------
  485|  99.9k|    case URES_INT_VECTOR:
  ------------------
  |  Branch (485:5): [True: 0, False: 212k]
  ------------------
  486|  99.9k|        return 1;
  487|      0|    case URES_ARRAY:
  ------------------
  |  Branch (487:5): [True: 0, False: 212k]
  ------------------
  488|      0|    case URES_TABLE32:
  ------------------
  |  Branch (488:5): [True: 0, False: 212k]
  ------------------
  489|      0|        return offset==0 ? 0 : *(pResData->pRoot+offset);
  ------------------
  |  Branch (489:16): [True: 0, False: 0]
  ------------------
  490|  55.5k|    case URES_TABLE:
  ------------------
  |  Branch (490:5): [True: 55.5k, False: 156k]
  ------------------
  491|  55.5k|        return offset==0 ? 0 : *((const uint16_t *)(pResData->pRoot+offset));
  ------------------
  |  Branch (491:16): [True: 30, False: 55.5k]
  ------------------
  492|     40|    case URES_ARRAY16:
  ------------------
  |  Branch (492:5): [True: 40, False: 212k]
  ------------------
  493|  56.7k|    case URES_TABLE16:
  ------------------
  |  Branch (493:5): [True: 56.6k, False: 155k]
  ------------------
  494|  56.7k|        return pResData->p16BitUnits[offset];
  495|      0|    default:
  ------------------
  |  Branch (495:5): [True: 0, False: 212k]
  ------------------
  496|      0|        return 0;
  497|   212k|    }
  498|   212k|}
_ZN6icu_7817ResourceDataValueD2Ev:
  502|      1|ResourceDataValue::~ResourceDataValue() {}
_ZNK6icu_7817ResourceDataValue8getTableER10UErrorCode:
  598|      3|ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const {
  599|      3|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (599:8): [True: 0, False: 3]
  ------------------
  600|      0|        return {};
  601|      0|    }
  602|      3|    const uint16_t *keys16 = nullptr;
  603|      3|    const int32_t *keys32 = nullptr;
  604|      3|    const uint16_t *items16 = nullptr;
  605|      3|    const Resource *items32 = nullptr;
  606|      3|    uint32_t offset = RES_GET_OFFSET(res);
  ------------------
  |  |   69|      3|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  607|      3|    int32_t length = 0;
  608|      3|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|      3|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  609|      1|    case URES_TABLE:
  ------------------
  |  Branch (609:5): [True: 1, False: 2]
  ------------------
  610|      1|        if (offset != 0) {  // empty if offset==0
  ------------------
  |  Branch (610:13): [True: 1, False: 0]
  ------------------
  611|      1|            keys16 = reinterpret_cast<const uint16_t*>(getData().pRoot + offset);
  612|      1|            length = *keys16++;
  613|      1|            items32 = reinterpret_cast<const Resource*>(keys16 + length + (~length & 1));
  614|      1|        }
  615|      1|        break;
  616|      2|    case URES_TABLE16:
  ------------------
  |  Branch (616:5): [True: 2, False: 1]
  ------------------
  617|      2|        keys16 = getData().p16BitUnits+offset;
  618|      2|        length = *keys16++;
  619|      2|        items16 = keys16 + length;
  620|      2|        break;
  621|      0|    case URES_TABLE32:
  ------------------
  |  Branch (621:5): [True: 0, False: 3]
  ------------------
  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: 3]
  ------------------
  629|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  630|      0|        return {};
  631|      3|    }
  632|      3|    return ResourceTable(keys16, keys32, items16, items32, length, fTraceInfo);
  633|      3|}
res_getTableItemByKey_78:
  713|   196k|                      int32_t *indexR, const char **key) {
  714|   196k|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|   196k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  715|   196k|    int32_t length;
  716|   196k|    int32_t idx;
  717|   196k|    if(key == nullptr || *key == nullptr) {
  ------------------
  |  Branch (717:8): [True: 0, False: 196k]
  |  Branch (717:26): [True: 0, False: 196k]
  ------------------
  718|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  719|      0|    }
  720|   196k|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|   196k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  721|  98.7k|    case URES_TABLE: {
  ------------------
  |  Branch (721:5): [True: 98.7k, False: 97.5k]
  ------------------
  722|  98.7k|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (722:13): [True: 98.6k, False: 59]
  ------------------
  723|  98.6k|            const uint16_t *p= (const uint16_t *)(pResData->pRoot+offset);
  724|  98.6k|            length=*p++;
  725|  98.6k|            *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  726|  98.6k|            if(idx>=0) {
  ------------------
  |  Branch (726:16): [True: 96.3k, False: 2.30k]
  ------------------
  727|  96.3k|                const Resource *p32=(const Resource *)(p+length+(~length&1));
  728|  96.3k|                return p32[idx];
  729|  96.3k|            }
  730|  98.6k|        }
  731|  2.35k|        break;
  732|  98.7k|    }
  733|  97.5k|    case URES_TABLE16: {
  ------------------
  |  Branch (733:5): [True: 97.5k, False: 98.7k]
  ------------------
  734|  97.5k|        const uint16_t *p=pResData->p16BitUnits+offset;
  735|  97.5k|        length=*p++;
  736|  97.5k|        *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  737|  97.5k|        if(idx>=0) {
  ------------------
  |  Branch (737:12): [True: 16.0k, False: 81.4k]
  ------------------
  738|  16.0k|            return makeResourceFrom16(pResData, p[length+idx]);
  739|  16.0k|        }
  740|  81.4k|        break;
  741|  97.5k|    }
  742|  81.4k|    case URES_TABLE32: {
  ------------------
  |  Branch (742:5): [True: 0, False: 196k]
  ------------------
  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: 196k]
  ------------------
  754|      0|        break;
  755|   196k|    }
  756|  83.8k|    return RES_BOGUS;
  ------------------
  |  |   65|  83.8k|#define RES_BOGUS 0xffffffff
  ------------------
  757|   196k|}
res_getTableItemByIndex_78:
  761|  81.0k|                        int32_t indexR, const char **key) {
  762|  81.0k|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|  81.0k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  763|  81.0k|    int32_t length;
  764|  81.0k|    if (indexR < 0) {
  ------------------
  |  Branch (764:9): [True: 0, False: 81.0k]
  ------------------
  765|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  766|      0|    }
  767|  81.0k|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|  81.0k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  768|  1.29k|    case URES_TABLE: {
  ------------------
  |  Branch (768:5): [True: 1.29k, False: 79.7k]
  ------------------
  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|  79.7k|    case URES_TABLE16: {
  ------------------
  |  Branch (782:5): [True: 79.7k, False: 1.29k]
  ------------------
  783|  79.7k|        const uint16_t *p=pResData->p16BitUnits+offset;
  784|  79.7k|        length=*p++;
  785|  79.7k|        if(indexR<length) {
  ------------------
  |  Branch (785:12): [True: 79.7k, False: 0]
  ------------------
  786|  79.7k|            if(key!=nullptr) {
  ------------------
  |  Branch (786:16): [True: 79.7k, False: 0]
  ------------------
  787|  79.7k|                *key=RES_GET_KEY16(pResData, p[indexR]);
  ------------------
  |  |   44|  79.7k|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 79.7k, False: 0]
  |  |  ------------------
  |  |   45|  79.7k|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  79.7k|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  788|  79.7k|            }
  789|  79.7k|            return makeResourceFrom16(pResData, p[length+indexR]);
  790|  79.7k|        }
  791|      0|        break;
  792|  79.7k|    }
  793|      0|    case URES_TABLE32: {
  ------------------
  |  Branch (793:5): [True: 0, False: 81.0k]
  ------------------
  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: 81.0k]
  ------------------
  807|      0|        break;
  808|  81.0k|    }
  809|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  810|  81.0k|}
res_getResource_78:
  813|     25|res_getResource(const ResourceData *pResData, const char *key) {
  814|     25|    const char *realKey=key;
  815|     25|    int32_t idx;
  816|     25|    return res_getTableItemByKey(pResData, pResData->rootRes, &idx, &realKey);
  ------------------
  |  |  207|     25|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|     25|}
_ZNK6icu_7813ResourceTable14getKeyAndValueEiRPKcRNS_13ResourceValueE:
  821|    944|                                         const char *&key, icu::ResourceValue &value) const {
  822|    944|    if(0 <= i && i < length) {
  ------------------
  |  Branch (822:8): [True: 944, False: 0]
  |  Branch (822:18): [True: 941, False: 3]
  ------------------
  823|    941|        icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
  824|    941|        if (keys16 != nullptr) {
  ------------------
  |  Branch (824:13): [True: 941, False: 0]
  ------------------
  825|    941|            key = RES_GET_KEY16(&rdValue.getData(), keys16[i]);
  ------------------
  |  |   44|    941|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 941, False: 0]
  |  |  ------------------
  |  |   45|    941|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|    941|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  826|    941|        } 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|    941|        Resource res;
  830|    941|        if (items16 != nullptr) {
  ------------------
  |  Branch (830:13): [True: 938, False: 3]
  ------------------
  831|    938|            res = makeResourceFrom16(&rdValue.getData(), items16[i]);
  832|    938|        } else {
  833|      3|            res = items32[i];
  834|      3|        }
  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|    941|        rdValue.setResource(res, ResourceTracer(fTraceInfo, key));
  840|    941|        return true;
  841|    941|    }
  842|      3|    return false;
  843|    944|}
res_getArrayItem_78:
  869|  5.61k|res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) {
  870|  5.61k|    uint32_t offset=RES_GET_OFFSET(array);
  ------------------
  |  |   69|  5.61k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  871|  5.61k|    if (indexR < 0) {
  ------------------
  |  Branch (871:9): [True: 0, False: 5.61k]
  ------------------
  872|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  873|      0|    }
  874|  5.61k|    switch(RES_GET_TYPE(array)) {
  ------------------
  |  |   68|  5.61k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  875|      0|    case URES_ARRAY: {
  ------------------
  |  Branch (875:5): [True: 0, False: 5.61k]
  ------------------
  876|      0|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (876:13): [True: 0, False: 0]
  ------------------
  877|      0|            const int32_t *p= pResData->pRoot+offset;
  878|      0|            if(indexR<*p) {
  ------------------
  |  Branch (878:16): [True: 0, False: 0]
  ------------------
  879|      0|                return (Resource)p[1+indexR];
  880|      0|            }
  881|      0|        }
  882|      0|        break;
  883|      0|    }
  884|  5.61k|    case URES_ARRAY16: {
  ------------------
  |  Branch (884:5): [True: 5.61k, False: 0]
  ------------------
  885|  5.61k|        const uint16_t *p=pResData->p16BitUnits+offset;
  886|  5.61k|        if(indexR<*p) {
  ------------------
  |  Branch (886:12): [True: 5.61k, False: 0]
  ------------------
  887|  5.61k|            return makeResourceFrom16(pResData, p[1+indexR]);
  888|  5.61k|        }
  889|      0|        break;
  890|  5.61k|    }
  891|      0|    default:
  ------------------
  |  Branch (891:5): [True: 0, False: 5.61k]
  ------------------
  892|      0|        break;
  893|  5.61k|    }
  894|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  895|  5.61k|}
res_findResource_78:
  921|  43.1k|res_findResource(const ResourceData *pResData, Resource r, char** path, const char** key) {
  922|  43.1k|  char *pathP = *path, *nextSepP = *path;
  923|  43.1k|  char *closeIndex = nullptr;
  924|  43.1k|  Resource t1 = r;
  925|  43.1k|  Resource t2;
  926|  43.1k|  int32_t indexR = 0;
  927|  43.1k|  UResType type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|  43.1k|#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|  43.1k|  if(!uprv_strlen(pathP)) {
  ------------------
  |  |   37|  43.1k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  43.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (930:6): [True: 0, False: 43.1k]
  ------------------
  931|      0|      return r;
  932|      0|  }
  933|       |
  934|       |  /* one needs to have an aggregate resource in order to search in it */
  935|  43.1k|  if(!URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|  43.1k|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|  86.3k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 43.1k, False: 0]
  |  |  |  |  |  Branch (84:61): [True: 0, False: 0]
  |  |  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   83|      0|#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (83:30): [True: 0, False: 0]
  |  |  |  |  |  Branch (83:61): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  936|      0|      return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  937|      0|  }
  938|       |  
  939|   127k|  while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|   211k|#define RES_BOGUS 0xffffffff
  ------------------
                while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|  84.0k|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|   168k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 43.1k, False: 40.9k]
  |  |  |  |  |  Branch (84:61): [True: 40.9k, 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: 84.1k, False: 43.1k]
  |  Branch (939:21): [True: 84.1k, False: 0]
  |  Branch (939:31): [True: 84.0k, False: 50]
  ------------------
  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|  84.0k|    nextSepP = uprv_strchr(pathP, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  84.0k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  84.0k|#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|  84.0k|    if(nextSepP != nullptr) {
  ------------------
  |  Branch (947:8): [True: 40.9k, False: 43.1k]
  ------------------
  948|  40.9k|      if(nextSepP == pathP) {
  ------------------
  |  Branch (948:10): [True: 0, False: 40.9k]
  ------------------
  949|       |        // Empty key string.
  950|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  951|      0|      }
  952|  40.9k|      *nextSepP = 0; /* overwrite the separator with a NUL to terminate the key */
  953|  40.9k|      *path = nextSepP+1;
  954|  43.1k|    } else {
  955|  43.1k|      *path = uprv_strchr(pathP, 0);
  ------------------
  |  |   40|  43.1k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  43.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  956|  43.1k|    }
  957|       |
  958|       |    /* if the resource is a table */
  959|       |    /* try the key based access */
  960|  84.0k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  84.0k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 43.1k, False: 40.9k]
  |  |  |  Branch (84:61): [True: 40.9k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  961|  84.0k|      *key = pathP;
  962|  84.0k|      t2 = res_getTableItemByKey(pResData, t1, &indexR, key);
  ------------------
  |  |  207|  84.0k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  84.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  84.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  84.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  963|  84.0k|    } 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|  84.0k|    t1 = t2;
  975|  84.0k|    type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|  84.0k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  976|       |    /* position pathP to next resource key/index */
  977|  84.0k|    pathP = *path;
  978|  84.0k|  }
  979|       |
  980|  43.1k|  return t1;
  981|  43.1k|}
uresdata.cpp:_ZL12isAcceptablePvPKcS1_PK9UDataInfo:
  141|     19|             const UDataInfo *pInfo) {
  142|     19|    uprv_memcpy(context, pInfo->formatVersion, 4);
  ------------------
  |  |   42|     19|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     19|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     19|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     19|    _Pragma("clang diagnostic push") \
  |  |   45|     19|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     19|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     19|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     19|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     19|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     19|    _Pragma("clang diagnostic pop") \
  |  |   49|     19|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     19|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     19|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     19|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|     19|    return
  144|     19|        pInfo->size>=20 &&
  ------------------
  |  Branch (144:9): [True: 19, False: 0]
  ------------------
  145|     19|        pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
  ------------------
  |  |  353|     38|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (145:9): [True: 19, False: 0]
  ------------------
  146|     19|        pInfo->charsetFamily==U_CHARSET_FAMILY &&
  ------------------
  |  |  588|     19|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|     38|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
  |  Branch (146:9): [True: 19, False: 0]
  ------------------
  147|     19|        pInfo->sizeofUChar==U_SIZEOF_UCHAR &&
  ------------------
  |  |  352|     38|#define U_SIZEOF_UCHAR 2
  ------------------
  |  Branch (147:9): [True: 19, False: 0]
  ------------------
  148|     19|        pInfo->dataFormat[0]==0x52 &&   /* dataFormat="ResB" */
  ------------------
  |  Branch (148:9): [True: 19, False: 0]
  ------------------
  149|     19|        pInfo->dataFormat[1]==0x65 &&
  ------------------
  |  Branch (149:9): [True: 19, False: 0]
  ------------------
  150|     19|        pInfo->dataFormat[2]==0x73 &&
  ------------------
  |  Branch (150:9): [True: 19, False: 0]
  ------------------
  151|     19|        pInfo->dataFormat[3]==0x42 &&
  ------------------
  |  Branch (151:9): [True: 19, False: 0]
  ------------------
  152|     19|        (1<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=3);
  ------------------
  |  Branch (152:10): [True: 19, False: 0]
  |  Branch (152:40): [True: 19, False: 0]
  ------------------
  153|     19|}
uresdata.cpp:_ZL8res_initP12ResourceDataPhPKviP10UErrorCode:
  160|     19|         UErrorCode *errorCode) {
  161|     19|    UResType rootType;
  162|       |
  163|       |    /* get the root resource */
  164|     19|    pResData->pRoot = static_cast<const int32_t*>(inBytes);
  165|     19|    pResData->rootRes = static_cast<Resource>(*pResData->pRoot);
  166|     19|    pResData->p16BitUnits=&gEmpty16;
  167|       |
  168|       |    /* formatVersion 1.1 must have a root item and at least 5 indexes */
  169|     19|    if(length>=0 && (length/4)<((formatVersion[0]==1 && formatVersion[1]==0) ? 1 : 1+5)) {
  ------------------
  |  Branch (169:8): [True: 0, False: 19]
  |  Branch (169:21): [True: 0, False: 0]
  |  Branch (169:34): [True: 0, False: 0]
  |  Branch (169:57): [True: 0, False: 0]
  ------------------
  170|      0|        *errorCode=U_INVALID_FORMAT_ERROR;
  171|      0|        res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|      0|        return;
  173|      0|    }
  174|       |
  175|       |    /* currently, we accept only resources that have a Table as their roots */
  176|     19|    rootType = static_cast<UResType>(RES_GET_TYPE(pResData->rootRes));
  ------------------
  |  |   68|     19|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  177|     19|    if(!URES_IS_TABLE(rootType)) {
  ------------------
  |  |   84|     19|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 19, False: 0]
  |  |  |  Branch (84:61): [True: 0, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  178|      0|        *errorCode=U_INVALID_FORMAT_ERROR;
  179|      0|        res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|      0|        return;
  181|      0|    }
  182|       |
  183|     19|    if(formatVersion[0]==1 && formatVersion[1]==0) {
  ------------------
  |  Branch (183:8): [True: 0, False: 19]
  |  Branch (183:31): [True: 0, False: 0]
  ------------------
  184|      0|        pResData->localKeyLimit=0x10000;  /* greater than any 16-bit key string offset */
  185|     19|    } else {
  186|       |        /* bundles with formatVersion 1.1 and later contain an indexes[] array */
  187|     19|        const int32_t *indexes=pResData->pRoot+1;
  188|     19|        int32_t indexLength=indexes[URES_INDEX_LENGTH]&0xff;
  189|     19|        if(indexLength<=URES_INDEX_MAX_TABLE_LENGTH) {
  ------------------
  |  Branch (189:12): [True: 0, False: 19]
  ------------------
  190|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  191|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|      0|            return;
  193|      0|        }
  194|     19|        if( length>=0 &&
  ------------------
  |  Branch (194:13): [True: 0, False: 19]
  ------------------
  195|     19|            (length<((1+indexLength)<<2) ||
  ------------------
  |  Branch (195:14): [True: 0, False: 0]
  ------------------
  196|      0|             length<(indexes[URES_INDEX_BUNDLE_TOP]<<2))
  ------------------
  |  Branch (196:14): [True: 0, False: 0]
  ------------------
  197|     19|        ) {
  198|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  199|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|      0|            return;
  201|      0|        }
  202|     19|        if(indexes[URES_INDEX_KEYS_TOP]>(1+indexLength)) {
  ------------------
  |  Branch (202:12): [True: 18, False: 1]
  ------------------
  203|     18|            pResData->localKeyLimit=indexes[URES_INDEX_KEYS_TOP]<<2;
  204|     18|        }
  205|     19|        if(formatVersion[0]>=3) {
  ------------------
  |  Branch (205:12): [True: 0, False: 19]
  ------------------
  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|      0|            pResData->poolStringIndexLimit = static_cast<int32_t>(static_cast<uint32_t>(indexes[URES_INDEX_LENGTH]) >> 8);
  211|      0|        }
  212|     19|        if(indexLength>URES_INDEX_ATTRIBUTES) {
  ------------------
  |  Branch (212:12): [True: 19, False: 0]
  ------------------
  213|     19|            int32_t att=indexes[URES_INDEX_ATTRIBUTES];
  214|     19|            pResData->noFallback = static_cast<UBool>(att & URES_ATT_NO_FALLBACK);
  ------------------
  |  |  148|     19|#define URES_ATT_NO_FALLBACK 1
  ------------------
  215|     19|            pResData->isPoolBundle = static_cast<UBool>((att & URES_ATT_IS_POOL_BUNDLE) != 0);
  ------------------
  |  |  156|     19|#define URES_ATT_IS_POOL_BUNDLE 2
  ------------------
  216|     19|            pResData->usesPoolBundle = static_cast<UBool>((att & URES_ATT_USES_POOL_BUNDLE) != 0);
  ------------------
  |  |  157|     19|#define URES_ATT_USES_POOL_BUNDLE 4
  ------------------
  217|     19|            pResData->poolStringIndexLimit|=(att&0xf000)<<12;  // bits 15..12 -> 27..24
  218|     19|            pResData->poolStringIndex16Limit = static_cast<int32_t>(static_cast<uint32_t>(att) >> 16);
  219|     19|        }
  220|     19|        if((pResData->isPoolBundle || pResData->usesPoolBundle) && indexLength<=URES_INDEX_POOL_CHECKSUM) {
  ------------------
  |  Branch (220:13): [True: 0, False: 19]
  |  Branch (220:39): [True: 0, False: 19]
  |  Branch (220:68): [True: 0, False: 0]
  ------------------
  221|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  222|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|      0|            return;
  224|      0|        }
  225|     19|        if( indexLength>URES_INDEX_16BIT_TOP &&
  ------------------
  |  Branch (225:13): [True: 19, False: 0]
  ------------------
  226|     19|            indexes[URES_INDEX_16BIT_TOP]>indexes[URES_INDEX_KEYS_TOP]
  ------------------
  |  Branch (226:13): [True: 19, False: 0]
  ------------------
  227|     19|        ) {
  228|     19|            pResData->p16BitUnits = reinterpret_cast<const uint16_t*>(pResData->pRoot + indexes[URES_INDEX_KEYS_TOP]);
  229|     19|        }
  230|     19|    }
  231|       |
  232|     19|    if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  588|     19|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|     19|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
                  if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  531|     19|#define U_ASCII_FAMILY 0
  ------------------
  |  Branch (232:8): [True: 0, False: 19]
  |  Branch (232:31): [Folded - Ignored]
  ------------------
  233|       |        /*
  234|       |         * formatVersion 1: compare key strings in native-charset order
  235|       |         * formatVersion 2 and up: compare key strings in ASCII order
  236|       |         */
  237|     19|        pResData->useNativeStrcmp=true;
  238|     19|    }
  239|     19|}
uresdata.cpp:_ZL18_res_findTableItemPK12ResourceDataPKtiPKcPS5_:
   76|   196k|                   const char *key, const char **realKey) {
   77|   196k|    const char *tableKey;
   78|   196k|    int32_t mid, start, limit;
   79|   196k|    int result;
   80|       |
   81|       |    /* do a binary search for the key */
   82|   196k|    start=0;
   83|   196k|    limit=length;
   84|   634k|    while(start<limit) {
  ------------------
  |  Branch (84:11): [True: 550k, False: 83.7k]
  ------------------
   85|   550k|        mid = (start + limit) / 2;
   86|   550k|        tableKey = RES_GET_KEY16(pResData, keyOffsets[mid]);
  ------------------
  |  |   44|   550k|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 550k, False: 0]
  |  |  ------------------
  |  |   45|   550k|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|   550k|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
   87|   550k|        if (pResData->useNativeStrcmp) {
  ------------------
  |  Branch (87:13): [True: 550k, False: 0]
  ------------------
   88|   550k|            result = uprv_strcmp(key, tableKey);
  ------------------
  |  |   38|   550k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   550k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   89|   550k|        } 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|   550k|        if (result < 0) {
  ------------------
  |  Branch (92:13): [True: 240k, False: 309k]
  ------------------
   93|   240k|            limit = mid;
   94|   309k|        } else if (result > 0) {
  ------------------
  |  Branch (94:20): [True: 197k, False: 112k]
  ------------------
   95|   197k|            start = mid + 1;
   96|   197k|        } else {
   97|       |            /* We found it! */
   98|   112k|            *realKey=tableKey;
   99|   112k|            return mid;
  100|   112k|        }
  101|   550k|    }
  102|  83.7k|    return URESDATA_ITEM_NOT_FOUND;  /* not found or table is empty. */
  ------------------
  |  |   53|  83.7k|#define URESDATA_ITEM_NOT_FOUND -1
  ------------------
  103|   196k|}
uresdata.cpp:_ZL18makeResourceFrom16PK12ResourceDatai:
  700|   102k|makeResourceFrom16(const ResourceData *pResData, int32_t res16) {
  701|   102k|    if(res16<pResData->poolStringIndex16Limit) {
  ------------------
  |  Branch (701:8): [True: 0, False: 102k]
  ------------------
  702|       |        // Pool string, nothing to do.
  703|   102k|    } else {
  704|       |        // Local string, adjust the 16-bit offset to a regular one,
  705|       |        // with a larger pool string index limit.
  706|   102k|        res16=res16-pResData->poolStringIndex16Limit+pResData->poolStringIndexLimit;
  707|   102k|    }
  708|   102k|    return URES_MAKE_RESOURCE(URES_STRING_V2, res16);
  ------------------
  |  |   87|   102k|#define URES_MAKE_RESOURCE(type, offset) (((Resource)(type)<<28)|(Resource)(offset))
  ------------------
  709|   102k|}

_ZN6icu_7817ResourceDataValueC2Ev:
  516|      1|        pResData(nullptr),
  517|      1|        validLocaleDataEntry(nullptr),
  518|      1|        res(static_cast<Resource>(URES_NONE)),
  519|      1|        fTraceInfo() {}
_ZN6icu_7817ResourceDataValue7setDataERK12ResourceData:
  522|      1|    void setData(const ResourceData &data) {
  523|      1|        pResData = &data;
  524|      1|    }
_ZN6icu_7817ResourceDataValue23setValidLocaleDataEntryEP18UResourceDataEntry:
  526|      1|    void setValidLocaleDataEntry(UResourceDataEntry *entry) {
  527|      1|        validLocaleDataEntry = entry;
  528|      1|    }
_ZN6icu_7817ResourceDataValue11setResourceEjONS_14ResourceTracerE:
  530|    942|    void setResource(Resource r, ResourceTracer&& traceInfo) {
  531|    942|        res = r;
  532|    942|        fTraceInfo = traceInfo;
  533|    942|    }
_ZNK6icu_7817ResourceDataValue7getDataEv:
  535|  2.82k|    const ResourceData &getData() const { return *pResData; }
_ZN6icu_7813res_getStringERKNS_14ResourceTracerEPK12ResourceDatajPi:
  486|   101k|        const ResourceData *pResData, Resource res, int32_t *pLength) {
  487|   101k|    traceInfo.trace("string");
  488|   101k|    return res_getStringNoTrace(pResData, res, pLength);
  ------------------
  |  |  205|   101k|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|   101k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   101k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   101k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  489|   101k|}

_ZNK15UResourceBundle10getResDataEv:
   94|   623k|    inline const ResourceData &getResData() const { return fData->fData; }

_ZN6icu_7818UnicodeSetIteratorC2ERKNS_10UnicodeSetE:
   22|      1|UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet) {
   23|      1|    cpString  = nullptr;
   24|      1|    reset(uSet);
   25|      1|}
_ZN6icu_7818UnicodeSetIteratorD2Ev:
   36|      1|UnicodeSetIterator::~UnicodeSetIterator() {
   37|      1|    delete cpString;
   38|      1|}
_ZN6icu_7818UnicodeSetIterator4nextEv:
   49|    382|UBool UnicodeSetIterator::next() {
   50|    382|    if (nextElement <= endElement) {
  ------------------
  |  Branch (50:9): [True: 376, False: 6]
  ------------------
   51|    376|        codepoint = codepointEnd = nextElement++;
   52|    376|        string = nullptr;
   53|    376|        return true;
   54|    376|    }
   55|      6|    if (range < endRange) {
  ------------------
  |  Branch (55:9): [True: 5, False: 1]
  ------------------
   56|      5|        loadRange(++range);
   57|      5|        codepoint = codepointEnd = nextElement++;
   58|      5|        string = nullptr;
   59|      5|        return true;
   60|      5|    }
   61|       |
   62|      1|    if (nextString >= stringCount) return false;
  ------------------
  |  Branch (62:9): [True: 1, False: 0]
  ------------------
   63|      0|    codepoint = static_cast<UChar32>(IS_STRING); // signal that value is actually a string
   64|      0|    string = static_cast<const UnicodeString*>(set->strings_->elementAt(nextString++));
   65|      0|    return true;
   66|      1|}
_ZN6icu_7818UnicodeSetIterator5resetERKNS_10UnicodeSetE:
  104|      1|void UnicodeSetIterator::reset(const UnicodeSet& uSet) {
  105|      1|    this->set = &uSet;
  106|      1|    reset();
  107|      1|}
_ZN6icu_7818UnicodeSetIterator5resetEv:
  112|      1|void UnicodeSetIterator::reset() {
  113|      1|    if (set == nullptr) {
  ------------------
  |  Branch (113:9): [True: 0, False: 1]
  ------------------
  114|       |        // Set up indices to empty iteration
  115|      0|        endRange = -1;
  116|      0|        stringCount = 0;
  117|      1|    } else {
  118|      1|        endRange = set->getRangeCount() - 1;
  119|      1|        stringCount = set->stringsSize();
  120|      1|    }
  121|      1|    range = 0;
  122|      1|    endElement = -1;
  123|      1|    nextElement = 0;            
  124|      1|    if (endRange >= 0) {
  ------------------
  |  Branch (124:9): [True: 1, False: 0]
  ------------------
  125|      1|        loadRange(range);
  126|      1|    }
  127|      1|    nextString = 0;
  128|      1|    string = nullptr;
  129|      1|}
_ZN6icu_7818UnicodeSetIterator9loadRangeEi:
  131|      6|void UnicodeSetIterator::loadRange(int32_t iRange) {
  132|      6|    nextElement = set->getRangeStart(iRange);
  133|      6|    endElement = set->getRangeEnd(iRange);
  134|      6|}

_ZN6icu_786UStackC2ER10UErrorCode:
   17|  4.02k|    UVector(status)
   18|  4.02k|{
   19|  4.02k|}
_ZN6icu_786UStackC2EPFvPvEPFa8UElementS4_ER10UErrorCode:
   27|      2|    UVector(d, c, status)
   28|      2|{
   29|      2|}
_ZN6icu_786UStackD2Ev:
   36|  4.02k|UStack::~UStack() {}

u_strFindFirst_78:
   57|     33|               const char16_t *sub, int32_t subLength) {
   58|     33|    const char16_t *start, *p, *q, *subLimit;
   59|     33|    char16_t c, cs, cq;
   60|       |
   61|     33|    if(sub==nullptr || subLength<-1) {
  ------------------
  |  Branch (61:8): [True: 0, False: 33]
  |  Branch (61:24): [True: 0, False: 33]
  ------------------
   62|      0|        return (char16_t *)s;
   63|      0|    }
   64|     33|    if(s==nullptr || length<-1) {
  ------------------
  |  Branch (64:8): [True: 0, False: 33]
  |  Branch (64:22): [True: 0, False: 33]
  ------------------
   65|      0|        return nullptr;
   66|      0|    }
   67|       |
   68|     33|    start=s;
   69|       |
   70|     33|    if(length<0 && subLength<0) {
  ------------------
  |  Branch (70:8): [True: 0, False: 33]
  |  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|     33|    if(subLength<0) {
  ------------------
  |  Branch (109:8): [True: 0, False: 33]
  ------------------
  110|      0|        subLength=u_strlen(sub);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  111|      0|    }
  112|     33|    if(subLength==0) {
  ------------------
  |  Branch (112:8): [True: 0, False: 33]
  ------------------
  113|      0|        return (char16_t *)s;
  114|      0|    }
  115|       |
  116|       |    /* get sub[0] to search for it fast */
  117|     33|    cs=*sub++;
  118|     33|    --subLength;
  119|     33|    subLimit=sub+subLength;
  120|       |
  121|     33|    if(subLength==0 && !U16_IS_SURROGATE(cs)) {
  ------------------
  |  |   75|      0|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|      0|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  ------------------
  |  Branch (121:8): [True: 0, False: 33]
  |  Branch (121:24): [True: 0, False: 0]
  ------------------
  122|       |        /* the substring consists of a single, non-surrogate BMP code point */
  123|      0|        return length<0 ? u_strchr(s, cs) : u_memchr(s, cs, length);
  ------------------
  |  |  385|      0|#define u_strchr U_ICU_ENTRY_POINT_RENAME(u_strchr)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      return length<0 ? u_strchr(s, cs) : u_memchr(s, cs, length);
  ------------------
  |  |  330|      0|#define u_memchr U_ICU_ENTRY_POINT_RENAME(u_memchr)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (123:16): [True: 0, False: 0]
  ------------------
  124|      0|    }
  125|       |
  126|     33|    if(length<0) {
  ------------------
  |  Branch (126:8): [True: 0, False: 33]
  ------------------
  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|     33|    } else {
  153|     33|        const char16_t *limit, *preLimit;
  154|       |
  155|       |        /* subLength was decremented above */
  156|     33|        if(length<=subLength) {
  ------------------
  |  Branch (156:12): [True: 0, False: 33]
  ------------------
  157|      0|            return nullptr; /* s is shorter than sub */
  158|      0|        }
  159|       |
  160|     33|        limit=s+length;
  161|       |
  162|       |        /* the substring must start before preLimit */
  163|     33|        preLimit=limit-subLength;
  164|       |
  165|    218|        while(s!=preLimit) {
  ------------------
  |  Branch (165:15): [True: 218, False: 0]
  ------------------
  166|    218|            c=*s++;
  167|    218|            if(c==cs) {
  ------------------
  |  Branch (167:16): [True: 33, False: 185]
  ------------------
  168|       |                /* found first substring char16_t, compare rest */
  169|     33|                p=s;
  170|     33|                q=sub;
  171|     66|                for(;;) {
  172|     66|                    if(q==subLimit) {
  ------------------
  |  Branch (172:24): [True: 33, False: 33]
  ------------------
  173|     33|                        if(isMatchAtCPBoundary(start, s-1, p, limit)) {
  ------------------
  |  Branch (173:28): [True: 33, False: 0]
  ------------------
  174|     33|                            return (char16_t *)(s-1); /* well-formed match */
  175|     33|                        } else {
  176|      0|                            break; /* no match because surrogate pair is split */
  177|      0|                        }
  178|     33|                    }
  179|     33|                    if(*p!=*q) {
  ------------------
  |  Branch (179:24): [True: 0, False: 33]
  ------------------
  180|      0|                        break; /* no match */
  181|      0|                    }
  182|     33|                    ++p;
  183|     33|                    ++q;
  184|     33|                }
  185|     33|            }
  186|    218|        }
  187|     33|    }
  188|       |
  189|       |    /* not found */
  190|      0|    return nullptr;
  191|     33|}
u_strchr_78:
  199|  14.7k|u_strchr(const char16_t *s, char16_t c) {
  200|  14.7k|    if(U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|  14.7k|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|  14.7k|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 0, False: 14.7k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  201|       |        /* make sure to not find half of a surrogate pair */
  202|      0|        return u_strFindFirst(s, -1, &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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  203|  14.7k|    } else {
  204|  14.7k|        char16_t cs;
  205|       |
  206|       |        /* trivial search for a BMP code point */
  207|  76.4k|        for(;;) {
  208|  76.4k|            if((cs=*s)==c) {
  ------------------
  |  Branch (208:16): [True: 14.7k, False: 61.6k]
  ------------------
  209|  14.7k|                return (char16_t *)s;
  210|  14.7k|            }
  211|  61.6k|            if(cs==0) {
  ------------------
  |  Branch (211:16): [True: 0, False: 61.6k]
  ------------------
  212|      0|                return nullptr;
  213|      0|            }
  214|  61.6k|            ++s;
  215|  61.6k|        }
  216|  14.7k|    }
  217|  14.7k|}
u_memchr_78:
  241|  4.71k|u_memchr(const char16_t *s, char16_t c, int32_t count) {
  242|  4.71k|    if(count<=0) {
  ------------------
  |  Branch (242:8): [True: 0, False: 4.71k]
  ------------------
  243|      0|        return nullptr; /* no string */
  244|  4.71k|    } else if(U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|  4.71k|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|  4.71k|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 0, False: 4.71k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  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|  4.71k|    } else {
  248|       |        /* trivial search for a BMP code point */
  249|  4.71k|        const char16_t *limit=s+count;
  250|  17.6k|        do {
  251|  17.6k|            if(*s==c) {
  ------------------
  |  Branch (251:16): [True: 4.69k, False: 12.9k]
  ------------------
  252|  4.69k|                return (char16_t *)s;
  253|  4.69k|            }
  254|  17.6k|        } while(++s!=limit);
  ------------------
  |  Branch (254:17): [True: 12.9k, False: 23]
  ------------------
  255|     23|        return nullptr;
  256|  4.71k|    }
  257|  4.71k|}
u_memrchr_78:
  416|      5|u_memrchr(const char16_t *s, char16_t c, int32_t count) {
  417|      5|    if(count<=0) {
  ------------------
  |  Branch (417:8): [True: 0, False: 5]
  ------------------
  418|      0|        return nullptr; /* no string */
  419|      5|    } else if(U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|      5|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|      5|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 0, False: 5]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  420|       |        /* make sure to not find half of a surrogate pair */
  421|      0|        return u_strFindLast(s, count, &c, 1);
  ------------------
  |  |  362|      0|#define u_strFindLast U_ICU_ENTRY_POINT_RENAME(u_strFindLast)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  422|      5|    } else {
  423|       |        /* trivial search for a BMP code point */
  424|      5|        const char16_t *limit=s+count;
  425|     25|        do {
  426|     25|            if(*(--limit)==c) {
  ------------------
  |  Branch (426:16): [True: 5, False: 20]
  ------------------
  427|      5|                return (char16_t *)limit;
  428|      5|            }
  429|     25|        } while(s!=limit);
  ------------------
  |  Branch (429:17): [True: 20, False: 0]
  ------------------
  430|      0|        return nullptr;
  431|      5|    }
  432|      5|}
u_strlen_78:
  995|   104k|{
  996|       |#if U_SIZEOF_WCHAR_T == U_SIZEOF_UCHAR
  997|       |    return (int32_t)uprv_wcslen((const wchar_t *)s);
  998|       |#else
  999|   104k|    const char16_t *t = s;
 1000|  1.29M|    while(*t != 0) {
  ------------------
  |  Branch (1000:11): [True: 1.18M, False: 104k]
  ------------------
 1001|  1.18M|      ++t;
 1002|  1.18M|    }
 1003|   104k|    return t - s;
 1004|   104k|#endif
 1005|   104k|}
u_countChar32_78:
 1008|  2.19M|u_countChar32(const char16_t *s, int32_t length) {
 1009|  2.19M|    int32_t count;
 1010|       |
 1011|  2.19M|    if(s==nullptr || length<-1) {
  ------------------
  |  Branch (1011:8): [True: 0, False: 2.19M]
  |  Branch (1011:22): [True: 0, False: 2.19M]
  ------------------
 1012|      0|        return 0;
 1013|      0|    }
 1014|       |
 1015|  2.19M|    count=0;
 1016|  2.19M|    if(length>=0) {
  ------------------
  |  Branch (1016:8): [True: 2.19M, False: 0]
  ------------------
 1017|   116M|        while(length>0) {
  ------------------
  |  Branch (1017:15): [True: 113M, False: 2.19M]
  ------------------
 1018|   113M|            ++count;
 1019|   113M|            if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   59|   227M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 252k, False: 113M]
  |  |  ------------------
  ------------------
                          if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   67|   252k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 252k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1019:35): [True: 252k, False: 0]
  ------------------
 1020|   252k|                s+=2;
 1021|   252k|                length-=2;
 1022|   113M|            } else {
 1023|   113M|                ++s;
 1024|   113M|                --length;
 1025|   113M|            }
 1026|   113M|        }
 1027|  2.19M|    } 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|  2.19M|    return count;
 1046|  2.19M|}
u_memcpy_78:
 1117|  18.6M|u_memcpy(char16_t *dest, const char16_t *src, int32_t count) {
 1118|  18.6M|    if(count > 0) {
  ------------------
  |  Branch (1118:8): [True: 18.6M, False: 0]
  ------------------
 1119|  18.6M|        uprv_memcpy(dest, src, (size_t)count*U_SIZEOF_UCHAR);
  ------------------
  |  |   42|  18.6M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  18.6M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  18.6M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  18.6M|    _Pragma("clang diagnostic push") \
  |  |   45|  18.6M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  18.6M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  18.6M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  18.6M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  18.6M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  18.6M|    _Pragma("clang diagnostic pop") \
  |  |   49|  18.6M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  18.6M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  18.6M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  18.6M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1120|  18.6M|    }
 1121|  18.6M|    return dest;
 1122|  18.6M|}
u_memcmp_78:
 1146|  1.51k|u_memcmp(const char16_t *buf1, const char16_t *buf2, int32_t count) {
 1147|  1.51k|    if(count > 0) {
  ------------------
  |  Branch (1147:8): [True: 1.51k, False: 0]
  ------------------
 1148|  1.51k|        const char16_t *limit = buf1 + count;
 1149|  1.51k|        int32_t result;
 1150|       |
 1151|  13.7k|        while (buf1 < limit) {
  ------------------
  |  Branch (1151:16): [True: 13.7k, False: 0]
  ------------------
 1152|  13.7k|            result = (int32_t)(uint16_t)*buf1 - (int32_t)(uint16_t)*buf2;
 1153|  13.7k|            if (result != 0) {
  ------------------
  |  Branch (1153:17): [True: 1.51k, False: 12.2k]
  ------------------
 1154|  1.51k|                return result;
 1155|  1.51k|            }
 1156|  12.2k|            buf1++;
 1157|  12.2k|            buf2++;
 1158|  12.2k|        }
 1159|  1.51k|    }
 1160|      0|    return 0;
 1161|  1.51k|}
u_unescapeAt_78:
 1216|      7|             void *context) {
 1217|       |
 1218|      7|    int32_t start = *offset;
 1219|      7|    UChar32 c;
 1220|      7|    UChar32 result = 0;
 1221|      7|    int8_t n = 0;
 1222|      7|    int8_t minDig = 0;
 1223|      7|    int8_t maxDig = 0;
 1224|      7|    int8_t bitsPerDigit = 4; 
 1225|      7|    int32_t dig;
 1226|      7|    UBool braces = false;
 1227|       |
 1228|       |    /* Check that offset is in range */
 1229|      7|    if (*offset < 0 || *offset >= length) {
  ------------------
  |  Branch (1229:9): [True: 0, False: 7]
  |  Branch (1229:24): [True: 0, False: 7]
  ------------------
 1230|      0|        goto err;
 1231|      0|    }
 1232|       |
 1233|       |    /* Fetch first char16_t after '\\' */
 1234|      7|    c = charAt((*offset)++, context);
 1235|       |
 1236|       |    /* Convert hexadecimal and octal escapes */
 1237|      7|    switch (c) {
 1238|      7|    case u'u':
  ------------------
  |  Branch (1238:5): [True: 7, False: 0]
  ------------------
 1239|      7|        minDig = maxDig = 4;
 1240|      7|        break;
 1241|      0|    case u'U':
  ------------------
  |  Branch (1241:5): [True: 0, False: 7]
  ------------------
 1242|      0|        minDig = maxDig = 8;
 1243|      0|        break;
 1244|      0|    case u'x':
  ------------------
  |  Branch (1244:5): [True: 0, False: 7]
  ------------------
 1245|      0|        minDig = 1;
 1246|      0|        if (*offset < length && charAt(*offset, context) == u'{') {
  ------------------
  |  Branch (1246:13): [True: 0, False: 0]
  |  Branch (1246:33): [True: 0, False: 0]
  ------------------
 1247|      0|            ++(*offset);
 1248|      0|            braces = true;
 1249|      0|            maxDig = 8;
 1250|      0|        } else {
 1251|      0|            maxDig = 2;
 1252|      0|        }
 1253|      0|        break;
 1254|      0|    default:
  ------------------
  |  Branch (1254:5): [True: 0, False: 7]
  ------------------
 1255|      0|        dig = _digit8(c);
 1256|      0|        if (dig >= 0) {
  ------------------
  |  Branch (1256:13): [True: 0, False: 0]
  ------------------
 1257|      0|            minDig = 1;
 1258|      0|            maxDig = 3;
 1259|      0|            n = 1; /* Already have first octal digit */
 1260|      0|            bitsPerDigit = 3;
 1261|      0|            result = dig;
 1262|      0|        }
 1263|      0|        break;
 1264|      7|    }
 1265|      7|    if (minDig != 0) {
  ------------------
  |  Branch (1265:9): [True: 7, False: 0]
  ------------------
 1266|     35|        while (*offset < length && n < maxDig) {
  ------------------
  |  Branch (1266:16): [True: 35, False: 0]
  |  Branch (1266:36): [True: 28, False: 7]
  ------------------
 1267|     28|            c = charAt(*offset, context);
 1268|     28|            dig = (bitsPerDigit == 3) ? _digit8(c) : _digit16(c);
  ------------------
  |  Branch (1268:19): [True: 0, False: 28]
  ------------------
 1269|     28|            if (dig < 0) {
  ------------------
  |  Branch (1269:17): [True: 0, False: 28]
  ------------------
 1270|      0|                break;
 1271|      0|            }
 1272|     28|            result = (result << bitsPerDigit) | dig;
 1273|     28|            ++(*offset);
 1274|     28|            ++n;
 1275|     28|        }
 1276|      7|        if (n < minDig) {
  ------------------
  |  Branch (1276:13): [True: 0, False: 7]
  ------------------
 1277|      0|            goto err;
 1278|      0|        }
 1279|      7|        if (braces) {
  ------------------
  |  Branch (1279:13): [True: 0, False: 7]
  ------------------
 1280|      0|            if (c != u'}') {
  ------------------
  |  Branch (1280:17): [True: 0, False: 0]
  ------------------
 1281|      0|                goto err;
 1282|      0|            }
 1283|      0|            ++(*offset);
 1284|      0|        }
 1285|      7|        if (result < 0 || result >= 0x110000) {
  ------------------
  |  Branch (1285:13): [True: 0, False: 7]
  |  Branch (1285:27): [True: 0, False: 7]
  ------------------
 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|      7|        if (*offset < length && U16_IS_LEAD(result)) {
  ------------------
  |  |   59|      7|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 7]
  |  |  ------------------
  ------------------
  |  Branch (1292:13): [True: 7, 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|      7|        return result;
 1311|      7|    }
 1312|       |
 1313|       |    /* Convert C-style escapes in table */
 1314|      0|    for (int32_t i=0; i<UNESCAPE_MAP_LENGTH; i+=2) {
  ------------------
  |  Branch (1314:23): [True: 0, False: 0]
  ------------------
 1315|      0|        if (c == UNESCAPE_MAP[i]) {
  ------------------
  |  Branch (1315:13): [True: 0, False: 0]
  ------------------
 1316|      0|            return UNESCAPE_MAP[i+1];
 1317|      0|        } else if (c < UNESCAPE_MAP[i]) {
  ------------------
  |  Branch (1317:20): [True: 0, False: 0]
  ------------------
 1318|      0|            break;
 1319|      0|        }
 1320|      0|    }
 1321|       |
 1322|       |    /* Map \cX to control-X: X & 0x1F */
 1323|      0|    if (c == u'c' && *offset < length) {
  ------------------
  |  Branch (1323:9): [True: 0, False: 0]
  |  Branch (1323:22): [True: 0, False: 0]
  ------------------
 1324|      0|        c = charAt((*offset)++, context);
 1325|      0|        if (U16_IS_LEAD(c) && *offset < length) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1325:31): [True: 0, False: 0]
  ------------------
 1326|      0|            char16_t c2 = charAt(*offset, context);
 1327|      0|            if (U16_IS_TRAIL(c2)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1328|      0|                ++(*offset);
 1329|      0|                c = U16_GET_SUPPLEMENTARY(c, c2);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
 1330|      0|            }
 1331|      0|        }
 1332|      0|        return 0x1F & c;
 1333|      0|    }
 1334|       |
 1335|       |    /* If no special forms are recognized, then consider
 1336|       |     * the backslash to generically escape the next character.
 1337|       |     * Deal with surrogate pairs. */
 1338|      0|    if (U16_IS_LEAD(c) && *offset < length) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1338:27): [True: 0, False: 0]
  ------------------
 1339|      0|        char16_t c2 = charAt(*offset, context);
 1340|      0|        if (U16_IS_TRAIL(c2)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1341|      0|            ++(*offset);
 1342|      0|            return U16_GET_SUPPLEMENTARY(c, c2);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
 1343|      0|        }
 1344|      0|    }
 1345|      0|    return c;
 1346|       |
 1347|      0| err:
 1348|       |    /* Invalid escape sequence */
 1349|      0|    *offset = start; /* Reset to initial value */
 1350|      0|    return (UChar32)0xFFFFFFFF;
 1351|      0|}
u_terminateUChars_78:
 1469|  14.7k|u_terminateUChars(char16_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1470|  14.7k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|  14.7k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  14.7k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|  14.7k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 14.7k, False: 0]
  |  |  |  Branch (1438:31): [True: 14.7k, False: 0]
  |  |  ------------------
  |  | 1439|  14.7k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|  14.7k|                                                                        \
  |  | 1441|  14.7k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 14.7k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|  14.7k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 14.7k, False: 0]
  |  |  ------------------
  |  | 1444|  14.7k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|  14.7k|            dest[length]=0;                                             \
  |  | 1446|  14.7k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|  14.7k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 14.7k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|  14.7k|        } else if(length==destCapacity) {                               \
  |  |  ------------------
  |  |  |  Branch (1450:19): [True: 0, False: 0]
  |  |  ------------------
  |  | 1451|      0|            /* unable to NUL-terminate, but the string itself fit - set a warning code */ \
  |  | 1452|      0|            *pErrorCode=U_STRING_NOT_TERMINATED_WARNING;                \
  |  | 1453|      0|        } else /* length>destCapacity */ {                              \
  |  | 1454|      0|            /* even the string itself did not fit - set an error code */ \
  |  | 1455|      0|            *pErrorCode=U_BUFFER_OVERFLOW_ERROR;                        \
  |  | 1456|      0|        }                                                               \
  |  | 1457|  14.7k|    } \
  |  | 1458|  14.7k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  14.7k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1471|  14.7k|    return length;
 1472|  14.7k|}
u_terminateChars_78:
 1475|  8.47k|u_terminateChars(char *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1476|  8.47k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|  8.47k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  8.47k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|  8.47k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 8.47k, False: 0]
  |  |  |  Branch (1438:31): [True: 8.47k, False: 0]
  |  |  ------------------
  |  | 1439|  8.47k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|  8.47k|                                                                        \
  |  | 1441|  8.47k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 8.47k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|  8.47k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 8.30k, False: 169]
  |  |  ------------------
  |  | 1444|  8.30k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|  8.30k|            dest[length]=0;                                             \
  |  | 1446|  8.30k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|  8.30k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 8.30k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|  8.30k|        } else if(length==destCapacity) {                               \
  |  |  ------------------
  |  |  |  Branch (1450:19): [True: 169, False: 0]
  |  |  ------------------
  |  | 1451|    169|            /* unable to NUL-terminate, but the string itself fit - set a warning code */ \
  |  | 1452|    169|            *pErrorCode=U_STRING_NOT_TERMINATED_WARNING;                \
  |  | 1453|    169|        } 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|  8.47k|    } \
  |  | 1458|  8.47k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  8.47k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1477|  8.47k|    return length;
 1478|  8.47k|}
ustr_hashUCharsN_78:
 1523|  2.70k|ustr_hashUCharsN(const char16_t *str, int32_t length) {
 1524|  2.70k|    STRING_HASH(char16_t, str, length, *p);
  ------------------
  |  | 1506|  2.70k|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.70k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|  2.70k|    uint32_t hash = 0;                        \
  |  | 1508|  2.70k|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|  2.70k|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 2.70k, False: 0]
  |  |  ------------------
  |  | 1510|  2.70k|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|  2.70k|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|  2.70k|        const TYPE *limit = p + len;          \
  |  | 1513|  10.1k|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 7.45k, False: 2.70k]
  |  |  ------------------
  |  | 1514|  7.45k|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  7.45k|            p += inc;                         \
  |  | 1516|  7.45k|        }                                     \
  |  | 1517|  2.70k|    }                                         \
  |  | 1518|  2.70k|    return static_cast<int32_t>(hash);        \
  |  | 1519|  2.70k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.70k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1525|  2.70k|}
ustr_hashCharsN_78:
 1528|   258k|ustr_hashCharsN(const char *str, int32_t length) {
 1529|   258k|    STRING_HASH(uint8_t, str, length, *p);
  ------------------
  |  | 1506|   258k|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   258k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|   258k|    uint32_t hash = 0;                        \
  |  | 1508|   258k|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|   258k|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 258k, False: 0]
  |  |  ------------------
  |  | 1510|   258k|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|   258k|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|   258k|        const TYPE *limit = p + len;          \
  |  | 1513|  3.60M|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 3.34M, False: 258k]
  |  |  ------------------
  |  | 1514|  3.34M|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  3.34M|            p += inc;                         \
  |  | 1516|  3.34M|        }                                     \
  |  | 1517|   258k|    }                                         \
  |  | 1518|   258k|    return static_cast<int32_t>(hash);        \
  |  | 1519|   258k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   258k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1530|   258k|}
ustr_hashICharsN_78:
 1533|  1.62M|ustr_hashICharsN(const char *str, int32_t length) {
 1534|  1.62M|    STRING_HASH(char, str, length, (uint8_t)uprv_tolower(*p));
  ------------------
  |  | 1506|  1.62M|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.62M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|  1.62M|    uint32_t hash = 0;                        \
  |  | 1508|  1.62M|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|  1.62M|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 1.62M, False: 0]
  |  |  ------------------
  |  | 1510|  1.62M|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|  1.62M|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|  1.62M|        const TYPE *limit = p + len;          \
  |  | 1513|  4.90M|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 3.28M, False: 1.62M]
  |  |  ------------------
  |  | 1514|  3.28M|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  3.28M|            p += inc;                         \
  |  | 1516|  3.28M|        }                                     \
  |  | 1517|  1.62M|    }                                         \
  |  | 1518|  1.62M|    return static_cast<int32_t>(hash);        \
  |  | 1519|  1.62M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.62M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1535|  1.62M|}
ustring.cpp:_ZL19isMatchAtCPBoundaryPKDsS0_S0_S0_:
   43|     33|isMatchAtCPBoundary(const char16_t *start, const char16_t *match, const char16_t *matchLimit, const char16_t *limit) {
   44|     33|    if(U16_IS_TRAIL(*match) && start!=match && U16_IS_LEAD(*(match-1))) {
  ------------------
  |  |   67|     66|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 33]
  |  |  ------------------
  ------------------
                  if(U16_IS_TRAIL(*match) && start!=match && U16_IS_LEAD(*(match-1))) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (44:32): [True: 0, False: 0]
  ------------------
   45|       |        /* the leading edge of the match is in the middle of a surrogate pair */
   46|      0|        return false;
   47|      0|    }
   48|     33|    if(U16_IS_LEAD(*(matchLimit-1)) && matchLimit!=limit && U16_IS_TRAIL(*matchLimit)) {
  ------------------
  |  |   59|     66|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 33]
  |  |  ------------------
  ------------------
                  if(U16_IS_LEAD(*(matchLimit-1)) && matchLimit!=limit && U16_IS_TRAIL(*matchLimit)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (48:40): [True: 0, False: 0]
  ------------------
   49|       |        /* the trailing edge of the match is in the middle of a surrogate pair */
   50|      0|        return false;
   51|      0|    }
   52|     33|    return true;
   53|     33|}
ustring.cpp:_ZL8_digit16Ds:
 1196|     28|static int32_t _digit16(char16_t c) {
 1197|     28|    if (c >= u'0' && c <= u'9') {
  ------------------
  |  Branch (1197:9): [True: 28, False: 0]
  |  Branch (1197:22): [True: 12, False: 16]
  ------------------
 1198|     12|        return c - u'0';
 1199|     12|    }
 1200|     16|    if (c >= u'A' && c <= u'F') {
  ------------------
  |  Branch (1200:9): [True: 16, False: 0]
  |  Branch (1200:22): [True: 0, False: 16]
  ------------------
 1201|      0|        return c - (u'A' - 10);
 1202|      0|    }
 1203|     16|    if (c >= u'a' && c <= u'f') {
  ------------------
  |  Branch (1203:9): [True: 16, False: 0]
  |  Branch (1203:22): [True: 16, False: 0]
  ------------------
 1204|     16|        return c - (u'a' - 10);
 1205|     16|    }
 1206|      0|    return -1;
 1207|     16|}

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

utext_moveIndex32_78:
   48|  30.2k|utext_moveIndex32(UText *ut, int32_t delta) {
   49|  30.2k|    UChar32  c;
   50|  30.2k|    if (delta > 0) {
  ------------------
  |  Branch (50:9): [True: 30.2k, False: 0]
  ------------------
   51|   120k|        do {
   52|   120k|            if(ut->chunkOffset>=ut->chunkLength && !utext_access(ut, ut->chunkNativeLimit, true)) {
  ------------------
  |  Branch (52:16): [True: 147, False: 120k]
  |  Branch (52:52): [True: 147, False: 0]
  ------------------
   53|    147|                return false;
   54|    147|            }
   55|   120k|            c = ut->chunkContents[ut->chunkOffset];
   56|   120k|            if (U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|   120k|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|   120k|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 9.29k, False: 111k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   57|  9.29k|                c = utext_next32(ut);
  ------------------
  |  | 1904|  9.29k|#define utext_next32 U_ICU_ENTRY_POINT_RENAME(utext_next32)
  |  |  ------------------
  |  |  |  |  123|  9.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   58|  9.29k|                if (c == U_SENTINEL) {
  ------------------
  |  |  469|  9.29k|#define U_SENTINEL (-1)
  ------------------
  |  Branch (58:21): [True: 0, False: 9.29k]
  ------------------
   59|      0|                    return false;
   60|      0|                }
   61|   111k|            } else {
   62|   111k|                ut->chunkOffset++;
   63|   111k|            }
   64|   120k|        } while(--delta>0);
  ------------------
  |  Branch (64:17): [True: 90.4k, False: 30.0k]
  ------------------
   65|       |
   66|  30.2k|    } else if (delta<0) {
  ------------------
  |  Branch (66:16): [True: 0, False: 0]
  ------------------
   67|      0|        do {
   68|      0|            if(ut->chunkOffset<=0 && !utext_access(ut, ut->chunkNativeStart, false)) {
  ------------------
  |  Branch (68:16): [True: 0, False: 0]
  |  Branch (68:38): [True: 0, False: 0]
  ------------------
   69|      0|                return false;
   70|      0|            }
   71|      0|            c = ut->chunkContents[ut->chunkOffset-1];
   72|      0|            if (U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|      0|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|      0|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|      0|                c = utext_previous32(ut);
  ------------------
  |  | 1912|      0|#define utext_previous32 U_ICU_ENTRY_POINT_RENAME(utext_previous32)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   74|      0|                if (c == U_SENTINEL) {
  ------------------
  |  |  469|      0|#define U_SENTINEL (-1)
  ------------------
  |  Branch (74:21): [True: 0, False: 0]
  ------------------
   75|      0|                    return false;
   76|      0|                }
   77|      0|            } else {
   78|      0|                ut->chunkOffset--;
   79|      0|            }
   80|      0|        } while(++delta<0);
  ------------------
  |  Branch (80:17): [True: 0, False: 0]
  ------------------
   81|      0|    }
   82|       |
   83|  30.0k|    return true;
   84|  30.2k|}
utext_getNativeIndex_78:
  101|   578M|utext_getNativeIndex(const UText *ut) {
  102|   578M|    if(ut->chunkOffset <= ut->nativeIndexingLimit) {
  ------------------
  |  Branch (102:8): [True: 578M, False: 0]
  ------------------
  103|   578M|        return ut->chunkNativeStart+ut->chunkOffset;
  104|   578M|    } else {
  105|      0|        return ut->pFuncs->mapOffsetToNative(ut);
  106|      0|    }
  107|   578M|}
utext_setNativeIndex_78:
  111|   160M|utext_setNativeIndex(UText *ut, int64_t index) {
  112|   160M|    if(index<ut->chunkNativeStart || index>=ut->chunkNativeLimit) {
  ------------------
  |  Branch (112:8): [True: 0, False: 160M]
  |  Branch (112:38): [True: 18.4k, False: 160M]
  ------------------
  113|       |        // The desired position is outside of the current chunk.
  114|       |        // Access the new position.  Assume a forward iteration from here,
  115|       |        // which will also be optimimum for a single random access.
  116|       |        // Reverse iterations may suffer slightly.
  117|  18.4k|        ut->pFuncs->access(ut, index, true);
  118|   160M|    } else if((int32_t)(index - ut->chunkNativeStart) <= ut->nativeIndexingLimit) {
  ------------------
  |  Branch (118:15): [True: 160M, False: 0]
  ------------------
  119|       |        // utf-16 indexing.
  120|   160M|        ut->chunkOffset=(int32_t)(index-ut->chunkNativeStart);
  121|   160M|    } else {
  122|      0|         ut->chunkOffset=ut->pFuncs->mapNativeIndexToUTF16(ut, index);
  123|      0|    }
  124|       |    // The convention is that the index must always be on a code point boundary.
  125|       |    // Adjust the index position if it is in the middle of a surrogate pair.
  126|   160M|    if (ut->chunkOffset<ut->chunkLength) {
  ------------------
  |  Branch (126:9): [True: 160M, False: 18.4k]
  ------------------
  127|   160M|        char16_t c= ut->chunkContents[ut->chunkOffset];
  128|   160M|        if (U16_IS_TRAIL(c)) {
  ------------------
  |  |   67|   160M|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 219k, False: 159M]
  |  |  ------------------
  ------------------
  129|   219k|            if (ut->chunkOffset==0) {
  ------------------
  |  Branch (129:17): [True: 67, False: 219k]
  ------------------
  130|     67|                ut->pFuncs->access(ut, ut->chunkNativeStart, false);
  131|     67|            }
  132|   219k|            if (ut->chunkOffset>0) {
  ------------------
  |  Branch (132:17): [True: 219k, False: 67]
  ------------------
  133|   219k|                char16_t lead = ut->chunkContents[ut->chunkOffset-1];
  134|   219k|                if (U16_IS_LEAD(lead)) {
  ------------------
  |  |   59|   219k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 219k]
  |  |  ------------------
  ------------------
  135|      0|                    ut->chunkOffset--;
  136|      0|                }
  137|   219k|            }
  138|   219k|        }
  139|   160M|    }
  140|   160M|}
utext_current32_78:
  188|  76.6M|utext_current32(UText *ut) {
  189|  76.6M|    UChar32  c;
  190|  76.6M|    if (ut->chunkOffset==ut->chunkLength) {
  ------------------
  |  Branch (190:9): [True: 6.40k, False: 76.6M]
  ------------------
  191|       |        // Current position is just off the end of the chunk.
  192|  6.40k|        if (ut->pFuncs->access(ut, ut->chunkNativeLimit, true) == false) {
  ------------------
  |  Branch (192:13): [True: 6.40k, False: 0]
  ------------------
  193|       |            // Off the end of the text.
  194|  6.40k|            return U_SENTINEL;
  ------------------
  |  |  469|  6.40k|#define U_SENTINEL (-1)
  ------------------
  195|  6.40k|        }
  196|  6.40k|    }
  197|       |
  198|  76.6M|    c = ut->chunkContents[ut->chunkOffset];
  199|  76.6M|    if (U16_IS_LEAD(c) == false) {
  ------------------
  |  |   59|  76.6M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  ------------------
  |  Branch (199:9): [True: 76.3M, False: 361k]
  ------------------
  200|       |        // Normal, non-supplementary case.
  201|  76.3M|        return c;
  202|  76.3M|    }
  203|       |
  204|       |    //
  205|       |    //  Possible supplementary char.
  206|       |    //
  207|   361k|    UChar32   trail = 0;
  208|   361k|    UChar32   supplementaryC = c;
  209|   361k|    if ((ut->chunkOffset+1) < ut->chunkLength) {
  ------------------
  |  Branch (209:9): [True: 361k, False: 112]
  ------------------
  210|       |        // The trail surrogate is in the same chunk.
  211|   361k|        trail = ut->chunkContents[ut->chunkOffset+1];
  212|   361k|    } else {
  213|       |        //  The trail surrogate is in a different chunk.
  214|       |        //     Because we must maintain the iteration position, we need to switch forward
  215|       |        //     into the new chunk, get the trail surrogate, then revert the chunk back to the
  216|       |        //     original one.
  217|       |        //     An edge case to be careful of:  the entire text may end with an unpaired
  218|       |        //        leading surrogate.  The attempt to access the trail will fail, but
  219|       |        //        the original position before the unpaired lead still needs to be restored.
  220|    112|        int64_t  nativePosition = ut->chunkNativeLimit;
  221|    112|        if (ut->pFuncs->access(ut, nativePosition, true)) {
  ------------------
  |  Branch (221:13): [True: 0, False: 112]
  ------------------
  222|      0|            trail = ut->chunkContents[ut->chunkOffset];
  223|      0|        }
  224|    112|        UBool r = ut->pFuncs->access(ut, nativePosition, false);  // reverse iteration flag loads preceding chunk
  225|    112|        U_ASSERT(r);
  ------------------
  |  |   35|    112|#   define U_ASSERT(exp) (void)0
  ------------------
  226|       |        // Here we need to restore chunkOffset since the access functions were called with
  227|       |        // chunkNativeLimit but that is not where we were (we were 1 code unit before the
  228|       |        // limit). Restoring was originally added in ICU-4669 but did not support access
  229|       |        // functions that changed the chunk size, the following does.
  230|    112|        ut->chunkOffset = ut->chunkLength - 1;
  231|    112|        if(!r) {
  ------------------
  |  Branch (231:12): [True: 0, False: 112]
  ------------------
  232|      0|            return U_SENTINEL;
  ------------------
  |  |  469|      0|#define U_SENTINEL (-1)
  ------------------
  233|      0|        }
  234|    112|    }
  235|       |
  236|   361k|    if (U16_IS_TRAIL(trail)) {
  ------------------
  |  |   67|   361k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 274k, False: 87.2k]
  |  |  ------------------
  ------------------
  237|   274k|        supplementaryC = U16_GET_SUPPLEMENTARY(c, trail);
  ------------------
  |  |  113|   274k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|   274k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  238|   274k|    }
  239|   361k|    return supplementaryC;
  240|       |
  241|   361k|}
utext_char32At_78:
  245|  2.19M|utext_char32At(UText *ut, int64_t nativeIndex) {
  246|  2.19M|    UChar32 c = U_SENTINEL;
  ------------------
  |  |  469|  2.19M|#define U_SENTINEL (-1)
  ------------------
  247|       |
  248|       |    // Fast path the common case.
  249|  2.19M|    if (nativeIndex>=ut->chunkNativeStart && nativeIndex < ut->chunkNativeStart + ut->nativeIndexingLimit) {
  ------------------
  |  Branch (249:9): [True: 2.19M, False: 0]
  |  Branch (249:46): [True: 2.19M, False: 1.91k]
  ------------------
  250|  2.19M|        ut->chunkOffset = (int32_t)(nativeIndex - ut->chunkNativeStart);
  251|  2.19M|        c = ut->chunkContents[ut->chunkOffset];
  252|  2.19M|        if (U16_IS_SURROGATE(c) == false) {
  ------------------
  |  |   75|  2.19M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|  2.19M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  ------------------
  |  Branch (252:13): [True: 2.15M, False: 43.5k]
  ------------------
  253|  2.15M|            return c;
  254|  2.15M|        }
  255|  2.19M|    }
  256|       |
  257|       |
  258|  45.4k|    utext_setNativeIndex(ut, nativeIndex);
  ------------------
  |  | 1915|  45.4k|#define utext_setNativeIndex U_ICU_ENTRY_POINT_RENAME(utext_setNativeIndex)
  |  |  ------------------
  |  |  |  |  123|  45.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  45.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  45.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|  45.4k|    if (nativeIndex>=ut->chunkNativeStart && ut->chunkOffset<ut->chunkLength) {
  ------------------
  |  Branch (259:9): [True: 45.4k, False: 0]
  |  Branch (259:46): [True: 43.5k, False: 1.91k]
  ------------------
  260|  43.5k|        c = ut->chunkContents[ut->chunkOffset];
  261|  43.5k|        if (U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|  43.5k|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|  43.5k|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 43.5k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  262|       |            // For surrogates, let current32() deal with the complications
  263|       |            //    of supplementaries that may span chunk boundaries.
  264|  43.5k|            c = utext_current32(ut);
  ------------------
  |  | 1893|  43.5k|#define utext_current32 U_ICU_ENTRY_POINT_RENAME(utext_current32)
  |  |  ------------------
  |  |  |  |  123|  43.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  43.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  43.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|  43.5k|        }
  266|  43.5k|    }
  267|  45.4k|    return c;
  268|  2.19M|}
utext_next32_78:
  272|   416M|utext_next32(UText *ut) {
  273|   416M|    UChar32       c;
  274|       |
  275|   416M|    if (ut->chunkOffset >= ut->chunkLength) {
  ------------------
  |  Branch (275:9): [True: 595k, False: 415M]
  ------------------
  276|   595k|        if (ut->pFuncs->access(ut, ut->chunkNativeLimit, true) == false) {
  ------------------
  |  Branch (276:13): [True: 595k, False: 0]
  ------------------
  277|   595k|            return U_SENTINEL;
  ------------------
  |  |  469|   595k|#define U_SENTINEL (-1)
  ------------------
  278|   595k|        }
  279|   595k|    }
  280|       |
  281|   415M|    c = ut->chunkContents[ut->chunkOffset++];
  282|   415M|    if (U16_IS_LEAD(c) == false) {
  ------------------
  |  |   59|   415M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  ------------------
  |  Branch (282:9): [True: 413M, False: 1.54M]
  ------------------
  283|       |        // Normal case, not supplementary.
  284|       |        //   (A trail surrogate seen here is just returned as is, as a surrogate value.
  285|       |        //    It cannot be part of a pair.)
  286|   413M|        return c;
  287|   413M|    }
  288|       |
  289|  1.54M|    if (ut->chunkOffset >= ut->chunkLength) {
  ------------------
  |  Branch (289:9): [True: 190, False: 1.53M]
  ------------------
  290|    190|        if (ut->pFuncs->access(ut, ut->chunkNativeLimit, true) == false) {
  ------------------
  |  Branch (290:13): [True: 190, False: 0]
  ------------------
  291|       |            // c is an unpaired lead surrogate at the end of the text.
  292|       |            // return it as it is.
  293|    190|            return c;
  294|    190|        }
  295|    190|    }
  296|  1.53M|    UChar32 trail = ut->chunkContents[ut->chunkOffset];
  297|  1.53M|    if (U16_IS_TRAIL(trail) == false) {
  ------------------
  |  |   67|  1.53M|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  ------------------
  |  Branch (297:9): [True: 460k, False: 1.07M]
  ------------------
  298|       |        // c was an unpaired lead surrogate, not at the end of the text.
  299|       |        // return it as it is (unpaired).  Iteration position is on the
  300|       |        // following character, possibly in the next chunk, where the
  301|       |        //  trail surrogate would have been if it had existed.
  302|   460k|        return c;
  303|   460k|    }
  304|       |
  305|  1.07M|    UChar32 supplementary = U16_GET_SUPPLEMENTARY(c, trail);
  ------------------
  |  |  113|  1.07M|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|  1.07M|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  306|  1.07M|    ut->chunkOffset++;   // move iteration position over the trail surrogate.
  307|  1.07M|    return supplementary;
  308|  1.53M|    }
utext_previous32_78:
  312|  13.4k|utext_previous32(UText *ut) {
  313|  13.4k|    UChar32       c;
  314|       |
  315|  13.4k|    if (ut->chunkOffset <= 0) {
  ------------------
  |  Branch (315:9): [True: 0, False: 13.4k]
  ------------------
  316|      0|        if (ut->pFuncs->access(ut, ut->chunkNativeStart, false) == false) {
  ------------------
  |  Branch (316:13): [True: 0, False: 0]
  ------------------
  317|      0|            return U_SENTINEL;
  ------------------
  |  |  469|      0|#define U_SENTINEL (-1)
  ------------------
  318|      0|        }
  319|      0|    }
  320|  13.4k|    ut->chunkOffset--;
  321|  13.4k|    c = ut->chunkContents[ut->chunkOffset];
  322|  13.4k|    if (U16_IS_TRAIL(c) == false) {
  ------------------
  |  |   67|  13.4k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  ------------------
  |  Branch (322:9): [True: 13.4k, False: 0]
  ------------------
  323|       |        // Normal case, not supplementary.
  324|       |        //   (A lead surrogate seen here is just returned as is, as a surrogate value.
  325|       |        //    It cannot be part of a pair.)
  326|  13.4k|        return c;
  327|  13.4k|    }
  328|       |
  329|      0|    if (ut->chunkOffset <= 0) {
  ------------------
  |  Branch (329:9): [True: 0, False: 0]
  ------------------
  330|      0|        if (ut->pFuncs->access(ut, ut->chunkNativeStart, false) == false) {
  ------------------
  |  Branch (330:13): [True: 0, False: 0]
  ------------------
  331|       |            // c is an unpaired trail surrogate at the start of the text.
  332|       |            // return it as it is.
  333|      0|            return c;
  334|      0|        }
  335|      0|    }
  336|       |
  337|      0|    UChar32 lead = ut->chunkContents[ut->chunkOffset-1];
  338|      0|    if (U16_IS_LEAD(lead) == false) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  ------------------
  |  Branch (338:9): [True: 0, False: 0]
  ------------------
  339|       |        // c was an unpaired trail surrogate, not at the end of the text.
  340|       |        // return it as it is (unpaired).  Iteration position is at c
  341|      0|        return c;
  342|      0|    }
  343|       |
  344|      0|    UChar32 supplementary = U16_GET_SUPPLEMENTARY(lead, c);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  345|      0|    ut->chunkOffset--;   // move iteration position over the lead surrogate.
  346|      0|    return supplementary;
  347|      0|}
utext_freeze_78:
  473|  7.39k|utext_freeze(UText *ut) {
  474|       |    // Zero out the WRITABLE flag.
  475|  7.39k|    ut->providerProperties &= ~(I32_FLAG(UTEXT_PROVIDER_WRITABLE));
  ------------------
  |  |   37|  7.39k|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
  476|  7.39k|}
utext_clone_78:
  525|  7.39k|utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status) {
  526|  7.39k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (526:9): [True: 0, False: 7.39k]
  ------------------
  527|      0|        return dest;
  528|      0|    }
  529|  7.39k|    UText *result = src->pFuncs->clone(dest, src, deep, status);
  530|  7.39k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (530:9): [True: 0, False: 7.39k]
  ------------------
  531|      0|        return result;
  532|      0|    }
  533|  7.39k|    if (result == nullptr) {
  ------------------
  |  Branch (533:9): [True: 0, False: 7.39k]
  ------------------
  534|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  535|      0|        return result;
  536|      0|    }
  537|  7.39k|    if (readOnly) {
  ------------------
  |  Branch (537:9): [True: 7.39k, False: 0]
  ------------------
  538|  7.39k|        utext_freeze(result);
  ------------------
  |  | 1896|  7.39k|#define utext_freeze U_ICU_ENTRY_POINT_RENAME(utext_freeze)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  539|  7.39k|    }
  540|  7.39k|    return result;
  541|  7.39k|}
utext_setup_78:
  581|  2.22M|utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) {
  582|  2.22M|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (582:9): [True: 0, False: 2.22M]
  ------------------
  583|      0|        return ut;
  584|      0|    }
  585|       |
  586|  2.22M|    if (ut == nullptr) {
  ------------------
  |  Branch (586:9): [True: 7.39k, False: 2.21M]
  ------------------
  587|       |        // We need to heap-allocate storage for the new UText
  588|  7.39k|        int32_t spaceRequired = sizeof(UText);
  589|  7.39k|        if (extraSpace > 0) {
  ------------------
  |  Branch (589:13): [True: 0, False: 7.39k]
  ------------------
  590|      0|            spaceRequired = sizeof(ExtendedUText) + extraSpace - sizeof(std::max_align_t);
  591|      0|        }
  592|  7.39k|        ut = (UText *)uprv_malloc(spaceRequired);
  ------------------
  |  | 1524|  7.39k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  593|  7.39k|        if (ut == nullptr) {
  ------------------
  |  Branch (593:13): [True: 0, False: 7.39k]
  ------------------
  594|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
  595|      0|            return nullptr;
  596|  7.39k|        } else {
  597|  7.39k|            *ut = emptyText;
  598|  7.39k|            ut->flags |= UTEXT_HEAP_ALLOCATED;
  599|  7.39k|            if (spaceRequired>0) {
  ------------------
  |  Branch (599:17): [True: 7.39k, False: 0]
  ------------------
  600|  7.39k|                ut->extraSize = extraSpace;
  601|  7.39k|                ut->pExtra    = &((ExtendedUText *)ut)->extension;
  602|  7.39k|            }
  603|  7.39k|        }
  604|  2.21M|    } else {
  605|       |        // We have been supplied with an already existing UText.
  606|       |        // Verify that it really appears to be a UText.
  607|  2.21M|        if (ut->magic != UTEXT_MAGIC) {
  ------------------
  |  Branch (607:13): [True: 0, False: 2.21M]
  ------------------
  608|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
  609|      0|            return ut;
  610|      0|        }
  611|       |        // If the ut is already open and there's a provider supplied close
  612|       |        //   function, call it.
  613|  2.21M|        if ((ut->flags & UTEXT_OPEN) && ut->pFuncs->close != nullptr)  {
  ------------------
  |  Branch (613:13): [True: 7.39k, False: 2.21M]
  |  Branch (613:41): [True: 7.39k, False: 0]
  ------------------
  614|  7.39k|            ut->pFuncs->close(ut);
  615|  7.39k|        }
  616|  2.21M|        ut->flags &= ~UTEXT_OPEN;
  617|       |
  618|       |        // If extra space was requested by our caller, check whether
  619|       |        //   sufficient already exists, and allocate new if needed.
  620|  2.21M|        if (extraSpace > ut->extraSize) {
  ------------------
  |  Branch (620:13): [True: 0, False: 2.21M]
  ------------------
  621|       |            // Need more space.  If there is existing separately allocated space,
  622|       |            //   delete it first, then allocate new space.
  623|      0|            if (ut->flags & UTEXT_EXTRA_HEAP_ALLOCATED) {
  ------------------
  |  Branch (623:17): [True: 0, False: 0]
  ------------------
  624|      0|                uprv_free(ut->pExtra);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  625|      0|                ut->extraSize = 0;
  626|      0|            }
  627|      0|            ut->pExtra = uprv_malloc(extraSpace);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  628|      0|            if (ut->pExtra == nullptr) {
  ------------------
  |  Branch (628:17): [True: 0, False: 0]
  ------------------
  629|      0|                *status = U_MEMORY_ALLOCATION_ERROR;
  630|      0|            } else {
  631|      0|                ut->extraSize = extraSpace;
  632|      0|                ut->flags |= UTEXT_EXTRA_HEAP_ALLOCATED;
  633|      0|            }
  634|      0|        }
  635|  2.21M|    }
  636|  2.22M|    if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (636:9): [True: 2.22M, False: 0]
  ------------------
  637|  2.22M|        ut->flags |= UTEXT_OPEN;
  638|       |
  639|       |        // Initialize all remaining fields of the UText.
  640|       |        //
  641|  2.22M|        ut->context             = nullptr;
  642|  2.22M|        ut->chunkContents       = nullptr;
  643|  2.22M|        ut->p                   = nullptr;
  644|  2.22M|        ut->q                   = nullptr;
  645|  2.22M|        ut->r                   = nullptr;
  646|  2.22M|        ut->a                   = 0;
  647|  2.22M|        ut->b                   = 0;
  648|  2.22M|        ut->c                   = 0;
  649|  2.22M|        ut->chunkOffset         = 0;
  650|  2.22M|        ut->chunkLength         = 0;
  651|  2.22M|        ut->chunkNativeStart    = 0;
  652|  2.22M|        ut->chunkNativeLimit    = 0;
  653|  2.22M|        ut->nativeIndexingLimit = 0;
  654|  2.22M|        ut->providerProperties  = 0;
  655|  2.22M|        ut->privA               = 0;
  656|  2.22M|        ut->privB               = 0;
  657|  2.22M|        ut->privC               = 0;
  658|  2.22M|        ut->privP               = nullptr;
  659|  2.22M|        if (ut->pExtra!=nullptr && ut->extraSize>0)
  ------------------
  |  Branch (659:13): [True: 7.39k, False: 2.21M]
  |  Branch (659:36): [True: 0, False: 7.39k]
  ------------------
  660|  2.22M|            uprv_memset(ut->pExtra, 0, ut->extraSize);
  ------------------
  |  |  100|      0|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  661|       |
  662|  2.22M|    }
  663|  2.22M|    return ut;
  664|  2.22M|}
utext_close_78:
  668|  2.21M|utext_close(UText *ut) {
  669|  2.21M|    if (ut==nullptr ||
  ------------------
  |  Branch (669:9): [True: 0, False: 2.21M]
  ------------------
  670|  2.21M|        ut->magic != UTEXT_MAGIC ||
  ------------------
  |  Branch (670:9): [True: 0, False: 2.21M]
  ------------------
  671|  2.21M|        (ut->flags & UTEXT_OPEN) == 0)
  ------------------
  |  Branch (671:9): [True: 0, False: 2.21M]
  ------------------
  672|      0|    {
  673|       |        // The supplied ut is not an open UText.
  674|       |        // Do nothing.
  675|      0|        return ut;
  676|      0|    }
  677|       |
  678|       |    // If the provider gave us a close function, call it now.
  679|       |    // This will clean up anything allocated specifically by the provider.
  680|  2.21M|    if (ut->pFuncs->close != nullptr) {
  ------------------
  |  Branch (680:9): [True: 2.21M, False: 0]
  ------------------
  681|  2.21M|        ut->pFuncs->close(ut);
  682|  2.21M|    }
  683|  2.21M|    ut->flags &= ~UTEXT_OPEN;
  684|       |
  685|       |    // If we (the framework) allocated the UText or subsidiary storage,
  686|       |    //   delete it.
  687|  2.21M|    if (ut->flags & UTEXT_EXTRA_HEAP_ALLOCATED) {
  ------------------
  |  Branch (687:9): [True: 0, False: 2.21M]
  ------------------
  688|      0|        uprv_free(ut->pExtra);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  689|      0|        ut->pExtra = nullptr;
  690|      0|        ut->flags &= ~UTEXT_EXTRA_HEAP_ALLOCATED;
  691|      0|        ut->extraSize = 0;
  692|      0|    }
  693|       |
  694|       |    // Zero out function table of the closed UText.  This is a defensive move,
  695|       |    //   intended to cause applications that inadvertently use a closed
  696|       |    //   utext to crash with null pointer errors.
  697|  2.21M|    ut->pFuncs        = nullptr;
  698|       |
  699|  2.21M|    if (ut->flags & UTEXT_HEAP_ALLOCATED) {
  ------------------
  |  Branch (699:9): [True: 7.39k, False: 2.21M]
  ------------------
  700|       |        // This UText was allocated by UText setup.  We need to free it.
  701|       |        // Clear magic, so we can detect if the user messes up and immediately
  702|       |        //  tries to reopen another UText using the deleted storage.
  703|  7.39k|        ut->magic = 0;
  704|  7.39k|        uprv_free(ut);
  ------------------
  |  | 1503|  7.39k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  705|  7.39k|        ut = nullptr;
  706|  7.39k|    }
  707|  2.21M|    return ut;
  708|  2.21M|}
utext_openUnicodeString_78:
 2299|  2.19M|utext_openUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status) {
 2300|  2.19M|    ut = utext_openConstUnicodeString(ut, s, status);
  ------------------
  |  | 1907|  2.19M|#define utext_openConstUnicodeString U_ICU_ENTRY_POINT_RENAME(utext_openConstUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  2.19M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.19M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.19M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2301|  2.19M|    if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (2301:9): [True: 2.19M, False: 0]
  ------------------
 2302|  2.19M|        ut->providerProperties |= I32_FLAG(UTEXT_PROVIDER_WRITABLE);
  ------------------
  |  |   37|  2.19M|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
 2303|  2.19M|    }
 2304|  2.19M|    return ut;
 2305|  2.19M|}
utext_openConstUnicodeString_78:
 2310|  2.19M|utext_openConstUnicodeString(UText *ut, const UnicodeString *s, UErrorCode *status) {
 2311|  2.19M|    if (U_SUCCESS(*status) && s->isBogus()) {
  ------------------
  |  Branch (2311:9): [True: 2.19M, False: 0]
  |  Branch (2311:31): [True: 0, False: 2.19M]
  ------------------
 2312|       |        // The UnicodeString is bogus, but we still need to detach the UText
 2313|       |        //   from whatever it was hooked to before, if anything.
 2314|      0|        utext_openUChars(ut, nullptr, 0, status);
  ------------------
  |  | 1909|      0|#define utext_openUChars U_ICU_ENTRY_POINT_RENAME(utext_openUChars)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2315|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2316|      0|        return ut;
 2317|      0|    }
 2318|  2.19M|    ut = utext_setup(ut, 0, status);
  ------------------
  |  | 1916|  2.19M|#define utext_setup U_ICU_ENTRY_POINT_RENAME(utext_setup)
  |  |  ------------------
  |  |  |  |  123|  2.19M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.19M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.19M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2319|       |    //    note:  use the standard (writable) function table for UnicodeString.
 2320|       |    //           The flag settings disable writing, so having the functions in
 2321|       |    //           the table is harmless.
 2322|  2.19M|    if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (2322:9): [True: 2.19M, False: 0]
  ------------------
 2323|  2.19M|        ut->pFuncs              = &unistrFuncs;
 2324|  2.19M|        ut->context             = s;
 2325|  2.19M|        ut->providerProperties  = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS);
  ------------------
  |  |   37|  2.19M|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
 2326|  2.19M|        ut->chunkContents       = s->getBuffer();
 2327|  2.19M|        ut->chunkLength         = s->length();
 2328|  2.19M|        ut->chunkNativeStart    = 0;
 2329|  2.19M|        ut->chunkNativeLimit    = ut->chunkLength;
 2330|  2.19M|        ut->nativeIndexingLimit = ut->chunkLength;
 2331|  2.19M|    }
 2332|  2.19M|    return ut;
 2333|  2.19M|}
utext_openUChars_78:
 2617|  22.1k|utext_openUChars(UText *ut, const char16_t *s, int64_t length, UErrorCode *status) {
 2618|  22.1k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2618:9): [True: 0, False: 22.1k]
  ------------------
 2619|      0|        return nullptr;
 2620|      0|    }
 2621|  22.1k|    if(s==nullptr && length==0) {
  ------------------
  |  Branch (2621:8): [True: 14.7k, False: 7.39k]
  |  Branch (2621:22): [True: 14.7k, False: 0]
  ------------------
 2622|  14.7k|        s = gEmptyUString;
 2623|  14.7k|    }
 2624|  22.1k|    if (s==nullptr || length < -1 || length>INT32_MAX) {
  ------------------
  |  Branch (2624:9): [True: 0, False: 22.1k]
  |  Branch (2624:23): [True: 0, False: 22.1k]
  |  Branch (2624:38): [True: 0, False: 22.1k]
  ------------------
 2625|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2626|      0|        return nullptr;
 2627|      0|    }
 2628|  22.1k|    ut = utext_setup(ut, 0, status);
  ------------------
  |  | 1916|  22.1k|#define utext_setup U_ICU_ENTRY_POINT_RENAME(utext_setup)
  |  |  ------------------
  |  |  |  |  123|  22.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  22.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  22.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2629|  22.1k|    if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (2629:9): [True: 22.1k, False: 0]
  ------------------
 2630|  22.1k|        ut->pFuncs               = &ucstrFuncs;
 2631|  22.1k|        ut->context              = s;
 2632|  22.1k|        ut->providerProperties   = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS);
  ------------------
  |  |   37|  22.1k|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
 2633|  22.1k|        if (length==-1) {
  ------------------
  |  Branch (2633:13): [True: 0, False: 22.1k]
  ------------------
 2634|      0|            ut->providerProperties |= I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
  ------------------
  |  |   37|      0|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
 2635|      0|        }
 2636|  22.1k|        ut->a                    = length;
 2637|  22.1k|        ut->chunkContents        = s;
 2638|  22.1k|        ut->chunkNativeStart     = 0;
 2639|  22.1k|        ut->chunkNativeLimit     = length>=0? length : 0;
  ------------------
  |  Branch (2639:36): [True: 22.1k, False: 0]
  ------------------
 2640|  22.1k|        ut->chunkLength          = (int32_t)ut->chunkNativeLimit;
 2641|  22.1k|        ut->chunkOffset          = 0;
 2642|  22.1k|        ut->nativeIndexingLimit  = ut->chunkLength;
 2643|  22.1k|    }
 2644|  22.1k|    return ut;
 2645|  22.1k|}
utext.cpp:_ZL12utext_accessP5UTextla:
   41|    147|utext_access(UText *ut, int64_t index, UBool forward) {
   42|    147|    return ut->pFuncs->access(ut, index, forward);
   43|    147|}
utext.cpp:_ZL16shallowTextCloneP5UTextPKS_P10UErrorCode:
  776|  7.39k|shallowTextClone(UText * dest, const UText * src, UErrorCode * status) {
  777|  7.39k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (777:9): [True: 0, False: 7.39k]
  ------------------
  778|      0|        return nullptr;
  779|      0|    }
  780|  7.39k|    int32_t  srcExtraSize = src->extraSize;
  781|       |
  782|       |    //
  783|       |    // Use the generic text_setup to allocate storage if required.
  784|       |    //
  785|  7.39k|    dest = utext_setup(dest, srcExtraSize, status);
  ------------------
  |  | 1916|  7.39k|#define utext_setup U_ICU_ENTRY_POINT_RENAME(utext_setup)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  786|  7.39k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (786:9): [True: 0, False: 7.39k]
  ------------------
  787|      0|        return dest;
  788|      0|    }
  789|       |
  790|       |    //
  791|       |    //  flags (how the UText was allocated) and the pointer to the
  792|       |    //   extra storage must retain the values in the cloned utext that
  793|       |    //   were set up by utext_setup.  Save them separately before
  794|       |    //   copying the whole struct.
  795|       |    //
  796|  7.39k|    void *destExtra = dest->pExtra;
  797|  7.39k|    int32_t flags   = dest->flags;
  798|       |
  799|       |
  800|       |    //
  801|       |    //  Copy the whole UText struct by value.
  802|       |    //  Any "Extra" storage is copied also.
  803|       |    //
  804|  7.39k|    int sizeToCopy = src->sizeOfStruct;
  805|  7.39k|    if (sizeToCopy > dest->sizeOfStruct) {
  ------------------
  |  Branch (805:9): [True: 0, False: 7.39k]
  ------------------
  806|      0|        sizeToCopy = dest->sizeOfStruct;
  807|      0|    }
  808|  7.39k|    uprv_memcpy(dest, src, sizeToCopy);
  ------------------
  |  |   42|  7.39k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  7.39k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  7.39k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  7.39k|    _Pragma("clang diagnostic push") \
  |  |   45|  7.39k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  7.39k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  7.39k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  7.39k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  7.39k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  7.39k|    _Pragma("clang diagnostic pop") \
  |  |   49|  7.39k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  7.39k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  7.39k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  7.39k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  809|  7.39k|    dest->pExtra = destExtra;
  810|  7.39k|    dest->flags  = flags;
  811|  7.39k|    if (srcExtraSize > 0) {
  ------------------
  |  Branch (811:9): [True: 0, False: 7.39k]
  ------------------
  812|      0|        uprv_memcpy(dest->pExtra, src->pExtra, srcExtraSize);
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  813|      0|    }
  814|       |
  815|       |    //
  816|       |    // Relocate any pointers in the target that refer to the UText itself
  817|       |    //   to point to the cloned copy rather than the original source.
  818|       |    //
  819|  7.39k|    adjustPointer(dest, &dest->context, src);
  820|  7.39k|    adjustPointer(dest, &dest->p, src);
  821|  7.39k|    adjustPointer(dest, &dest->q, src);
  822|  7.39k|    adjustPointer(dest, &dest->r, src);
  823|  7.39k|    adjustPointer(dest, (const void **)&dest->chunkContents, src);
  824|       |
  825|       |    // The newly shallow-cloned UText does _not_ own the underlying storage for the text.
  826|       |    // (The source for the clone may or may not have owned the text.)
  827|       |
  828|  7.39k|    dest->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT);
  ------------------
  |  |   37|  7.39k|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
  829|       |
  830|  7.39k|    return dest;
  831|  7.39k|}
utext.cpp:_ZL13adjustPointerP5UTextPPKvPKS_:
  753|  36.9k|static void adjustPointer(UText *dest, const void **destPtr, const UText *src) {
  754|       |    // convert all pointers to (char *) so that byte address arithmetic will work.
  755|  36.9k|    char  *dptr = (char *)*destPtr;
  756|  36.9k|    char  *dUText = (char *)dest;
  757|  36.9k|    char  *sUText = (char *)src;
  758|       |
  759|  36.9k|    if (dptr >= (char *)src->pExtra && dptr < ((char*)src->pExtra)+src->extraSize) {
  ------------------
  |  Branch (759:9): [True: 10.2k, False: 26.7k]
  |  Branch (759:40): [True: 0, False: 10.2k]
  ------------------
  760|       |        // target ptr was to something within the src UText's pExtra storage.
  761|       |        //   relocate it into the target UText's pExtra region.
  762|      0|        *destPtr = ((char *)dest->pExtra) + (dptr - (char *)src->pExtra);
  763|  36.9k|    } else if (dptr>=sUText && dptr < sUText+src->sizeOfStruct) {
  ------------------
  |  Branch (763:16): [True: 10.2k, False: 26.7k]
  |  Branch (763:32): [True: 0, False: 10.2k]
  ------------------
  764|       |        // target ptr was pointing to somewhere within the source UText itself.
  765|       |        //   Move it to the same offset within the target UText.
  766|      0|        *destPtr = dUText + (dptr-sUText);
  767|      0|    }
  768|  36.9k|}
utext.cpp:_ZL8pinIndexRll:
  735|   574k|pinIndex(int64_t &index, int64_t limit) {
  736|   574k|    if (index<0) {
  ------------------
  |  Branch (736:9): [True: 0, False: 574k]
  ------------------
  737|      0|        index = 0;
  738|   574k|    } else if (index > limit) {
  ------------------
  |  Branch (738:16): [True: 0, False: 574k]
  ------------------
  739|      0|        index = limit;
  740|      0|    }
  741|   574k|    return static_cast<int32_t>(index);
  742|   574k|}
utext.cpp:_ZL16unistrTextAccessP5UTextla:
 2131|   574k|unistrTextAccess(UText *ut, int64_t index, UBool  forward) {
 2132|   574k|    int32_t length  = ut->chunkLength;
 2133|   574k|    ut->chunkOffset = pinIndex(index, length);
 2134|       |
 2135|       |    // Check whether request is at the start or end
 2136|   574k|    UBool retVal = (forward && index<length) || (!forward && index>0);
  ------------------
  |  Branch (2136:21): [True: 574k, False: 0]
  |  Branch (2136:32): [True: 0, False: 574k]
  |  Branch (2136:50): [True: 0, False: 574k]
  |  Branch (2136:62): [True: 0, False: 0]
  ------------------
 2137|   574k|    return retVal;
 2138|   574k|}
utext.cpp:_ZL15unistrTextCloseP5UText:
 2112|  2.19M|unistrTextClose(UText *ut) {
 2113|       |    // Most of the work of close is done by the generic UText framework close.
 2114|       |    // All that needs to be done here is delete the UnicodeString if the UText
 2115|       |    //  owns it.  This occurs if the UText was created by cloning.
 2116|  2.19M|    if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) {
  ------------------
  |  |   37|  2.19M|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
  |  Branch (2116:9): [True: 0, False: 2.19M]
  ------------------
 2117|      0|        UnicodeString *str = (UnicodeString *)ut->context;
 2118|      0|        delete str;
 2119|      0|        ut->context = nullptr;
 2120|      0|    }
 2121|  2.19M|}
utext.cpp:_ZL14ucstrTextCloneP5UTextPKS_aP10UErrorCode:
 2351|  7.39k|ucstrTextClone(UText *dest, const UText * src, UBool deep, UErrorCode * status) {
 2352|       |    // First do a generic shallow clone.
 2353|  7.39k|    dest = shallowTextClone(dest, src, status);
 2354|       |
 2355|       |    // For deep clones, make a copy of the string.
 2356|       |    //  The copied storage is owned by the newly created clone.
 2357|       |    //  A non-nullptr pointer in UText.p is the signal to the close() function to delete
 2358|       |    //    it.
 2359|       |    //
 2360|  7.39k|    if (deep && U_SUCCESS(*status)) {
  ------------------
  |  Branch (2360:9): [True: 0, False: 7.39k]
  |  Branch (2360:17): [True: 0, False: 0]
  ------------------
 2361|      0|        U_ASSERT(utext_nativeLength(dest) < INT32_MAX);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 2362|      0|        int32_t  len = (int32_t)utext_nativeLength(dest);
  ------------------
  |  | 1903|      0|#define utext_nativeLength U_ICU_ENTRY_POINT_RENAME(utext_nativeLength)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2363|       |
 2364|       |        // The cloned string IS going to be NUL terminated, whether or not the original was.
 2365|      0|        const char16_t *srcStr = (const char16_t *)src->context;
 2366|      0|        char16_t *copyStr = (char16_t *)uprv_malloc((len+1) * sizeof(char16_t));
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2367|      0|        if (copyStr == nullptr) {
  ------------------
  |  Branch (2367:13): [True: 0, False: 0]
  ------------------
 2368|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 2369|      0|        } else {
 2370|      0|            int64_t i;
 2371|      0|            for (i=0; i<len; i++) {
  ------------------
  |  Branch (2371:23): [True: 0, False: 0]
  ------------------
 2372|      0|                copyStr[i] = srcStr[i];
 2373|      0|            }
 2374|      0|            copyStr[len] = 0;
 2375|      0|            dest->context = copyStr;
 2376|      0|            dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT);
  ------------------
  |  |   37|      0|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
 2377|      0|        }
 2378|      0|    }
 2379|  7.39k|    return dest;
 2380|  7.39k|}
utext.cpp:_ZL15ucstrTextAccessP5UTextla:
 2420|  46.5k|ucstrTextAccess(UText *ut, int64_t index, UBool  forward) {
 2421|  46.5k|    const char16_t *str   = (const char16_t *)ut->context;
 2422|       |
 2423|       |    // pin the requested index to the bounds of the string,
 2424|       |    //  and set current iteration position.
 2425|  46.5k|    if (index<0) {
  ------------------
  |  Branch (2425:9): [True: 0, False: 46.5k]
  ------------------
 2426|      0|        index = 0;
 2427|  46.5k|    } else if (index < ut->chunkNativeLimit) {
  ------------------
  |  Branch (2427:16): [True: 67, False: 46.4k]
  ------------------
 2428|       |        // The request data is within the chunk as it is known so far.
 2429|       |        // Put index on a code point boundary.
 2430|     67|        U16_SET_CP_START(str, 0, index);
  ------------------
  |  |  515|     67|#define U16_SET_CP_START(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     67|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  516|     67|    if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   67|    134|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 67, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (516:32): [True: 0, False: 67]
  |  |  ------------------
  |  |  517|      0|        --(i); \
  |  |  518|      0|    } \
  |  |  519|     67|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     67|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2431|  46.4k|    } else if (ut->a >= 0) {
  ------------------
  |  Branch (2431:16): [True: 46.4k, False: 0]
  ------------------
 2432|       |        // We know the length of this string, and the user is requesting something
 2433|       |        // at or beyond the length.  Pin the requested index to the length.
 2434|  46.4k|        index = ut->a;
 2435|  46.4k|    } else {
 2436|       |        // Null terminated string, length not yet known, and the requested index
 2437|       |        //  is beyond where we have scanned so far.
 2438|       |        //  Scan to 32 UChars beyond the requested index.  The strategy here is
 2439|       |        //  to avoid fully scanning a long string when the caller only wants to
 2440|       |        //  see a few characters at its beginning.
 2441|      0|        int32_t scanLimit = (int32_t)index + 32;
 2442|      0|        if ((index + 32)>INT32_MAX || (index + 32)<0 ) {   // note: int64 expression
  ------------------
  |  Branch (2442:13): [True: 0, False: 0]
  |  Branch (2442:39): [True: 0, False: 0]
  ------------------
 2443|      0|            scanLimit = INT32_MAX;
 2444|      0|        }
 2445|       |
 2446|      0|        int32_t chunkLimit = (int32_t)ut->chunkNativeLimit;
 2447|      0|        for (; chunkLimit<scanLimit; chunkLimit++) {
  ------------------
  |  Branch (2447:16): [True: 0, False: 0]
  ------------------
 2448|      0|            if (str[chunkLimit] == 0) {
  ------------------
  |  Branch (2448:17): [True: 0, False: 0]
  ------------------
 2449|       |                // We found the end of the string.  Remember it, pin the requested index to it,
 2450|       |                //  and bail out of here.
 2451|      0|                ut->a = chunkLimit;
 2452|      0|                ut->chunkLength = chunkLimit;
 2453|      0|                ut->nativeIndexingLimit = chunkLimit;
 2454|      0|                if (index >= chunkLimit) {
  ------------------
  |  Branch (2454:21): [True: 0, False: 0]
  ------------------
 2455|      0|                    index = chunkLimit;
 2456|      0|                } else {
 2457|      0|                    U16_SET_CP_START(str, 0, index);
  ------------------
  |  |  515|      0|#define U16_SET_CP_START(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  516|      0|    if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (516:32): [True: 0, False: 0]
  |  |  ------------------
  |  |  517|      0|        --(i); \
  |  |  518|      0|    } \
  |  |  519|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2458|      0|                }
 2459|       |
 2460|      0|                ut->chunkNativeLimit = chunkLimit;
 2461|      0|                ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
  ------------------
  |  |   37|      0|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
 2462|      0|                goto breakout;
 2463|      0|            }
 2464|      0|        }
 2465|       |        // We scanned through the next batch of UChars without finding the end.
 2466|      0|        U16_SET_CP_START(str, 0, index);
  ------------------
  |  |  515|      0|#define U16_SET_CP_START(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  516|      0|    if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (516:32): [True: 0, False: 0]
  |  |  ------------------
  |  |  517|      0|        --(i); \
  |  |  518|      0|    } \
  |  |  519|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2467|      0|        if (chunkLimit == INT32_MAX) {
  ------------------
  |  Branch (2467:13): [True: 0, False: 0]
  ------------------
 2468|       |            // Scanned to the limit of a 32 bit length.
 2469|       |            // Forceably trim the overlength string back so length fits in int32
 2470|       |            //  TODO:  add support for 64 bit strings.
 2471|      0|            ut->a = chunkLimit;
 2472|      0|            ut->chunkLength = chunkLimit;
 2473|      0|            ut->nativeIndexingLimit = chunkLimit;
 2474|      0|            if (index > chunkLimit) {
  ------------------
  |  Branch (2474:17): [True: 0, False: 0]
  ------------------
 2475|      0|                index = chunkLimit;
 2476|      0|            }
 2477|      0|            ut->chunkNativeLimit = chunkLimit;
 2478|      0|            ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
  ------------------
  |  |   37|      0|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
 2479|      0|        } else {
 2480|       |            // The endpoint of a chunk must not be left in the middle of a surrogate pair.
 2481|       |            // If the current end is on a lead surrogate, back the end up by one.
 2482|       |            // It doesn't matter if the end char happens to be an unpaired surrogate,
 2483|       |            //    and it's simpler not to worry about it.
 2484|      0|            if (U16_IS_LEAD(str[chunkLimit-1])) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2485|      0|                --chunkLimit;
 2486|      0|            }
 2487|       |            // Null-terminated chunk with end still unknown.
 2488|       |            // Update the chunk length to reflect what has been scanned thus far.
 2489|       |            // That the full length is still unknown is (still) flagged by
 2490|       |            //    ut->a being < 0.
 2491|      0|            ut->chunkNativeLimit = chunkLimit;
 2492|      0|            ut->nativeIndexingLimit = chunkLimit;
 2493|      0|            ut->chunkLength = chunkLimit;
 2494|      0|        }
 2495|       |
 2496|      0|    }
 2497|  46.5k|breakout:
 2498|  46.5k|    U_ASSERT(index<=INT32_MAX);
  ------------------
  |  |   35|  46.5k|#   define U_ASSERT(exp) (void)0
  ------------------
 2499|  46.5k|    ut->chunkOffset = (int32_t)index;
 2500|       |
 2501|       |    // Check whether request is at the start or end
 2502|  46.5k|    UBool retVal = (forward && index<ut->chunkNativeLimit) || (!forward && index>0);
  ------------------
  |  Branch (2502:21): [True: 46.3k, False: 179]
  |  Branch (2502:32): [True: 0, False: 46.3k]
  |  Branch (2502:64): [True: 179, False: 46.3k]
  |  Branch (2502:76): [True: 112, False: 67]
  ------------------
 2503|  46.5k|    return retVal;
 2504|  46.5k|}
utext.cpp:_ZL14ucstrTextCloseP5UText:
 2384|  29.5k|ucstrTextClose(UText *ut) {
 2385|       |    // Most of the work of close is done by the generic UText framework close.
 2386|       |    // All that needs to be done here is delete the string if the UText
 2387|       |    //  owns it.  This occurs if the UText was created by cloning.
 2388|  29.5k|    if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) {
  ------------------
  |  |   37|  29.5k|#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
  ------------------
  |  Branch (2388:9): [True: 0, False: 29.5k]
  ------------------
 2389|      0|        char16_t *s = (char16_t *)ut->context;
 2390|      0|        uprv_free(s);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2391|      0|        ut->context = nullptr;
 2392|      0|    }
 2393|  29.5k|}

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

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

_ZN6icu_787UVectorC2ER10UErrorCode:
   33|  4.02k|        UVector(nullptr, nullptr, DEFAULT_CAPACITY, status) {
   34|  4.02k|}
_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_ER10UErrorCode:
   41|    719|        UVector(d, c, DEFAULT_CAPACITY, status) {
   42|    719|}
_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_EiR10UErrorCode:
   45|  5.66k|    deleter(d),
   46|  5.66k|    comparer(c)
   47|  5.66k|{
   48|  5.66k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (48:9): [True: 0, False: 5.66k]
  ------------------
   49|      0|        return;
   50|      0|    }
   51|       |    // Fix bogus initialCapacity values; avoid malloc(0) and integer overflow
   52|  5.66k|    if ((initialCapacity < 1) || (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(UElement)))) {
  ------------------
  |  Branch (52:9): [True: 0, False: 5.66k]
  |  Branch (52:34): [True: 0, False: 5.66k]
  ------------------
   53|      0|        initialCapacity = DEFAULT_CAPACITY;
   54|      0|    }
   55|  5.66k|    elements = static_cast<UElement*>(uprv_malloc(sizeof(UElement) * initialCapacity));
  ------------------
  |  | 1524|  5.66k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  5.66k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.66k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.66k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   56|  5.66k|    if (elements == nullptr) {
  ------------------
  |  Branch (56:9): [True: 0, False: 5.66k]
  ------------------
   57|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   58|  5.66k|    } else {
   59|  5.66k|        capacity = initialCapacity;
   60|  5.66k|    }
   61|  5.66k|}
_ZN6icu_787UVectorD2Ev:
   63|  5.66k|UVector::~UVector() {
   64|  5.66k|    removeAllElements();
   65|  5.66k|    uprv_free(elements);
  ------------------
  |  | 1503|  5.66k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  5.66k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.66k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.66k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|  5.66k|    elements = nullptr;
   67|  5.66k|}
_ZN6icu_787UVector10addElementEPvR10UErrorCode:
  102|  4.82k|void UVector::addElement(void* obj, UErrorCode &status) {
  103|  4.82k|    U_ASSERT(deleter == nullptr);
  ------------------
  |  |   35|  4.82k|#   define U_ASSERT(exp) (void)0
  ------------------
  104|  4.82k|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (104:9): [True: 4.82k, False: 0]
  ------------------
  105|  4.82k|        elements[count++].pointer = obj;
  106|  4.82k|    }
  107|  4.82k|}
_ZN6icu_787UVector12adoptElementEPvR10UErrorCode:
  109|      6|void UVector::adoptElement(void* obj, UErrorCode &status) {
  110|      6|    U_ASSERT(deleter != nullptr);
  ------------------
  |  |   35|      6|#   define U_ASSERT(exp) (void)0
  ------------------
  111|      6|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (111:9): [True: 6, False: 0]
  ------------------
  112|      6|        elements[count++].pointer = obj;
  113|      6|    } else {
  114|      0|        (*deleter)(obj);
  115|      0|    }
  116|      6|}
_ZN6icu_787UVector15insertElementAtEPviR10UErrorCode:
  149|    684|void UVector::insertElementAt(void* obj, int32_t index, UErrorCode &status) {
  150|    684|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (150:9): [True: 684, False: 0]
  ------------------
  151|    684|        if (0 <= index && index <= count) {
  ------------------
  |  Branch (151:13): [True: 684, False: 0]
  |  Branch (151:27): [True: 684, False: 0]
  ------------------
  152|  1.39k|            for (int32_t i=count; i>index; --i) {
  ------------------
  |  Branch (152:35): [True: 714, False: 684]
  ------------------
  153|    714|                elements[i] = elements[i-1];
  154|    714|            }
  155|    684|            elements[index].pointer = obj;
  156|    684|            ++count;
  157|    684|        } else {
  158|       |            /* index out of range */
  159|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  160|      0|        }
  161|    684|    }
  162|    684|    if (U_FAILURE(status) && deleter != nullptr) {
  ------------------
  |  Branch (162:9): [True: 0, False: 684]
  |  Branch (162:30): [True: 0, False: 0]
  ------------------
  163|      0|        (*deleter)(obj);
  164|      0|    }
  165|    684|}
_ZNK6icu_787UVector9elementAtEi:
  185|  7.19M|void* UVector::elementAt(int32_t index) const {
  186|  7.19M|    return (0 <= index && index < count) ? elements[index].pointer : nullptr;
  ------------------
  |  Branch (186:13): [True: 7.19M, False: 0]
  |  Branch (186:27): [True: 7.19M, False: 0]
  ------------------
  187|  7.19M|}
_ZN6icu_787UVector17removeAllElementsEv:
  251|  5.66k|void UVector::removeAllElements() {
  252|  5.66k|    if (deleter != nullptr) {
  ------------------
  |  Branch (252:9): [True: 918, False: 4.74k]
  ------------------
  253|  6.31k|        for (int32_t i=0; i<count; ++i) {
  ------------------
  |  Branch (253:27): [True: 5.39k, False: 918]
  ------------------
  254|  5.39k|            if (elements[i].pointer != nullptr) {
  ------------------
  |  Branch (254:17): [True: 5.39k, False: 0]
  ------------------
  255|  5.39k|                (*deleter)(elements[i].pointer);
  256|  5.39k|            }
  257|  5.39k|        }
  258|    918|    }
  259|  5.66k|    count = 0;
  260|  5.66k|}
_ZNK6icu_787UVector7indexOfEPvi:
  288|  5.39k|int32_t UVector::indexOf(void* obj, int32_t startIndex) const {
  289|  5.39k|    UElement key;
  290|  5.39k|    key.pointer = obj;
  291|  5.39k|    return indexOf(key, startIndex, HINT_KEY_POINTER);
  292|  5.39k|}
_ZNK6icu_787UVector7indexOfE8UElementia:
  300|  5.39k|int32_t UVector::indexOf(UElement key, int32_t startIndex, int8_t hint) const {
  301|  5.39k|    if (comparer != nullptr) {
  ------------------
  |  Branch (301:9): [True: 5.39k, False: 0]
  ------------------
  302|   476k|        for (int32_t i=startIndex; i<count; ++i) {
  ------------------
  |  Branch (302:36): [True: 470k, False: 5.39k]
  ------------------
  303|   470k|            if ((*comparer)(key, elements[i])) {
  ------------------
  |  Branch (303:17): [True: 0, False: 470k]
  ------------------
  304|      0|                return i;
  305|      0|            }
  306|   470k|        }
  307|  5.39k|    } 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|  5.39k|    return -1;
  324|  5.39k|}
_ZN6icu_787UVector14ensureCapacityEiR10UErrorCode:
  326|  10.9k|UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
  327|  10.9k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (327:9): [True: 0, False: 10.9k]
  ------------------
  328|      0|        return false;
  329|      0|    }
  330|  10.9k|    if (minimumCapacity < 0) {
  ------------------
  |  Branch (330:9): [True: 0, False: 10.9k]
  ------------------
  331|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  332|      0|        return false;
  333|      0|    }
  334|  10.9k|    if (capacity < minimumCapacity) {
  ------------------
  |  Branch (334:9): [True: 286, False: 10.6k]
  ------------------
  335|    286|        if (capacity > (INT32_MAX - 1) / 2) {        	// integer overflow check
  ------------------
  |  Branch (335:13): [True: 0, False: 286]
  ------------------
  336|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  337|      0|            return false;
  338|      0|        }
  339|    286|        int32_t newCap = capacity * 2;
  340|    286|        if (newCap < minimumCapacity) {
  ------------------
  |  Branch (340:13): [True: 0, False: 286]
  ------------------
  341|      0|            newCap = minimumCapacity;
  342|      0|        }
  343|    286|        if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(UElement))) { // integer overflow check
  ------------------
  |  Branch (343:13): [True: 0, False: 286]
  ------------------
  344|       |            // We keep the original memory contents on bad minimumCapacity.
  345|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  346|      0|            return false;
  347|      0|        }
  348|    286|        UElement* newElems = static_cast<UElement*>(uprv_realloc(elements, sizeof(UElement) * newCap));
  ------------------
  |  | 1536|    286|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|    286|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    286|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    286|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  349|    286|        if (newElems == nullptr) {
  ------------------
  |  Branch (349:13): [True: 0, False: 286]
  ------------------
  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|    286|        elements = newElems;
  355|    286|        capacity = newCap;
  356|    286|    }
  357|  10.9k|    return true;
  358|  10.9k|}
_ZN6icu_787UVector12sortedInsertEPvPFi8UElementS2_ER10UErrorCode:
  436|  5.39k|void UVector::sortedInsert(void* obj, UElementComparator *compare, UErrorCode& ec) {
  437|  5.39k|    UElement e;
  438|  5.39k|    e.pointer = obj;
  439|  5.39k|    sortedInsert(e, compare, ec);
  440|  5.39k|}
_ZN6icu_787UVector12sortedInsertE8UElementPFiS1_S1_ER10UErrorCode:
  455|  5.39k|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|  5.39k|    if (!ensureCapacity(count + 1, ec)) {
  ------------------
  |  Branch (461:9): [True: 0, False: 5.39k]
  ------------------
  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|  5.39k|    int32_t min = 0, max = count;
  468|  37.6k|    while (min != max) {
  ------------------
  |  Branch (468:12): [True: 32.2k, False: 5.39k]
  ------------------
  469|  32.2k|        int32_t probe = (min + max) / 2;
  470|  32.2k|        int32_t c = (*compare)(elements[probe], e);
  471|  32.2k|        if (c > 0) {
  ------------------
  |  Branch (471:13): [True: 17.1k, False: 15.0k]
  ------------------
  472|  17.1k|            max = probe;
  473|  17.1k|        } else {
  474|       |            // assert(c <= 0);
  475|  15.0k|            min = probe + 1;
  476|  15.0k|        }
  477|  32.2k|    }
  478|   237k|    for (int32_t i=count; i>min; --i) {
  ------------------
  |  Branch (478:27): [True: 231k, False: 5.39k]
  ------------------
  479|   231k|        elements[i] = elements[i-1];
  480|   231k|    }
  481|  5.39k|    elements[min] = e;
  482|  5.39k|    ++count;
  483|  5.39k|}
_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_787UVector4sizeEv:
  190|  2.66M|    inline int32_t size() const {return count;}
_ZNK6icu_787UVector8containsEPv:
  174|  5.39k|    inline UBool contains(void* obj) const {return indexOf(obj) >= 0;}
_ZN6icu_787UVector10hasDeleterEv:
  214|  4.82k|    bool hasDeleter() {return deleter != nullptr;}
_ZN6icu_786UStack4pushEPvR10UErrorCode:
  346|  4.82k|    inline void* push(void* obj, UErrorCode &status) {
  347|  4.82k|        if (hasDeleter()) {
  ------------------
  |  Branch (347:13): [True: 6, False: 4.82k]
  ------------------
  348|      6|            adoptElement(obj, status);
  349|      6|            return (U_SUCCESS(status)) ? obj : nullptr;
  ------------------
  |  Branch (349:20): [True: 6, False: 0]
  ------------------
  350|  4.82k|        } else {
  351|  4.82k|            addElement(obj, status);
  352|  4.82k|            return obj;
  353|  4.82k|        }
  354|  4.82k|    }

_ZN6icu_789UVector32C2ER10UErrorCode:
   30|   242k|    count(0),
   31|   242k|    capacity(0),
   32|   242k|    maxCapacity(0),
   33|   242k|    elements(nullptr)
   34|   242k|{
   35|   242k|    _init(DEFAULT_CAPACITY, status);
  ------------------
  |  |   19|   242k|#define DEFAULT_CAPACITY 8
  ------------------
   36|   242k|}
_ZN6icu_789UVector32C2EiR10UErrorCode:
   39|  10.9M|    count(0),
   40|  10.9M|    capacity(0),
   41|  10.9M|    maxCapacity(0),
   42|  10.9M|    elements(nullptr)
   43|  10.9M|{
   44|  10.9M|    _init(initialCapacity, status);
   45|  10.9M|}
_ZN6icu_789UVector325_initEiR10UErrorCode:
   49|  11.2M|void UVector32::_init(int32_t initialCapacity, UErrorCode &status) {
   50|       |    // Fix bogus initialCapacity values; avoid malloc(0)
   51|  11.2M|    if (initialCapacity < 1) {
  ------------------
  |  Branch (51:9): [True: 0, False: 11.2M]
  ------------------
   52|      0|        initialCapacity = DEFAULT_CAPACITY;
  ------------------
  |  |   19|      0|#define DEFAULT_CAPACITY 8
  ------------------
   53|      0|    }
   54|  11.2M|    if (maxCapacity>0 && maxCapacity<initialCapacity) {
  ------------------
  |  Branch (54:9): [True: 0, False: 11.2M]
  |  Branch (54:26): [True: 0, False: 0]
  ------------------
   55|      0|        initialCapacity = maxCapacity;
   56|      0|    }
   57|  11.2M|    if (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) {
  ------------------
  |  Branch (57:9): [True: 0, False: 11.2M]
  ------------------
   58|      0|        initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity);
  ------------------
  |  | 1529|      0|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity);
  ------------------
  |  |   19|      0|#define DEFAULT_CAPACITY 8
  ------------------
   59|      0|    }
   60|  11.2M|    elements = static_cast<int32_t*>(uprv_malloc(sizeof(int32_t) * initialCapacity));
  ------------------
  |  | 1524|  11.2M|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  11.2M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.2M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.2M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   61|  11.2M|    if (elements == nullptr) {
  ------------------
  |  Branch (61:9): [True: 0, False: 11.2M]
  ------------------
   62|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   63|  11.2M|    } else {
   64|  11.2M|        capacity = initialCapacity;
   65|  11.2M|    }
   66|  11.2M|}
_ZN6icu_789UVector32D2Ev:
   68|  11.2M|UVector32::~UVector32() {
   69|  11.2M|    uprv_free(elements);
  ------------------
  |  | 1503|  11.2M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  11.2M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.2M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.2M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|  11.2M|    elements = nullptr;
   71|  11.2M|}
_ZN6icu_789UVector3212setElementAtEii:
   98|   438M|void UVector32::setElementAt(int32_t elem, int32_t index) {
   99|   438M|    if (0 <= index && index < count) {
  ------------------
  |  Branch (99:9): [True: 438M, False: 0]
  |  Branch (99:23): [True: 438M, False: 0]
  ------------------
  100|   438M|        elements[index] = elem;
  101|   438M|    }
  102|       |    /* else index out of range */
  103|   438M|}
_ZN6icu_789UVector3215insertElementAtEiiR10UErrorCode:
  105|  2.10M|void UVector32::insertElementAt(int32_t elem, int32_t index, UErrorCode &status) {
  106|       |    // must have 0 <= index <= count
  107|  2.10M|    if (0 <= index && index <= count && ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (107:9): [True: 2.10M, False: 0]
  |  Branch (107:23): [True: 2.10M, False: 0]
  |  Branch (107:41): [True: 2.10M, False: 0]
  ------------------
  108|  49.6M|        for (int32_t i=count; i>index; --i) {
  ------------------
  |  Branch (108:31): [True: 47.5M, False: 2.10M]
  ------------------
  109|  47.5M|            elements[i] = elements[i-1];
  110|  47.5M|        }
  111|  2.10M|        elements[index] = elem;
  112|  2.10M|        ++count;
  113|  2.10M|    }
  114|       |    /* else index out of range */
  115|  2.10M|}
_ZN6icu_789UVector3217removeAllElementsEv:
  168|  2.56M|void UVector32::removeAllElements() {
  169|  2.56M|    count = 0;
  170|  2.56M|}
_ZN6icu_789UVector3214expandCapacityEiR10UErrorCode:
  200|   172k|UBool UVector32::expandCapacity(int32_t minimumCapacity, UErrorCode &status) {
  201|   172k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (201:9): [True: 0, False: 172k]
  ------------------
  202|      0|        return false;
  203|      0|    }
  204|   172k|    if (minimumCapacity < 0) {
  ------------------
  |  Branch (204:9): [True: 0, False: 172k]
  ------------------
  205|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  206|      0|        return false;
  207|      0|    }
  208|   172k|    if (capacity >= minimumCapacity) {
  ------------------
  |  Branch (208:9): [True: 0, False: 172k]
  ------------------
  209|      0|        return true;
  210|      0|    }
  211|   172k|    if (maxCapacity>0 && minimumCapacity>maxCapacity) {
  ------------------
  |  Branch (211:9): [True: 0, False: 172k]
  |  Branch (211:26): [True: 0, False: 0]
  ------------------
  212|      0|        status = U_BUFFER_OVERFLOW_ERROR;
  213|      0|        return false;
  214|      0|    }
  215|   172k|    if (capacity > (INT32_MAX - 1) / 2) {  // integer overflow check
  ------------------
  |  Branch (215:9): [True: 0, False: 172k]
  ------------------
  216|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  217|      0|        return false;
  218|      0|    }
  219|   172k|    int32_t newCap = capacity * 2;
  220|   172k|    if (newCap < minimumCapacity) {
  ------------------
  |  Branch (220:9): [True: 0, False: 172k]
  ------------------
  221|      0|        newCap = minimumCapacity;
  222|      0|    }
  223|   172k|    if (maxCapacity > 0 && newCap > maxCapacity) {
  ------------------
  |  Branch (223:9): [True: 0, False: 172k]
  |  Branch (223:28): [True: 0, False: 0]
  ------------------
  224|      0|        newCap = maxCapacity;
  225|      0|    }
  226|   172k|    if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) { // integer overflow check
  ------------------
  |  Branch (226:9): [True: 0, False: 172k]
  ------------------
  227|       |        // We keep the original memory contents on bad minimumCapacity/maxCapacity.
  228|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  229|      0|        return false;
  230|      0|    }
  231|   172k|    int32_t* newElems = static_cast<int32_t*>(uprv_realloc(elements, sizeof(int32_t) * newCap));
  ------------------
  |  | 1536|   172k|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|   172k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   172k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   172k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  232|   172k|    if (newElems == nullptr) {
  ------------------
  |  Branch (232:9): [True: 0, False: 172k]
  ------------------
  233|       |        // We keep the original contents on the memory failure on realloc.
  234|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  235|      0|        return false;
  236|      0|    }
  237|   172k|    elements = newElems;
  238|   172k|    capacity = newCap;
  239|   172k|    return true;
  240|   172k|}
_ZN6icu_789UVector327setSizeEi:
  278|  4.39M|void UVector32::setSize(int32_t newSize) {
  279|  4.39M|    int32_t i;
  280|  4.39M|    if (newSize < 0) {
  ------------------
  |  Branch (280:9): [True: 0, False: 4.39M]
  ------------------
  281|      0|        return;
  282|      0|    }
  283|  4.39M|    if (newSize > count) {
  ------------------
  |  Branch (283:9): [True: 4.39M, False: 0]
  ------------------
  284|  4.39M|        UErrorCode ec = U_ZERO_ERROR;
  285|  4.39M|        if (!ensureCapacity(newSize, ec)) {
  ------------------
  |  Branch (285:13): [True: 0, False: 4.39M]
  ------------------
  286|      0|            return;
  287|      0|        }
  288|   232M|        for (i=count; i<newSize; ++i) {
  ------------------
  |  Branch (288:23): [True: 227M, False: 4.39M]
  ------------------
  289|   227M|            elements[i] = 0;
  290|   227M|        }
  291|  4.39M|    } 
  292|  4.39M|    count = newSize;
  293|  4.39M|}

_ZN6icu_789UVector3214ensureCapacityEiR10UErrorCode:
  215|   448M|inline UBool UVector32::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
  216|   448M|    if ((minimumCapacity >= 0) && (capacity >= minimumCapacity)) {
  ------------------
  |  Branch (216:9): [True: 448M, False: 0]
  |  Branch (216:35): [True: 447M, False: 172k]
  ------------------
  217|   447M|        return true;
  218|   447M|    } else {
  219|   172k|        return expandCapacity(minimumCapacity, status);
  220|   172k|    }
  221|   448M|}
_ZNK6icu_789UVector3210elementAtiEi:
  223|  1.22G|inline int32_t UVector32::elementAti(int32_t index) const {
  224|  1.22G|    return (index >= 0 && count > 0 && count - index > 0) ? elements[index] : 0;
  ------------------
  |  Branch (224:13): [True: 1.22G, False: 0]
  |  Branch (224:27): [True: 1.22G, False: 0]
  |  Branch (224:40): [True: 1.22G, False: 0]
  ------------------
  225|  1.22G|}
_ZN6icu_789UVector3210addElementEiR10UErrorCode:
  228|   441M|inline void UVector32::addElement(int32_t elem, UErrorCode &status) {
  229|   441M|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (229:9): [True: 441M, False: 0]
  ------------------
  230|   441M|        elements[count] = elem;
  231|   441M|        count++;
  232|   441M|    }
  233|   441M|}
_ZNK6icu_789UVector324sizeEv:
  255|   221M|inline int32_t UVector32::size() const {
  256|   221M|    return count;
  257|   221M|}
_ZNK6icu_789UVector327isEmptyEv:
  259|  2.19M|inline UBool UVector32::isEmpty() const {
  260|  2.19M|    return count == 0;
  261|  2.19M|}
_ZNK6icu_789UVector3212lastElementiEv:
  267|  6.43M|inline int32_t UVector32::lastElementi() const {
  268|  6.43M|    return elementAti(count-1);
  269|  6.43M|}
_ZNK6icu_789UVector329getBufferEv:
  275|   227M|inline int32_t *UVector32::getBuffer() const {
  276|   227M|    return elements;
  277|   227M|}
_ZNK6icu_789UVector325peekiEv:
  286|  6.43M|inline int32_t UVector32::peeki() const {
  287|  6.43M|    return lastElementi();
  288|  6.43M|}
_ZN6icu_789UVector324pushEiR10UErrorCode:
  290|  51.8M|inline int32_t UVector32::push(int32_t i, UErrorCode &status) {
  291|  51.8M|    addElement(i, status);
  292|  51.8M|    return i;
  293|  51.8M|}
_ZN6icu_789UVector324popiEv:
  295|  2.22M|inline int32_t UVector32::popi() {
  296|  2.22M|    int32_t result = 0;
  297|  2.22M|    if (count > 0) {
  ------------------
  |  Branch (297:9): [True: 2.22M, False: 0]
  ------------------
  298|  2.22M|        count--;
  299|  2.22M|        result = elements[count];
  300|  2.22M|    }
  301|  2.22M|    return result;
  302|  2.22M|}

LLVMFuzzerTestOneInput:
   16|  7.39k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   17|  7.39k|  UErrorCode status = U_ZERO_ERROR;
   18|  7.39k|  uint8_t rnd8 = 0;
   19|  7.39k|  uint16_t rnd16 = 0;
   20|       |
   21|  7.39k|  if (size < 3) {
  ------------------
  |  Branch (21:7): [True: 2, False: 7.39k]
  ------------------
   22|      2|    return 0;
   23|      2|  }
   24|       |  // Extract one and two bytes from fuzzer data for random selection purpose.
   25|  7.39k|  rnd8 = *data;
   26|  7.39k|  data++;
   27|  7.39k|  rnd16 = *(reinterpret_cast<const uint16_t *>(data));
   28|  7.39k|  data = data + 2;
   29|  7.39k|  size = size - 3;
   30|       |
   31|  7.39k|  size_t unistr_size = size/2;
   32|  7.39k|  std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
   33|  7.39k|  std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
   34|       |
   35|  7.39k|  UText* fuzzstr = utext_openUChars(nullptr, fuzzbuff.get(), unistr_size, &status);
  ------------------
  |  | 1909|  7.39k|#define utext_openUChars U_ICU_ENTRY_POINT_RENAME(utext_openUChars)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   36|       |
   37|  7.39k|  const icu::Locale& locale = GetRandomLocale(rnd16);
   38|       |
   39|  7.39k|  std::unique_ptr<icu::BreakIterator> bi;
   40|       |
   41|  7.39k|  switch (rnd8 % 5) {
  ------------------
  |  Branch (41:11): [True: 0, False: 7.39k]
  ------------------
   42|  3.69k|    case 0:
  ------------------
  |  Branch (42:5): [True: 3.69k, False: 3.69k]
  ------------------
   43|  3.69k|      bi.reset(icu::BreakIterator::createWordInstance(locale, status));
   44|  3.69k|      break;
   45|  1.89k|    case 1:
  ------------------
  |  Branch (45:5): [True: 1.89k, False: 5.49k]
  ------------------
   46|  1.89k|      bi.reset(icu::BreakIterator::createLineInstance(locale, status));
   47|  1.89k|      break;
   48|    336|    case 2:
  ------------------
  |  Branch (48:5): [True: 336, False: 7.06k]
  ------------------
   49|    336|      bi.reset(icu::BreakIterator::createCharacterInstance(locale, status));
   50|    336|      break;
   51|  1.00k|    case 3:
  ------------------
  |  Branch (51:5): [True: 1.00k, False: 6.39k]
  ------------------
   52|  1.00k|      bi.reset(icu::BreakIterator::createSentenceInstance(locale, status));
   53|  1.00k|      break;
   54|    462|    case 4:
  ------------------
  |  Branch (54:5): [True: 462, False: 6.93k]
  ------------------
   55|    462|      bi.reset(icu::BreakIterator::createTitleInstance(locale, status));
   56|    462|      break;
   57|  7.39k|  }
   58|       |
   59|  7.39k|  bi->setText(fuzzstr, status);
   60|       |
   61|  7.39k|  if (U_FAILURE(status)) {
  ------------------
  |  Branch (61:7): [True: 0, False: 7.39k]
  ------------------
   62|      0|    utext_close(fuzzstr);
  ------------------
  |  | 1891|      0|#define utext_close U_ICU_ENTRY_POINT_RENAME(utext_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   63|      0|    return 0;
   64|      0|  }
   65|       |
   66|  88.8M|  for (int32_t p = bi->first(); p != icu::BreakIterator::DONE; p = bi->next()) {}
  ------------------
  |  Branch (66:33): [True: 88.8M, False: 7.39k]
  ------------------
   67|       |
   68|  7.39k|  utext_close(fuzzstr);
  ------------------
  |  | 1891|  7.39k|#define utext_close U_ICU_ENTRY_POINT_RENAME(utext_close)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|       |
   70|  7.39k|  std::string str(reinterpret_cast<const char*>(data), size);
   71|  7.39k|  icu::Locale locale2(str.c_str()); // ensure null-termination by c_str()
   72|  7.39k|  switch (rnd8 % 5) {
  ------------------
  |  Branch (72:11): [True: 0, False: 7.39k]
  ------------------
   73|  3.69k|    case 0:
  ------------------
  |  Branch (73:5): [True: 3.69k, False: 3.69k]
  ------------------
   74|  3.69k|      bi.reset(icu::BreakIterator::createWordInstance(locale2, status));
   75|  3.69k|      break;
   76|  1.89k|    case 1:
  ------------------
  |  Branch (76:5): [True: 1.89k, False: 5.49k]
  ------------------
   77|  1.89k|      bi.reset(icu::BreakIterator::createLineInstance(locale2, status));
   78|  1.89k|      break;
   79|    336|    case 2:
  ------------------
  |  Branch (79:5): [True: 336, False: 7.06k]
  ------------------
   80|    336|      bi.reset(icu::BreakIterator::createCharacterInstance(locale2, status));
   81|    336|      break;
   82|  1.00k|    case 3:
  ------------------
  |  Branch (82:5): [True: 1.00k, False: 6.39k]
  ------------------
   83|  1.00k|      bi.reset(icu::BreakIterator::createSentenceInstance(locale2, status));
   84|  1.00k|      break;
   85|    462|    case 4:
  ------------------
  |  Branch (85:5): [True: 462, False: 6.93k]
  ------------------
   86|    462|      bi.reset(icu::BreakIterator::createTitleInstance(locale2, status));
   87|    462|      break;
   88|  7.39k|  }
   89|       |
   90|  7.39k|  return 0;
   91|  7.39k|}

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

