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