/* ****************************************************************************** * Copyright (C) 1997-2008, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrlist.h * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 * * Modification history * Date Name Comments * 10/11/2001 Doug Ported from ICU4J */ #ifndef NFRLIST_H #define NFRLIST_H #include "unicode/rbnf.h" #if U_HAVE_RBNF #include "unicode/uobject.h" #include "nfrule.h" #include "cmemory.h" U_NAMESPACE_BEGIN // unsafe class for internal use only. assume memory allocations succeed, indexes are valid. // should be a template, but we can't use them class NFRuleList : public UMemory { protected: NFRule** fStuff; uint32_t fCount; uint32_t fCapacity; public: NFRuleList(uint32_t capacity = 10) : fStuff(capacity ? (NFRule**)uprv_malloc(capacity * sizeof(NFRule*)) : NULL) , fCount(0) , fCapacity(capacity) {}; ~NFRuleList() { if (fStuff) { for(uint32_t i = 0; i < fCount; ++i) { delete fStuff[i]; } uprv_free(fStuff); } } NFRule* operator[](uint32_t index) const { return fStuff != NULL ? fStuff[index] : NULL; } NFRule* remove(uint32_t index) { if (fStuff == NULL) { return NULL; } NFRule* result = fStuff[index]; fCount -= 1; for (uint32_t i = index; i < fCount; ++i) { // assumes small arrays fStuff[i] = fStuff[i+1]; } return result; } void add(NFRule* thing) { if (fCount == fCapacity) { fCapacity += 10; fStuff = (NFRule**)uprv_realloc(fStuff, fCapacity * sizeof(NFRule*)); // assume success } if (fStuff != NULL) { fStuff[fCount++] = thing; } else { fCapacity = 0; fCount = 0; } } uint32_t size() const { return fCount; } NFRule* last() const { return (fCount > 0 && fStuff != NULL) ? fStuff[fCount-1] : NULL; } NFRule** release() { add(NULL); // ensure null termination NFRule** result = fStuff; fStuff = NULL; fCount = 0; fCapacity = 0; return result; } private: NFRuleList(const NFRuleList &other); // forbid copying of this class NFRuleList &operator=(const NFRuleList &other); // forbid copying of this class }; U_NAMESPACE_END /* U_HAVE_RBNF */ #endif // NFRLIST_H #endif