|
|
1.1 root 1: /* Implement a vector type that indicates its used size and allocated size.
2: Copyright (C) 1992 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: /* As a special exception, if you link this library with files
21: compiled with GCC to produce an executable, this does not cause
22: the resulting executable to be covered by the GNU General Public License.
23: This exception does not however invalidate any other reasons why
24: the executable file might be covered by the GNU General Public License. */
25:
26:
27: #ifndef __record_INCLUDE_GNU
28: #define __record_INCLUDE_GNU
29:
30: #include "assert.h"
31:
32:
33: /* Structure to hold records. */
34: struct record
35: {
36: unsigned int capacity;
37: unsigned int used;
38: void **records;
39: };
40:
41:
42: extern void *__objc_xmalloc (unsigned int);
43: extern void *__objc_xcalloc (unsigned int, unsigned int);
44: extern void *__objc_xrealloc (void *, unsigned int);
45:
46: /* Allocate, initialize and return a new record structure. */
47:
48: static inline struct record *
49: record_new ()
50: {
51: struct record *record;
52:
53: record = (struct record *) __objc_xcalloc (1, sizeof (struct record));
54: record->capacity = 8;
55: record ->records
56: = (void **) __objc_xcalloc (record->capacity, sizeof (void *));
57:
58: return record;
59: }
60:
61:
62: /* Delete the record. */
63: static inline void
64: record_delete (struct record *record)
65: {
66: free (record->records);
67: free (record);
68: }
69:
70:
71: /* Return the number of entries in the record. */
72:
73: static inline unsigned int
74: record_entries (struct record *record)
75: {
76: return record->used;
77: }
78:
79:
80: /* Return the capacity of the record. */
81:
82: static inline unsigned int
83: record_capacity (struct record *record)
84: {
85: return record->capacity;
86: }
87:
88:
89: /* Store an entry at the specified record location. */
90:
91: static inline void
92: record_store_at (unsigned int i, void *value, struct record *record)
93: {
94: assert (i);
95: assert (i <= record_entries (record));
96:
97: record->records[i] = value;
98: }
99:
100:
101: /* Make a record entry. Expand the record's size if full. */
102:
103: static inline void
104: record_store (void *value, struct record *record)
105: {
106: ++record->used;
107: if (record_entries (record) == record_capacity (record))
108: {
109: record->capacity *= 2;
110: record->records
111: = (void **) __objc_xrealloc (record->records,
112: record_capacity (record) * sizeof (void *));
113: }
114: record_store_at (record_entries (record), value, record);
115: }
116:
117:
118: /* Get a value from the record. */
119:
120: static inline void *
121: record_get (unsigned int i, struct record *record)
122: {
123: assert (i);
124: assert (i <= record_entries (record));
125: return record->records[i];
126: }
127:
128: #endif /* not __record_INCLUDE_GNU */
129:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.