Annotation of fam/fam/StringTable.h, Revision 1.1.1.1
1.1 trev 1: // Copyright (C) 1999 Silicon Graphics, Inc. All Rights Reserved.
2: //
3: // This program is free software; you can redistribute it and/or modify it
4: // under the terms of version 2 of the GNU General Public License as
5: // published by the Free Software Foundation.
6: //
7: // This program is distributed in the hope that it would be useful, but
8: // WITHOUT ANY WARRANTY; without even the implied warranty of
9: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Further, any
10: // license provided herein, whether implied or otherwise, is limited to
11: // this program in accordance with the express provisions of the GNU
12: // General Public License. Patent licenses, if any, provided herein do not
13: // apply to combinations of this program with other product or programs, or
14: // any other product whatsoever. This program is distributed without any
15: // warranty that the program is delivered free of the rightful claim of any
16: // third person by way of infringement or the like. See the GNU General
17: // Public License for more details.
18: //
19: // You should have received a copy of the GNU General Public License along
20: // with this program; if not, write the Free Software Foundation, Inc., 59
21: // Temple Place - Suite 330, Boston MA 02111-1307, USA.
22:
23: #ifndef StringTable_included
24: #define StringTable_included
25:
26: #include <assert.h>
27: #include <string.h>
28:
29: // A StringTable maps C strings onto values. It is a cheap O(n)
30: // implementation, suitable only for small tables that are
31: // infrequently searched.
32: // class Tv must be able to be assigned a value of 0 and be compared
33: // with 0.
34:
35: template <class Tv> class StringTable {
36:
37: typedef const char *Tk;
38:
39: public:
40:
41: StringTable() : n(0), nalloc(0), table(0)
42: { }
43: virtual ~StringTable();
44:
45: // Makes a copy of the Table. Copys the keys, but not the values.
46: StringTable& operator = (const StringTable&);
47:
48: inline Tv find(const Tk) const;
49: unsigned size() const { return n; }
50: Tk key(unsigned i) const { return i < n ? table[i].key : 0; }
51: Tv value(unsigned i) const { return i < n ? table[i].value : 0; }
52:
53: void insert(const Tk, const Tv&);
54: void remove(const Tk);
55:
56: private:
57:
58: struct Pair {
59: char *key;
60: Tv value;
61: };
62:
63: unsigned n, nalloc;
64: Pair *table;
65:
66: virtual signed int position(const Tk) const;
67:
68: StringTable(const StringTable&); // Do not copy.
69:
70: };
71:
72:
73: //
74: // Template method implementations
75: //
76:
77: template <class Tv>
78: inline Tv
79: StringTable<Tv>::find(const Tk k) const
80: {
81: signed int index = position(k);
82: return index >= 0 ? table[index].value : 0;
83: }
84:
85: template <class Tv>
86: StringTable<Tv>::~StringTable()
87: {
88: {
89: for (unsigned i = 0; i < n; i++)
90: delete [] table[i].key;
91: }
92: delete[] table;
93:
94: table = NULL;
95: nalloc = n = 0;
96: }
97:
98: template <class Tv>
99: StringTable<Tv>&
100: StringTable<Tv>::operator = (const StringTable& that)
101: {
102: if (this != &that)
103: {
104: unsigned i;
105: for (i = 0; i < n; i++)
106: delete [] table[i].key;
107: delete[] table;
108: nalloc = n = that.n;
109: table = new Pair[nalloc];
110: for (i = 0; i < n; i++)
111: { const char *key = that.table[i].key;
112: table[i].key = strcpy(new char[strlen(key) + 1], key);
113: table[i].value = that.table[i].value;
114: }
115: }
116: return *this;
117: }
118:
119: template <class Tv>
120: signed int
121: StringTable<Tv>::position(const Tk key) const
122: {
123: for (unsigned i = 0; i < n; i++)
124: if (!strcmp(key, table[i].key))
125: return i;
126: return -1; // Not found.
127: }
128:
129: template <class Tv>
130: void
131: StringTable<Tv>::insert(const Tk key, const Tv& value)
132: {
133: signed int index = position(key);
134: if (index >= 0)
135: { table[index].value = value;
136: return;
137: }
138:
139: if (n >= nalloc)
140: {
141: // Grow the table.
142:
143: nalloc = 3 * n / 2 + 10;
144: Pair *nt = new Pair[nalloc];
145: for (unsigned i = 0; i < n; i++)
146: nt[i] = table[i];
147: delete [] table;
148: table = nt;
149: assert(n < nalloc);
150: }
151: table[n].key = strcpy(new char[strlen(key) + 1], key);
152: table[n].value = value;
153: n++;
154: }
155:
156: template <class Tv>
157: void
158: StringTable<Tv>::remove(const Tk key)
159: {
160: signed int index = position(key);
161: assert(index >= 0 && index < n);
162:
163: // Delete the matching key.
164:
165: delete [] table[index].key;
166: table[index] = table[--n];
167:
168: // Shrink the table.
169:
170: if (2 * n < nalloc && n < nalloc - 10)
171: {
172: nalloc = n;
173: Pair *nt = new Pair[nalloc];
174: for (unsigned i = 0; i < n; i++)
175: nt[i] = table[i];
176: delete [] table;
177: table = nt;
178: }
179: }
180:
181: #endif /* !StringTable_included */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>