113 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| // © 2016 and later: Unicode, Inc. and others.
 | |
| // License & terms of use: http://www.unicode.org/copyright.html
 | |
| /*
 | |
| ******************************************************************************
 | |
| *   Copyright (C) 1997-2012, International Business Machines
 | |
| *   Corporation and others.  All Rights Reserved.
 | |
| ******************************************************************************
 | |
| *   file name:  nfrlist.h
 | |
| *   encoding:   UTF-8
 | |
| *   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;
 | |
|     }
 | |
|     void deleteAll() {
 | |
|         NFRule** tmp = NULL;
 | |
|         int32_t size = fCount;
 | |
|         if (size > 0) {
 | |
|             tmp = release();
 | |
|             for (int32_t i = 0; i < size; i++) {
 | |
|                 delete tmp[i];
 | |
|             }
 | |
|             if (tmp) {
 | |
|                 uprv_free(tmp);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 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
 |