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*/ 15 16#ifndef NFRLIST_H 17#define NFRLIST_H 18 19#include "unicode/rbnf.h" 20 21#if U_HAVE_RBNF 22 23#include "unicode/uobject.h" 24#include "nfrule.h" 25 26#include "cmemory.h" 27 28U_NAMESPACE_BEGIN 29 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 32 33class NFRuleList : public UMemory { 34protected: 35 NFRule** fStuff; 36 uint32_t fCount; 37 uint32_t fCapacity; 38public: 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 } 98 99private: 100 NFRuleList(const NFRuleList &other); // forbid copying of this class 101 NFRuleList &operator=(const NFRuleList &other); // forbid copying of this class 102}; 103 104U_NAMESPACE_END 105 106/* U_HAVE_RBNF */ 107#endif 108 109// NFRLIST_H 110#endif 111