intl/icu/source/i18n/nfrlist.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /*
     2 ******************************************************************************
     3 *   Copyright (C) 1997-2012, International Business Machines
     4 *   Corporation and others.  All Rights Reserved.
     5 ******************************************************************************
     6 *   file name:  nfrlist.h
     7 *   encoding:   US-ASCII
     8 *   tab size:   8 (not used)
     9 *   indentation:4
    10 *
    11 * Modification history
    12 * Date        Name      Comments
    13 * 10/11/2001  Doug      Ported from ICU4J
    14 */
    16 #ifndef NFRLIST_H
    17 #define NFRLIST_H
    19 #include "unicode/rbnf.h"
    21 #if U_HAVE_RBNF
    23 #include "unicode/uobject.h"
    24 #include "nfrule.h"
    26 #include "cmemory.h"
    28 U_NAMESPACE_BEGIN
    30 // unsafe class for internal use only.  assume memory allocations succeed, indexes are valid.
    31 // should be a template, but we can't use them
    33 class NFRuleList : public UMemory {
    34 protected:
    35     NFRule** fStuff;
    36     uint32_t fCount;
    37     uint32_t fCapacity;
    38 public:
    39     NFRuleList(uint32_t capacity = 10) 
    40         : fStuff(capacity ? (NFRule**)uprv_malloc(capacity * sizeof(NFRule*)) : NULL)
    41         , fCount(0)
    42         , fCapacity(capacity) {}
    43     ~NFRuleList() {
    44         if (fStuff) {
    45             for(uint32_t i = 0; i < fCount; ++i) {
    46                 delete fStuff[i];
    47             }
    48             uprv_free(fStuff);
    49         }
    50     }
    51     NFRule* operator[](uint32_t index) const { return fStuff != NULL ? fStuff[index] : NULL; }
    52     NFRule* remove(uint32_t index) {
    53     	if (fStuff == NULL) {
    54     		return NULL;
    55     	}
    56         NFRule* result = fStuff[index];
    57         fCount -= 1;
    58         for (uint32_t i = index; i < fCount; ++i) { // assumes small arrays
    59             fStuff[i] = fStuff[i+1];
    60         }
    61         return result;
    62     }
    63     void add(NFRule* thing) {
    64         if (fCount == fCapacity) {
    65             fCapacity += 10;
    66             fStuff = (NFRule**)uprv_realloc(fStuff, fCapacity * sizeof(NFRule*)); // assume success
    67         }
    68         if (fStuff != NULL) {
    69         	fStuff[fCount++] = thing;
    70         } else {
    71         	fCapacity = 0;
    72         	fCount = 0;
    73         }
    74     }
    75     uint32_t size() const { return fCount; }
    76     NFRule* last() const { return (fCount > 0 && fStuff != NULL) ? fStuff[fCount-1] : NULL; }
    77     NFRule** release() {
    78         add(NULL); // ensure null termination
    79         NFRule** result = fStuff;
    80         fStuff = NULL;
    81         fCount = 0;
    82         fCapacity = 0;
    83         return result;
    84     }
    85     void deleteAll() {
    86         NFRule** tmp = NULL;
    87         int32_t size = fCount;
    88         if (size > 0) {
    89             tmp = release();
    90             for (int32_t i = 0; i < size; i++) {
    91                 delete tmp[i];
    92             }
    93             if (tmp) {
    94                 uprv_free(tmp);
    95             }
    96         }
    97     }
    99 private:
   100     NFRuleList(const NFRuleList &other); // forbid copying of this class
   101     NFRuleList &operator=(const NFRuleList &other); // forbid copying of this class
   102 };
   104 U_NAMESPACE_END
   106 /* U_HAVE_RBNF */
   107 #endif
   109 // NFRLIST_H
   110 #endif

mercurial