LCOV - code coverage report
Current view: top level - intl/icu/source/common - uset.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 0 244 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 50 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // © 2016 and later: Unicode, Inc. and others.
       2             : // License & terms of use: http://www.unicode.org/copyright.html
       3             : /*
       4             : *******************************************************************************
       5             : *
       6             : *   Copyright (C) 2002-2011, International Business Machines
       7             : *   Corporation and others.  All Rights Reserved.
       8             : *
       9             : *******************************************************************************
      10             : *   file name:  uset.cpp
      11             : *   encoding:   UTF-8
      12             : *   tab size:   8 (not used)
      13             : *   indentation:4
      14             : *
      15             : *   created on: 2002mar07
      16             : *   created by: Markus W. Scherer
      17             : *
      18             : *   There are functions to efficiently serialize a USet into an array of uint16_t
      19             : *   and functions to use such a serialized form efficiently without
      20             : *   instantiating a new USet.
      21             : */
      22             : 
      23             : #include "unicode/utypes.h"
      24             : #include "unicode/uobject.h"
      25             : #include "unicode/uset.h"
      26             : #include "unicode/uniset.h"
      27             : #include "cmemory.h"
      28             : #include "unicode/ustring.h"
      29             : #include "unicode/parsepos.h"
      30             : 
      31             : U_NAMESPACE_USE
      32             : 
      33             : U_CAPI USet* U_EXPORT2
      34           0 : uset_openEmpty() {
      35           0 :     return (USet*) new UnicodeSet();
      36             : }
      37             : 
      38             : U_CAPI USet* U_EXPORT2
      39           0 : uset_open(UChar32 start, UChar32 end) {
      40           0 :     return (USet*) new UnicodeSet(start, end);
      41             : }
      42             : 
      43             : U_CAPI void U_EXPORT2
      44           0 : uset_close(USet* set) {
      45           0 :     delete (UnicodeSet*) set;
      46           0 : }
      47             : 
      48             : U_CAPI USet * U_EXPORT2
      49           0 : uset_clone(const USet *set) {
      50           0 :     return (USet*) (((UnicodeSet*) set)->UnicodeSet::clone());
      51             : }
      52             : 
      53             : U_CAPI UBool U_EXPORT2
      54           0 : uset_isFrozen(const USet *set) {
      55           0 :     return ((UnicodeSet*) set)->UnicodeSet::isFrozen();
      56             : }
      57             : 
      58             : U_CAPI void U_EXPORT2
      59           0 : uset_freeze(USet *set) {
      60           0 :     ((UnicodeSet*) set)->UnicodeSet::freeze();
      61           0 : }
      62             : 
      63             : U_CAPI USet * U_EXPORT2
      64           0 : uset_cloneAsThawed(const USet *set) {
      65           0 :     return (USet*) (((UnicodeSet*) set)->UnicodeSet::cloneAsThawed());
      66             : }
      67             : 
      68             : U_CAPI void U_EXPORT2
      69           0 : uset_set(USet* set,
      70             :      UChar32 start, UChar32 end) {
      71           0 :     ((UnicodeSet*) set)->UnicodeSet::set(start, end);
      72           0 : }
      73             : 
      74             : U_CAPI void U_EXPORT2
      75           0 : uset_addAll(USet* set, const USet *additionalSet) {
      76           0 :     ((UnicodeSet*) set)->UnicodeSet::addAll(*((const UnicodeSet*)additionalSet));
      77           0 : }
      78             : 
      79             : U_CAPI void U_EXPORT2
      80           0 : uset_add(USet* set, UChar32 c) {
      81           0 :     ((UnicodeSet*) set)->UnicodeSet::add(c);
      82           0 : }
      83             : 
      84             : U_CAPI void U_EXPORT2
      85           0 : uset_addRange(USet* set, UChar32 start, UChar32 end) {
      86           0 :     ((UnicodeSet*) set)->UnicodeSet::add(start, end);    
      87           0 : }
      88             : 
      89             : U_CAPI void U_EXPORT2
      90           0 : uset_addString(USet* set, const UChar* str, int32_t strLen) {
      91             :     // UnicodeString handles -1 for strLen
      92           0 :     UnicodeString s(strLen<0, str, strLen);
      93           0 :     ((UnicodeSet*) set)->UnicodeSet::add(s);
      94           0 : }
      95             : 
      96             : U_CAPI void U_EXPORT2
      97           0 : uset_addAllCodePoints(USet* set, const UChar *str, int32_t strLen) {
      98             :     // UnicodeString handles -1 for strLen
      99           0 :     UnicodeString s(str, strLen);
     100           0 :     ((UnicodeSet*) set)->UnicodeSet::addAll(s);
     101           0 : }
     102             : 
     103             : U_CAPI void U_EXPORT2
     104           0 : uset_remove(USet* set, UChar32 c) {
     105           0 :     ((UnicodeSet*) set)->UnicodeSet::remove(c);
     106           0 : }
     107             : 
     108             : U_CAPI void U_EXPORT2
     109           0 : uset_removeRange(USet* set, UChar32 start, UChar32 end) {
     110           0 :     ((UnicodeSet*) set)->UnicodeSet::remove(start, end);
     111           0 : }
     112             : 
     113             : U_CAPI void U_EXPORT2
     114           0 : uset_removeString(USet* set, const UChar* str, int32_t strLen) {
     115           0 :     UnicodeString s(strLen==-1, str, strLen);
     116           0 :     ((UnicodeSet*) set)->UnicodeSet::remove(s);
     117           0 : }
     118             : 
     119             : U_CAPI void U_EXPORT2
     120           0 : uset_removeAll(USet* set, const USet* remove) {
     121           0 :     ((UnicodeSet*) set)->UnicodeSet::removeAll(*(const UnicodeSet*)remove);
     122           0 : }
     123             : 
     124             : U_CAPI void U_EXPORT2
     125           0 : uset_retain(USet* set, UChar32 start, UChar32 end) {
     126           0 :     ((UnicodeSet*) set)->UnicodeSet::retain(start, end);
     127           0 : }
     128             : 
     129             : U_CAPI void U_EXPORT2
     130           0 : uset_retainAll(USet* set, const USet* retain) {
     131           0 :     ((UnicodeSet*) set)->UnicodeSet::retainAll(*(const UnicodeSet*)retain);
     132           0 : }
     133             : 
     134             : U_CAPI void U_EXPORT2
     135           0 : uset_compact(USet* set) {
     136           0 :     ((UnicodeSet*) set)->UnicodeSet::compact();
     137           0 : }
     138             : 
     139             : U_CAPI void U_EXPORT2
     140           0 : uset_complement(USet* set) {
     141           0 :     ((UnicodeSet*) set)->UnicodeSet::complement();
     142           0 : }
     143             : 
     144             : U_CAPI void U_EXPORT2
     145           0 : uset_complementAll(USet* set, const USet* complement) {
     146           0 :     ((UnicodeSet*) set)->UnicodeSet::complementAll(*(const UnicodeSet*)complement);
     147           0 : }
     148             : 
     149             : U_CAPI void U_EXPORT2
     150           0 : uset_clear(USet* set) {
     151           0 :     ((UnicodeSet*) set)->UnicodeSet::clear();
     152           0 : }
     153             : 
     154             : U_CAPI void U_EXPORT2
     155           0 : uset_removeAllStrings(USet* set) {
     156           0 :     ((UnicodeSet*) set)->UnicodeSet::removeAllStrings();
     157           0 : }
     158             : 
     159             : U_CAPI UBool U_EXPORT2
     160           0 : uset_isEmpty(const USet* set) {
     161           0 :     return ((const UnicodeSet*) set)->UnicodeSet::isEmpty();
     162             : }
     163             : 
     164             : U_CAPI UBool U_EXPORT2
     165           0 : uset_contains(const USet* set, UChar32 c) {
     166           0 :     return ((const UnicodeSet*) set)->UnicodeSet::contains(c);
     167             : }
     168             : 
     169             : U_CAPI UBool U_EXPORT2
     170           0 : uset_containsRange(const USet* set, UChar32 start, UChar32 end) {
     171           0 :     return ((const UnicodeSet*) set)->UnicodeSet::contains(start, end);
     172             : }
     173             : 
     174             : U_CAPI UBool U_EXPORT2
     175           0 : uset_containsString(const USet* set, const UChar* str, int32_t strLen) {
     176           0 :     UnicodeString s(strLen==-1, str, strLen);
     177           0 :     return ((const UnicodeSet*) set)->UnicodeSet::contains(s);
     178             : }
     179             : 
     180             : U_CAPI UBool U_EXPORT2
     181           0 : uset_containsAll(const USet* set1, const USet* set2) {
     182           0 :     return ((const UnicodeSet*) set1)->UnicodeSet::containsAll(* (const UnicodeSet*) set2);
     183             : }
     184             : 
     185             : U_CAPI UBool U_EXPORT2
     186           0 : uset_containsAllCodePoints(const USet* set, const UChar *str, int32_t strLen) {
     187             :     // Create a string alias, since nothing is being added to the set.
     188           0 :     UnicodeString s(strLen==-1, str, strLen);
     189           0 :     return ((const UnicodeSet*) set)->UnicodeSet::containsAll(s);
     190             : }
     191             : 
     192             : U_CAPI UBool U_EXPORT2
     193           0 : uset_containsNone(const USet* set1, const USet* set2) {
     194           0 :     return ((const UnicodeSet*) set1)->UnicodeSet::containsNone(* (const UnicodeSet*) set2);
     195             : }
     196             : 
     197             : U_CAPI UBool U_EXPORT2
     198           0 : uset_containsSome(const USet* set1, const USet* set2) {
     199           0 :     return ((const UnicodeSet*) set1)->UnicodeSet::containsSome(* (const UnicodeSet*) set2);
     200             : }
     201             : 
     202             : U_CAPI int32_t U_EXPORT2
     203           0 : uset_span(const USet *set, const UChar *s, int32_t length, USetSpanCondition spanCondition) {
     204           0 :     return ((UnicodeSet*) set)->UnicodeSet::span(s, length, spanCondition);
     205             : }
     206             : 
     207             : U_CAPI int32_t U_EXPORT2
     208           0 : uset_spanBack(const USet *set, const UChar *s, int32_t length, USetSpanCondition spanCondition) {
     209           0 :     return ((UnicodeSet*) set)->UnicodeSet::spanBack(s, length, spanCondition);
     210             : }
     211             : 
     212             : U_CAPI int32_t U_EXPORT2
     213           0 : uset_spanUTF8(const USet *set, const char *s, int32_t length, USetSpanCondition spanCondition) {
     214           0 :     return ((UnicodeSet*) set)->UnicodeSet::spanUTF8(s, length, spanCondition);
     215             : }
     216             : 
     217             : U_CAPI int32_t U_EXPORT2
     218           0 : uset_spanBackUTF8(const USet *set, const char *s, int32_t length, USetSpanCondition spanCondition) {
     219           0 :     return ((UnicodeSet*) set)->UnicodeSet::spanBackUTF8(s, length, spanCondition);
     220             : }
     221             : 
     222             : U_CAPI UBool U_EXPORT2
     223           0 : uset_equals(const USet* set1, const USet* set2) {
     224           0 :     return *(const UnicodeSet*)set1 == *(const UnicodeSet*)set2;
     225             : }
     226             : 
     227             : U_CAPI int32_t U_EXPORT2
     228           0 : uset_indexOf(const USet* set, UChar32 c) {
     229           0 :     return ((UnicodeSet*) set)->UnicodeSet::indexOf(c);
     230             : }
     231             : 
     232             : U_CAPI UChar32 U_EXPORT2
     233           0 : uset_charAt(const USet* set, int32_t index) {
     234           0 :     return ((UnicodeSet*) set)->UnicodeSet::charAt(index);
     235             : }
     236             : 
     237             : U_CAPI int32_t U_EXPORT2
     238           0 : uset_size(const USet* set) {
     239           0 :     return ((const UnicodeSet*) set)->UnicodeSet::size();
     240             : }
     241             : 
     242             : U_NAMESPACE_BEGIN
     243             : /**
     244             :  * This class only exists to provide access to the UnicodeSet private
     245             :  * USet support API.  Declaring a class a friend is more portable than
     246             :  * trying to declare extern "C" functions as friends.
     247             :  */
     248             : class USetAccess /* not : public UObject because all methods are static */ {
     249             : public:
     250             :     /* Try to have the compiler inline these*/
     251           0 :     inline static int32_t getStringCount(const UnicodeSet& set) {
     252           0 :         return set.getStringCount();
     253             :     }
     254           0 :     inline static const UnicodeString* getString(const UnicodeSet& set,
     255             :                                                  int32_t i) {
     256           0 :         return set.getString(i);
     257             :     }
     258             : private:
     259             :     /* do not instantiate*/
     260             :     USetAccess();
     261             : };
     262             : U_NAMESPACE_END
     263             : 
     264             : U_CAPI int32_t U_EXPORT2
     265           0 : uset_getItemCount(const USet* uset) {
     266           0 :     const UnicodeSet& set = *(const UnicodeSet*)uset;
     267           0 :     return set.getRangeCount() + USetAccess::getStringCount(set);
     268             : }
     269             : 
     270             : U_CAPI int32_t U_EXPORT2
     271           0 : uset_getItem(const USet* uset, int32_t itemIndex,
     272             :              UChar32* start, UChar32* end,
     273             :              UChar* str, int32_t strCapacity,
     274             :              UErrorCode* ec) {
     275           0 :     if (U_FAILURE(*ec)) return 0;
     276           0 :     const UnicodeSet& set = *(const UnicodeSet*)uset;
     277             :     int32_t rangeCount;
     278             : 
     279           0 :     if (itemIndex < 0) {
     280           0 :         *ec = U_ILLEGAL_ARGUMENT_ERROR;
     281           0 :         return -1;
     282           0 :     } else if (itemIndex < (rangeCount = set.getRangeCount())) {
     283           0 :         *start = set.getRangeStart(itemIndex);
     284           0 :         *end = set.getRangeEnd(itemIndex);
     285           0 :         return 0;
     286             :     } else {
     287           0 :         itemIndex -= rangeCount;
     288           0 :         if (itemIndex < USetAccess::getStringCount(set)) {
     289           0 :             const UnicodeString* s = USetAccess::getString(set, itemIndex);
     290           0 :             return s->extract(str, strCapacity, *ec);
     291             :         } else {
     292           0 :             *ec = U_INDEX_OUTOFBOUNDS_ERROR;
     293           0 :             return -1;
     294             :         }
     295             :     }
     296             : }
     297             : 
     298             : //U_CAPI int32_t U_EXPORT2
     299             : //uset_getRangeCount(const USet* set) {
     300             : //    return ((const UnicodeSet*) set)->getRangeCount();
     301             : //}
     302             : //
     303             : //U_CAPI UBool U_EXPORT2
     304             : //uset_getRange(const USet* set, int32_t rangeIndex,
     305             : //              UChar32* pStart, UChar32* pEnd) {
     306             : //    if ((uint32_t) rangeIndex >= (uint32_t) uset_getRangeCount(set)) {
     307             : //        return FALSE;
     308             : //    }
     309             : //    const UnicodeSet* us = (const UnicodeSet*) set;
     310             : //    *pStart = us->getRangeStart(rangeIndex);
     311             : //    *pEnd = us->getRangeEnd(rangeIndex);
     312             : //    return TRUE;
     313             : //}
     314             : 
     315             : /*
     316             :  * Serialize a USet into 16-bit units.
     317             :  * Store BMP code points as themselves with one 16-bit unit each.
     318             :  *
     319             :  * Important: the code points in the array are in ascending order,
     320             :  * therefore all BMP code points precede all supplementary code points.
     321             :  *
     322             :  * Store each supplementary code point in 2 16-bit units,
     323             :  * simply with higher-then-lower 16-bit halfs.
     324             :  *
     325             :  * Precede the entire list with the length.
     326             :  * If there are supplementary code points, then set bit 15 in the length
     327             :  * and add the bmpLength between it and the array.
     328             :  *
     329             :  * In other words:
     330             :  * - all BMP:            (length=bmpLength) BMP, .., BMP
     331             :  * - some supplementary: (length|0x8000) (bmpLength<length) BMP, .., BMP, supp-high, supp-low, ..
     332             :  */
     333             : U_CAPI int32_t U_EXPORT2
     334           0 : uset_serialize(const USet* set, uint16_t* dest, int32_t destCapacity, UErrorCode* ec) {
     335           0 :     if (ec==NULL || U_FAILURE(*ec)) {
     336           0 :         return 0;
     337             :     }
     338             : 
     339           0 :     return ((const UnicodeSet*) set)->UnicodeSet::serialize(dest, destCapacity,* ec);
     340             : }
     341             : 
     342             : U_CAPI UBool U_EXPORT2
     343           0 : uset_getSerializedSet(USerializedSet* fillSet, const uint16_t* src, int32_t srcLength) {
     344             :     int32_t length;
     345             : 
     346           0 :     if(fillSet==NULL) {
     347           0 :         return FALSE;
     348             :     }
     349           0 :     if(src==NULL || srcLength<=0) {
     350           0 :         fillSet->length=fillSet->bmpLength=0;
     351           0 :         return FALSE;
     352             :     }
     353             : 
     354           0 :     length=*src++;
     355           0 :     if(length&0x8000) {
     356             :         /* there are supplementary values */
     357           0 :         length&=0x7fff;
     358           0 :         if(srcLength<(2+length)) {
     359           0 :             fillSet->length=fillSet->bmpLength=0;
     360           0 :             return FALSE;
     361             :         }
     362           0 :         fillSet->bmpLength=*src++;
     363             :     } else {
     364             :         /* only BMP values */
     365           0 :         if(srcLength<(1+length)) {
     366           0 :             fillSet->length=fillSet->bmpLength=0;
     367           0 :             return FALSE;
     368             :         }
     369           0 :         fillSet->bmpLength=length;
     370             :     }
     371           0 :     fillSet->array=src;
     372           0 :     fillSet->length=length;
     373           0 :     return TRUE;
     374             : }
     375             : 
     376             : U_CAPI void U_EXPORT2
     377           0 : uset_setSerializedToOne(USerializedSet* fillSet, UChar32 c) {
     378           0 :     if(fillSet==NULL || (uint32_t)c>0x10ffff) {
     379           0 :         return;
     380             :     }
     381             : 
     382           0 :     fillSet->array=fillSet->staticArray;
     383           0 :     if(c<0xffff) {
     384           0 :         fillSet->bmpLength=fillSet->length=2;
     385           0 :         fillSet->staticArray[0]=(uint16_t)c;
     386           0 :         fillSet->staticArray[1]=(uint16_t)c+1;
     387           0 :     } else if(c==0xffff) {
     388           0 :         fillSet->bmpLength=1;
     389           0 :         fillSet->length=3;
     390           0 :         fillSet->staticArray[0]=0xffff;
     391           0 :         fillSet->staticArray[1]=1;
     392           0 :         fillSet->staticArray[2]=0;
     393           0 :     } else if(c<0x10ffff) {
     394           0 :         fillSet->bmpLength=0;
     395           0 :         fillSet->length=4;
     396           0 :         fillSet->staticArray[0]=(uint16_t)(c>>16);
     397           0 :         fillSet->staticArray[1]=(uint16_t)c;
     398           0 :         ++c;
     399           0 :         fillSet->staticArray[2]=(uint16_t)(c>>16);
     400           0 :         fillSet->staticArray[3]=(uint16_t)c;
     401             :     } else /* c==0x10ffff */ {
     402           0 :         fillSet->bmpLength=0;
     403           0 :         fillSet->length=2;
     404           0 :         fillSet->staticArray[0]=0x10;
     405           0 :         fillSet->staticArray[1]=0xffff;
     406             :     }
     407             : }
     408             : 
     409             : U_CAPI UBool U_EXPORT2
     410           0 : uset_serializedContains(const USerializedSet* set, UChar32 c) {
     411             :     const uint16_t* array;
     412             : 
     413           0 :     if(set==NULL || (uint32_t)c>0x10ffff) {
     414           0 :         return FALSE;
     415             :     }
     416             : 
     417           0 :     array=set->array;
     418           0 :     if(c<=0xffff) {
     419             :         /* find c in the BMP part */
     420           0 :         int32_t lo = 0;
     421           0 :         int32_t hi = set->bmpLength-1;
     422           0 :         if (c < array[0]) {
     423           0 :             hi = 0;
     424           0 :         } else if (c < array[hi]) {
     425             :             for(;;) {
     426           0 :                 int32_t i = (lo + hi) >> 1;
     427           0 :                 if (i == lo) {
     428           0 :                     break;  // Done!
     429           0 :                 } else if (c < array[i]) {
     430           0 :                     hi = i;
     431             :                 } else {
     432           0 :                     lo = i;
     433             :                 }
     434           0 :             }
     435             :         } else {
     436           0 :             hi += 1;
     437             :         }
     438           0 :         return (UBool)(hi&1);
     439             :     } else {
     440             :         /* find c in the supplementary part */
     441           0 :         uint16_t high=(uint16_t)(c>>16), low=(uint16_t)c;
     442           0 :         int32_t base = set->bmpLength;
     443           0 :         int32_t lo = 0;
     444           0 :         int32_t hi = set->length - 2 - base;
     445           0 :         if (high < array[base] || (high==array[base] && low<array[base+1])) {
     446           0 :             hi = 0;
     447           0 :         } else if (high < array[base+hi] || (high==array[base+hi] && low<array[base+hi+1])) {
     448             :             for (;;) {
     449           0 :                 int32_t i = ((lo + hi) >> 1) & ~1;  // Guarantee even result
     450           0 :                 int32_t iabs = i + base;
     451           0 :                 if (i == lo) {
     452           0 :                     break;  // Done!
     453           0 :                 } else if (high < array[iabs] || (high==array[iabs] && low<array[iabs+1])) {
     454           0 :                     hi = i;
     455             :                 } else {
     456           0 :                     lo = i;
     457             :                 }
     458           0 :             }
     459             :         } else {
     460           0 :             hi += 2;
     461             :         }
     462             :         /* count pairs of 16-bit units even per BMP and check if the number of pairs is odd */
     463           0 :         return (UBool)(((hi+(base<<1))&2)!=0);
     464             :     }
     465             : }
     466             : 
     467             : U_CAPI int32_t U_EXPORT2
     468           0 : uset_getSerializedRangeCount(const USerializedSet* set) {
     469           0 :     if(set==NULL) {
     470           0 :         return 0;
     471             :     }
     472             : 
     473           0 :     return (set->bmpLength+(set->length-set->bmpLength)/2+1)/2;
     474             : }
     475             : 
     476             : U_CAPI UBool U_EXPORT2
     477           0 : uset_getSerializedRange(const USerializedSet* set, int32_t rangeIndex,
     478             :                         UChar32* pStart, UChar32* pEnd) {
     479             :     const uint16_t* array;
     480             :     int32_t bmpLength, length;
     481             : 
     482           0 :     if(set==NULL || rangeIndex<0 || pStart==NULL || pEnd==NULL) {
     483           0 :         return FALSE;
     484             :     }
     485             : 
     486           0 :     array=set->array;
     487           0 :     length=set->length;
     488           0 :     bmpLength=set->bmpLength;
     489             : 
     490           0 :     rangeIndex*=2; /* address start/limit pairs */
     491           0 :     if(rangeIndex<bmpLength) {
     492           0 :         *pStart=array[rangeIndex++];
     493           0 :         if(rangeIndex<bmpLength) {
     494           0 :             *pEnd=array[rangeIndex]-1;
     495           0 :         } else if(rangeIndex<length) {
     496           0 :             *pEnd=((((int32_t)array[rangeIndex])<<16)|array[rangeIndex+1])-1;
     497             :         } else {
     498           0 :             *pEnd=0x10ffff;
     499             :         }
     500           0 :         return TRUE;
     501             :     } else {
     502           0 :         rangeIndex-=bmpLength;
     503           0 :         rangeIndex*=2; /* address pairs of pairs of units */
     504           0 :         length-=bmpLength;
     505           0 :         if(rangeIndex<length) {
     506           0 :             array+=bmpLength;
     507           0 :             *pStart=(((int32_t)array[rangeIndex])<<16)|array[rangeIndex+1];
     508           0 :             rangeIndex+=2;
     509           0 :             if(rangeIndex<length) {
     510           0 :                 *pEnd=((((int32_t)array[rangeIndex])<<16)|array[rangeIndex+1])-1;
     511             :             } else {
     512           0 :                 *pEnd=0x10ffff;
     513             :             }
     514           0 :             return TRUE;
     515             :         } else {
     516           0 :             return FALSE;
     517             :         }
     518             :     }
     519             : }
     520             : 
     521             : // TODO The old, internal uset.c had an efficient uset_containsOne function.
     522             : // Returned the one and only code point, or else -1 or something.
     523             : // Consider adding such a function to both C and C++ UnicodeSet/uset.
     524             : // See tools/gennorm/store.c for usage, now usetContainsOne there.
     525             : 
     526             : // TODO Investigate incorporating this code into UnicodeSet to improve
     527             : // efficiency.
     528             : // ---
     529             : // #define USET_GROW_DELTA 20
     530             : // 
     531             : // static int32_t
     532             : // findChar(const UChar32* array, int32_t length, UChar32 c) {
     533             : //     int32_t i;
     534             : // 
     535             : //     /* check the last range limit first for more efficient appending */
     536             : //     if(length>0) {
     537             : //         if(c>=array[length-1]) {
     538             : //             return length;
     539             : //         }
     540             : // 
     541             : //         /* do not check the last range limit again in the loop below */
     542             : //         --length;
     543             : //     }
     544             : // 
     545             : //     for(i=0; i<length && c>=array[i]; ++i) {}
     546             : //     return i;
     547             : // }
     548             : // 
     549             : // static UBool
     550             : // addRemove(USet* set, UChar32 c, int32_t doRemove) {
     551             : //     int32_t i, length, more;
     552             : // 
     553             : //     if(set==NULL || (uint32_t)c>0x10ffff) {
     554             : //         return FALSE;
     555             : //     }
     556             : // 
     557             : //     length=set->length;
     558             : //     i=findChar(set->array, length, c);
     559             : //     if((i&1)^doRemove) {
     560             : //         /* c is already in the set */
     561             : //         return TRUE;
     562             : //     }
     563             : // 
     564             : //     /* how many more array items do we need? */
     565             : //     if(i<length && (c+1)==set->array[i]) {
     566             : //         /* c is just before the following range, extend that in-place by one */
     567             : //         set->array[i]=c;
     568             : //         if(i>0) {
     569             : //             --i;
     570             : //             if(c==set->array[i]) {
     571             : //                 /* the previous range collapsed, remove it */
     572             : //                 set->length=length-=2;
     573             : //                 if(i<length) {
     574             : //                     uprv_memmove(set->array+i, set->array+i+2, (length-i)*4);
     575             : //                 }
     576             : //             }
     577             : //         }
     578             : //         return TRUE;
     579             : //     } else if(i>0 && c==set->array[i-1]) {
     580             : //         /* c is just after the previous range, extend that in-place by one */
     581             : //         if(++c<=0x10ffff) {
     582             : //             set->array[i-1]=c;
     583             : //             if(i<length && c==set->array[i]) {
     584             : //                 /* the following range collapsed, remove it */
     585             : //                 --i;
     586             : //                 set->length=length-=2;
     587             : //                 if(i<length) {
     588             : //                     uprv_memmove(set->array+i, set->array+i+2, (length-i)*4);
     589             : //                 }
     590             : //             }
     591             : //         } else {
     592             : //             /* extend the previous range (had limit 0x10ffff) to the end of Unicode */
     593             : //             set->length=i-1;
     594             : //         }
     595             : //         return TRUE;
     596             : //     } else if(i==length && c==0x10ffff) {
     597             : //         /* insert one range limit c */
     598             : //         more=1;
     599             : //     } else {
     600             : //         /* insert two range limits c, c+1 */
     601             : //         more=2;
     602             : //     }
     603             : // 
     604             : //     /* insert <more> range limits */
     605             : //     if(length+more>set->capacity) {
     606             : //         /* reallocate */
     607             : //         int32_t newCapacity=set->capacity+set->capacity/2+USET_GROW_DELTA;
     608             : //         UChar32* newArray=(UChar32* )uprv_malloc(newCapacity*4);
     609             : //         if(newArray==NULL) {
     610             : //             return FALSE;
     611             : //         }
     612             : //         set->capacity=newCapacity;
     613             : //         uprv_memcpy(newArray, set->array, length*4);
     614             : // 
     615             : //         if(set->array!=set->staticBuffer) {
     616             : //             uprv_free(set->array);
     617             : //         }
     618             : //         set->array=newArray;
     619             : //     }
     620             : // 
     621             : //     if(i<length) {
     622             : //         uprv_memmove(set->array+i+more, set->array+i, (length-i)*4);
     623             : //     }
     624             : //     set->array[i]=c;
     625             : //     if(more==2) {
     626             : //         set->array[i+1]=c+1;
     627             : //     }
     628             : //     set->length+=more;
     629             : // 
     630             : //     return TRUE;
     631             : // }
     632             : // 
     633             : // U_CAPI UBool U_EXPORT2
     634             : // uset_add(USet* set, UChar32 c) {
     635             : //     return addRemove(set, c, 0);
     636             : // }
     637             : // 
     638             : // U_CAPI void U_EXPORT2
     639             : // uset_remove(USet* set, UChar32 c) {
     640             : //     addRemove(set, c, 1);
     641             : // }

Generated by: LCOV version 1.13