Coverage Report

Created: 2023-02-22 06:51

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