1 /* Internal definitions of CONCORD Object System
3 Copyright (C) 2013 MORIOKA Tomohiko
4 This file is part of the CONCORD Library.
6 The CONCORD Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The CONCORD Library 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 GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the CONCORD Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
36 #ifndef SIZEOF_COS_INT
37 # define SIZEOF_COS_INT SIZEOF_VOID_P
41 # define SIZEOF_INT (sizeof (int))
45 # define SIZEOF_LONG (sizeof (long))
48 #ifndef SIZEOF_LONG_LONG
49 # define SIZEOF_LONG_LONG (sizeof (long long))
53 # if SIZEOF_COS_INT == SIZEOF_LONG
55 # elif SIZEOF_COS_INT == SIZEOF_INT
57 # elif SIZEOF_COS_INT == SIZEOF_LONG_LONG
58 # define COS_INT long long
60 # error Unable to determine suitable type for COS_INT
65 # define COS_UINT unsigned COS_INT
68 #define BITS_PER_COS_INT (SIZEOF_COS_INT * BITS_PER_CHAR)
78 #define COS_POINTER_TYPE_P(type) ((type) == COS_Type_Entity)
80 #define COS_TYPE_BITS 2
81 #define COS_INT_TYPE_BITS 1
83 #define COS_INT_VAL_BITS (BITS_PER_COS_INT - COS_INT_TYPE_BITS)
84 #define COS_VAL_BITS (BITS_PER_COS_INT - COS_TYPE_BITS)
85 #define COS_INT_MAX ((COS_INT) ((1UL << (COS_INT_VAL_BITS - 1)) -1UL))
86 #define COS_INT_MIN (-(COS_INT_MAX) - 1)
89 typedef struct COS_Object_Header
93 COS_INT reference_count;
96 #define COS_OBJECT_PREFIX_OBJECT 0
98 enum COS_Object_Type {
100 COS_Object_Type_C_String,
102 COS_Object_Type_char,
103 COS_Object_Type_String,
104 COS_Object_Type_Symbol,
105 COS_Object_Type_Cons,
106 COS_Object_Type_Container,
107 COS_Object_Type_Sexp,
108 COS_Object_Type_Binary,
110 COS_Object_Type_Genre,
111 COS_Object_Type_Feature,
112 COS_Object_Type_Feature_INDEX,
113 COS_Object_Type_DB_Object
116 #define COS_FAT_OBJECT_TYPE_MIN COS_Object_Type_String
117 #define COS_OBJECT_TYPE_MAX COS_Object_Type_DB_Object
119 extern int (*COS_Object_retain_function_table[]) (COS_Object);
120 extern int (*COS_Object_release_function_table[]) (COS_Object);
122 struct COS_Object_ent
124 COS_Object_Header header;
127 COS_Object cos_allocate_object_0 (enum COS_Object_Type type,
130 #define COS_ALLOCATE_OBJECT(type) \
131 ((COS_##type)cos_allocate_object_0(COS_Object_Type_##type, \
132 sizeof(COS_##type##_ent)))
134 #define COS_OBJECT_INT_P(obj) \
135 ((COS_UINT)(obj) & 1)
137 #define COS_OBJECT_CHAR_P(obj) \
138 ((COS_UINT)(obj) & 2)
140 #define COS_OBJECT_C_STRING_P(obj) \
142 && (((unsigned char *)obj)[0] != COS_OBJECT_PREFIX_OBJECT))
144 #define COS_OBJECT_P(obj) \
146 && (!COS_OBJECT_INT_P (obj)) \
147 && (!COS_OBJECT_CHAR_P (obj)) \
148 && (((unsigned char *)obj)[0] == COS_OBJECT_PREFIX_OBJECT))
150 #define COS_OBJECT_TYPE_P(obj, TYPE) \
151 (COS_OBJECT_P (obj) \
152 && (((COS_Object)obj)->header.type == COS_Object_Type_##TYPE))
154 #define COS_OBJECT_STRING_P(obj) \
155 COS_OBJECT_TYPE_P (obj, String)
157 #define COS_OBJECT_SYMBOL_P(obj) \
158 COS_OBJECT_TYPE_P (obj, Symbol)
160 #define COS_OBJECT_CONS_P(obj) \
161 COS_OBJECT_TYPE_P (obj, Cons)
163 #define COS_OBJECT_DS_P(obj) \
164 COS_OBJECT_TYPE_P (obj, DS)
166 #define COS_OBJECT_GENRE_P(obj) \
167 COS_OBJECT_TYPE_P (obj, Genre)
169 #define COS_OBJECT_FEATURE_P(obj) \
170 COS_OBJECT_TYPE_P (obj, Feature)
172 #define COS_OBJECT_FEATURE_INDEX_P(obj) \
173 COS_OBJECT_TYPE_P (obj, Feature_INDEX)
176 struct COS_String_ent
178 COS_Object_Header header;
184 int cos_retain_string (COS_Object obj);
185 int cos_release_string (COS_Object obj);
188 struct COS_Symbol_ent
190 COS_Object_Header header;
196 COS_Symbol cos_make_symbol (COS_String string);
198 int cos_retain_symbol (COS_Object obj);
199 int cos_release_symbol (COS_Object obj);
202 typedef struct COS_Symbol_Table_ent COS_Symbol_Table_ent;
203 typedef COS_Symbol_Table_ent* COS_Symbol_Table;
205 struct COS_Symbol_Table_ent
211 COS_Symbol_Table cos_make_symbol_table (void);
213 int cos_symbol_table_grow (COS_Symbol_Table table);
215 void cos_destroy_symbol_table (COS_Symbol_Table table);
217 int cos_symbol_table_set (COS_Symbol_Table table, COS_Symbol symbol);
220 cos_symbol_table_intern (COS_Symbol_Table table, COS_object name);
225 COS_Object_Header header;
231 #define COS_CAR(obj) \
232 (((COS_Cons)(obj))->car)
233 #define COS_CDR(obj) \
234 (((COS_Cons)(obj))->cdr)
236 int cos_retain_cons (COS_Object obj);
237 int cos_release_cons (COS_Object obj);
240 struct COS_Container_ent
242 COS_Object_Header header;
251 int cos_retain_container (COS_Object obj);
252 int cos_release_container (COS_Object obj);
257 COS_Object_Header header;
263 int cos_retain_sexp (COS_Object obj);
264 int cos_release_sexp (COS_Object obj);
267 struct COS_Binary_ent
269 COS_Object_Header header;
275 int cos_retain_binary (COS_Object obj);
276 int cos_release_binary (COS_Object obj);
279 int cos_retain_ds (COS_Object obj);
280 int cos_release_ds (COS_Object obj);
283 int cos_retain_genre (COS_Object obj);
284 int cos_release_genre (COS_Object obj);
286 int concord_close_genre (COS_Genre genre);
289 struct COS_Feature_ent
291 COS_Object_Header header;
296 COS_Hash_Table value_table;
299 int cos_retain_feature (COS_Object obj);
300 int cos_release_feature (COS_Object obj);
302 int concord_close_feature (COS_Feature feature);
305 int cos_retain_index (COS_Object obj);
306 int cos_release_index (COS_Object obj);
308 int concord_close_index (COS_Feature_INDEX table);
311 struct COS_DB_Object_ent
313 COS_Object_Header header;
319 int cos_retain_db_object (COS_Object obj);
320 int cos_release_db_object (COS_Object obj);
329 #endif /* !_COS_I_H */