Commit | Line | Data |
---|---|---|
0518d3e2 MD |
1 | /* classes: h_files */ |
2 | ||
729dbac3 DH |
3 | #ifndef SCM_GOOPS_H |
4 | #define SCM_GOOPS_H | |
a392ee15 | 5 | |
51fd1cd6 | 6 | /* Copyright (C) 1998,1999,2000,2001,2002,2003, 2006, 2008, 2009, 2011, 2015 Free Software Foundation, Inc. |
a392ee15 | 7 | * |
73be1d9e | 8 | * This library is free software; you can redistribute it and/or |
53befeb7 NJ |
9 | * modify it under the terms of the GNU Lesser General Public License |
10 | * as published by the Free Software Foundation; either version 3 of | |
11 | * the License, or (at your option) any later version. | |
a392ee15 | 12 | * |
53befeb7 NJ |
13 | * This library is distributed in the hope that it will be useful, but |
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
73be1d9e MV |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. | |
a392ee15 | 17 | * |
73be1d9e MV |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with this library; if not, write to the Free Software | |
53befeb7 NJ |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
21 | * 02110-1301 USA | |
73be1d9e | 22 | */ |
a392ee15 | 23 | |
0518d3e2 MD |
24 | \f |
25 | ||
26 | /* This software is a derivative work of other copyrighted softwares; the | |
27 | * copyright notices of these softwares are placed in the file COPYRIGHTS | |
28 | * | |
29 | * This file is based upon stklos.h from the STk distribution by | |
30 | * Erick Gallesio <eg@unice.fr>. | |
31 | */ | |
32 | ||
33 | #include "libguile/__scm.h" | |
34 | ||
398d8ee1 KN |
35 | #include "libguile/validate.h" |
36 | ||
b6cf4d02 AW |
37 | /* {Class flags} |
38 | * | |
39 | * These are used for efficient identification of instances of a | |
40 | * certain class or its subclasses when traversal of the inheritance | |
41 | * graph would be too costly. | |
42 | */ | |
43 | #define SCM_VTABLE_FLAG_GOOPS_CLASS SCM_VTABLE_FLAG_GOOPS_0 | |
44 | #define SCM_VTABLE_FLAG_GOOPS_VALID SCM_VTABLE_FLAG_GOOPS_1 | |
b6cf4d02 AW |
45 | |
46 | #define SCM_CLASS_OF(x) SCM_STRUCT_VTABLE (x) | |
47 | #define SCM_CLASS_FLAGS(class) (SCM_VTABLE_FLAGS (class)) | |
48 | #define SCM_OBJ_CLASS_FLAGS(obj) (SCM_STRUCT_VTABLE_FLAGS (obj)) | |
49 | #define SCM_SET_CLASS_FLAGS(c, f) (SCM_SET_VTABLE_FLAGS (c, f)) | |
50 | #define SCM_CLEAR_CLASS_FLAGS(c, f) (SCM_CLEAR_VTABLE_FLAGS (c, f)) | |
51 | ||
51f66c91 | 52 | #define SCM_CLASSF_METACLASS (SCM_VTABLE_FLAG_GOOPS_CLASS|SCM_VTABLE_FLAG_VTABLE) |
b6cf4d02 AW |
53 | #define SCM_CLASSF_GOOPS_VALID SCM_VTABLE_FLAG_GOOPS_VALID |
54 | #define SCM_CLASSF_GOOPS SCM_VTABLE_FLAG_GOOPS_CLASS | |
b6cf4d02 AW |
55 | #define SCM_CLASSF_GOOPS_OR_VALID (SCM_CLASSF_GOOPS | SCM_CLASSF_GOOPS_VALID) |
56 | ||
0518d3e2 MD |
57 | /* |
58 | * scm_class_class | |
59 | */ | |
60 | ||
b6cf4d02 | 61 | /* see also, SCM_VTABLE_BASE_LAYOUT, and build_class_class_slots */ |
2858deaf AW |
62 | #define SCM_CLASS_CLASS_LAYOUT \ |
63 | "pw" /* redefined */ \ | |
2858deaf AW |
64 | "pw" /* direct supers */ \ |
65 | "pw" /* direct slots */ \ | |
66 | "pw" /* direct subclasses */ \ | |
67 | "pw" /* direct methods */ \ | |
68 | "pw" /* cpl */ \ | |
2858deaf | 69 | "pw" /* slots */ \ |
92928b86 | 70 | "pw" /* getters-n-setters */ |
b6cf4d02 AW |
71 | |
72 | #define scm_si_redefined (scm_vtable_offset_user + 0) | |
e03e3101 AW |
73 | #define scm_si_direct_supers (scm_vtable_offset_user + 1) /* (class ...) */ |
74 | #define scm_si_direct_slots (scm_vtable_offset_user + 2) /* ((name . options) ...) */ | |
75 | #define scm_si_direct_subclasses (scm_vtable_offset_user + 3) /* (class ...) */ | |
76 | #define scm_si_direct_methods (scm_vtable_offset_user + 4) /* (methods ...) */ | |
77 | #define scm_si_cpl (scm_vtable_offset_user + 5) /* (class ...) */ | |
78 | #define scm_si_slots (scm_vtable_offset_user + 6) /* ((name . options) ...) */ | |
79 | #define scm_si_getters_n_setters (scm_vtable_offset_user + 7) | |
92928b86 | 80 | #define SCM_N_CLASS_SLOTS (scm_vtable_offset_user + 8) |
0518d3e2 | 81 | |
efcebb5b | 82 | #define SCM_OBJ_CLASS_REDEF(x) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (x) [scm_si_redefined])) |
0518d3e2 | 83 | #define SCM_INST(x) SCM_STRUCT_DATA (x) |
00d8d838 | 84 | |
0518d3e2 | 85 | #define SCM_CLASS_OF(x) SCM_STRUCT_VTABLE (x) |
729dbac3 | 86 | #define SCM_ACCESSORS_OF(x) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (x)[scm_si_getters_n_setters])) |
00d8d838 DH |
87 | |
88 | #define SCM_CLASSP(x) \ | |
89 | (SCM_STRUCTP (x) && SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_METACLASS) | |
6182ceac | 90 | #define SCM_VALIDATE_CLASS(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, CLASSP, "class") |
0518d3e2 | 91 | |
25ba37df | 92 | #define SCM_INSTANCEP(x) \ |
00d8d838 | 93 | (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_GOOPS)) |
6182ceac | 94 | #define SCM_VALIDATE_INSTANCE(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, INSTANCEP, "instance") |
0518d3e2 | 95 | |
b6cf4d02 AW |
96 | #define SCM_SLOT(x, i) (SCM_STRUCT_SLOT_REF (x, i)) |
97 | #define SCM_SET_SLOT(x, i, v) (SCM_STRUCT_SLOT_SET (x, i, v)) | |
00d8d838 | 98 | |
7888309b | 99 | #define SCM_SUBCLASSP(c1, c2) (scm_is_true (scm_c_memq (c2, SCM_SLOT (c1, scm_si_cpl)))) |
00d8d838 DH |
100 | #define SCM_IS_A_P(x, c) \ |
101 | (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), c)) | |
0518d3e2 | 102 | |
57898597 | 103 | #define SCM_GENERICP(x) (scm_is_generic (x)) |
6182ceac | 104 | #define SCM_VALIDATE_GENERIC(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, GENERICP, "generic function") |
00d8d838 | 105 | |
57898597 | 106 | #define SCM_METHODP(x) (scm_is_method (x)) |
6182ceac | 107 | #define SCM_VALIDATE_METHOD(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, METHODP, "method") |
398d8ee1 | 108 | |
efcebb5b | 109 | #define SCM_SET_CLASS_DESTRUCTOR(c, d) SCM_SET_VTABLE_DESTRUCTOR (c, d) |
efcebb5b | 110 | |
57898597 AW |
111 | SCM_INTERNAL SCM scm_i_port_class[]; |
112 | SCM_INTERNAL SCM scm_i_smob_class[]; | |
33b001fd MV |
113 | |
114 | SCM_API SCM scm_module_goops; | |
115 | ||
116 | SCM_API SCM scm_goops_version (void); | |
33b001fd | 117 | SCM_API void scm_load_goops (void); |
efcebb5b AW |
118 | SCM_API SCM scm_make_extended_class (char const *type_name, int applicablep); |
119 | SCM_API void scm_make_port_classes (long ptobnum, char *type_name); | |
33b001fd | 120 | SCM_API SCM scm_ensure_accessor (SCM name); |
539d5410 | 121 | SCM_API SCM scm_class_of (SCM obj); |
0518d3e2 MD |
122 | |
123 | /* Low level functions exported */ | |
33b001fd | 124 | SCM_API SCM scm_make_next_method (SCM methods, SCM args, SCM gf); |
28b818d3 AW |
125 | SCM_INTERNAL SCM scm_make_standard_class (SCM meta, SCM name, SCM dsupers, |
126 | SCM dslots); | |
0518d3e2 MD |
127 | |
128 | /* Primitives exported */ | |
33b001fd MV |
129 | SCM_API SCM scm_slot_ref (SCM obj, SCM slot_name); |
130 | SCM_API SCM scm_slot_set_x (SCM obj, SCM slot_name, SCM value); | |
131 | ||
efcebb5b | 132 | SCM_INTERNAL void scm_i_inherit_applicable (SCM c); |
0b607675 TTN |
133 | SCM_API SCM scm_sys_inherit_magic_x (SCM c, SCM dsupers); |
134 | SCM_API SCM scm_instance_p (SCM obj); | |
57898597 AW |
135 | SCM_API int scm_is_generic (SCM x); |
136 | SCM_API int scm_is_method (SCM x); | |
0b607675 TTN |
137 | SCM_API SCM scm_class_name (SCM obj); |
138 | SCM_API SCM scm_class_direct_supers (SCM obj); | |
139 | SCM_API SCM scm_class_direct_slots (SCM obj); | |
140 | SCM_API SCM scm_class_direct_subclasses (SCM obj); | |
141 | SCM_API SCM scm_class_direct_methods (SCM obj); | |
142 | SCM_API SCM scm_class_precedence_list (SCM obj); | |
143 | SCM_API SCM scm_class_slots (SCM obj); | |
0b607675 TTN |
144 | SCM_API SCM scm_generic_function_name (SCM obj); |
145 | SCM_API SCM scm_generic_function_methods (SCM obj); | |
146 | SCM_API SCM scm_method_generic_function (SCM obj); | |
147 | SCM_API SCM scm_method_specializers (SCM obj); | |
148 | SCM_API SCM scm_method_procedure (SCM obj); | |
0b607675 TTN |
149 | SCM_API SCM scm_slot_ref_using_class (SCM cls, SCM obj, SCM slot_name); |
150 | SCM_API SCM scm_slot_set_using_class_x (SCM cls, SCM obj, SCM slot_name, SCM value); | |
151 | SCM_API SCM scm_slot_bound_using_class_p (SCM cls, SCM obj, SCM slot_name); | |
152 | SCM_API SCM scm_slot_exists_using_class_p (SCM cls, SCM obj, SCM slot_name); | |
153 | SCM_API SCM scm_slot_bound_p (SCM obj, SCM slot_name); | |
154 | SCM_API SCM scm_slot_exists_p (SCM obj, SCM slot_name); | |
155 | SCM_API SCM scm_sys_modify_instance (SCM old, SCM newinst); | |
33b001fd MV |
156 | SCM_API SCM scm_sys_modify_class (SCM old, SCM newcls); |
157 | SCM_API SCM scm_sys_invalidate_class (SCM cls); | |
33b001fd MV |
158 | SCM_API SCM scm_sys_invalidate_method_cache_x (SCM gf); |
159 | SCM_API SCM scm_generic_capability_p (SCM proc); | |
160 | SCM_API SCM scm_enable_primitive_generic_x (SCM subrs); | |
9f63ce02 | 161 | SCM_INTERNAL SCM scm_set_primitive_generic_x (SCM subr, SCM generic); |
33b001fd | 162 | SCM_API SCM scm_primitive_generic_generic (SCM subr); |
0b607675 TTN |
163 | SCM_API SCM stklos_version (void); |
164 | SCM_API SCM scm_make (SCM args); | |
efcebb5b | 165 | SCM_API void scm_change_object_class (SCM, SCM, SCM); |
fa075d40 AW |
166 | |
167 | /* These procedures are for dispatching to a generic when a primitive | |
168 | fails to apply. They raise a wrong-type-arg error if the primitive's | |
169 | generic has not been initialized yet. */ | |
170 | SCM_API SCM scm_wta_dispatch_0 (SCM gf, const char *subr); | |
171 | SCM_API SCM scm_wta_dispatch_1 (SCM gf, SCM a1, int pos, const char *subr); | |
172 | SCM_API SCM scm_wta_dispatch_2 (SCM gf, SCM a1, SCM a2, int pos, const char *subr); | |
173 | SCM_API SCM scm_wta_dispatch_n (SCM gf, SCM args, int pos, const char *subr); | |
efcebb5b | 174 | |
f3c6a02c AW |
175 | SCM_INTERNAL SCM scm_i_define_class_for_vtable (SCM vtable); |
176 | ||
33b001fd | 177 | |
102dbb6f | 178 | SCM_INTERNAL void scm_init_goops (void); |
0518d3e2 | 179 | |
a392ee15 DH |
180 | #endif /* SCM_GOOPS_H */ |
181 | ||
182 | /* | |
183 | Local Variables: | |
184 | c-file-style: "gnu" | |
185 | End: | |
186 | */ |