* struct.c, struct.h:
[bpt/guile.git] / libguile / struct.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
3#ifndef STRUCTH
4#define STRUCTH
7dc6e754 5/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
0f2d19dd
JB
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this software; see the file COPYING. If not, write to
82892bed
JB
19 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 * Boston, MA 02111-1307 USA
0f2d19dd
JB
21 *
22 * As a special exception, the Free Software Foundation gives permission
23 * for additional uses of the text contained in its release of GUILE.
24 *
25 * The exception is that, if you link the GUILE library with other files
26 * to produce an executable, this does not by itself cause the
27 * resulting executable to be covered by the GNU General Public License.
28 * Your use of that executable is in no way restricted on account of
29 * linking the GUILE library code into it.
30 *
31 * This exception does not however invalidate any other reasons why
32 * the executable file might be covered by the GNU General Public License.
33 *
34 * This exception applies only to the code released by the
35 * Free Software Foundation under the name GUILE. If you copy
36 * code from other Free Software Foundation releases into a copy of
37 * GUILE, as the General Public License permits, the exception does
38 * not apply to the code that you add in this way. To avoid misleading
39 * anyone as to the status of such modified files, you must delete
40 * this exception notice from them.
41 *
42 * If you write modifications of your own for GUILE, it is your choice
43 * whether to permit this exception to apply to your modifications.
82892bed 44 * If you do not wish that, delete this exception notice. */
0f2d19dd
JB
45\f
46
b4309c3c 47#include "libguile/__scm.h"
bafcafb2 48#include "libguile/print.h"
0f2d19dd
JB
49
50\f
51
2c36c351 52/* Number of words with negative index */
ad196599
MD
53#define scm_struct_n_extra_words 4
54#define scm_struct_entity_n_extra_words 9
2c36c351 55
0f2d19dd 56/* These are how the initial words of a vtable are allocated. */
ad196599
MD
57#define scm_struct_i_setter -9 /* Setter */
58#define scm_struct_i_proc -8 /* Optional procedure slots */
59#define scm_struct_i_free -4 /* Destructor */
60#define scm_struct_i_ptr -3 /* Start of block (see alloc_struct) */
4bfdf158 61#define scm_struct_i_n_words -2 /* How many words allocated to this struct? */
ad196599
MD
62#define scm_struct_i_size -1 /* Instance size */
63#define scm_struct_i_flags -1 /* Upper 12 bits used as flags */
4bfdf158
MD
64#define scm_vtable_index_layout 0 /* A symbol describing the physical arrangement of this type. */
65#define scm_vtable_index_vcell 1 /* An opaque word, managed by the garbage collector. */
66#define scm_vtable_index_vtable 2 /* A pointer to the handle for this vtable. */
67#define scm_vtable_index_printer 3 /* A printer for this struct type. */
68#define scm_vtable_offset_user 4 /* Where do user fields start? */
0f2d19dd 69
ad196599
MD
70typedef size_t (*scm_struct_free_t) (SCM *vtable, SCM *data);
71
72#define SCM_STRUCTF_MASK (0xFFF << 20)
f40f662e 73#define SCM_STRUCTF_ENTITY (1L << 30) /* Indicates presence of proc slots */
7ee70a26
MD
74#define SCM_STRUCTF_LIGHT (1L << 31) /* Light representation
75 (no hidden words) */
0f2d19dd
JB
76
77#define SCM_STRUCTP(X) (SCM_TYP3(X) == scm_tc3_cons_gloc)
78#define SCM_STRUCT_DATA(X) ((SCM*)(SCM_CDR(X)))
79#define SCM_STRUCT_VTABLE_DATA(X) ((SCM *)(SCM_CAR(X) - 1))
4bfdf158
MD
80#define SCM_STRUCT_LAYOUT(X) (SCM_STRUCT_VTABLE_DATA(X)[scm_vtable_index_layout])
81#define SCM_STRUCT_VTABLE(X) (SCM_STRUCT_VTABLE_DATA(X)[scm_vtable_index_vtable])
82#define SCM_STRUCT_PRINTER(X) (SCM_STRUCT_VTABLE_DATA(X)[scm_vtable_index_printer])
ad196599 83#define SCM_SET_VTABLE_DESTRUCTOR(X, D) (SCM_STRUCT_DATA(X)[scm_struct_i_free] = (SCM) D)
2c36c351
MD
84/* Efficiency is important in the following macro, since it's used in GC */
85#define SCM_LAYOUT_TAILP(X) (((X) & 32) == 0) /* R, W or O */
0f2d19dd 86
6decd505
MD
87#define SCM_STRUCT_TABLE_NAME(X) SCM_CAR (X)
88#define SCM_SET_STRUCT_TABLE_NAME(X, NAME) SCM_SETCAR (X, NAME)
89#define SCM_STRUCT_TABLE_CLASS(X) SCM_CDR (X)
90#define SCM_SET_STRUCT_TABLE_CLASS(X, CLASS) SCM_SETCDR (X, CLASS)
91extern SCM scm_struct_table;
0f2d19dd
JB
92
93\f
0f2d19dd 94
ad196599
MD
95extern SCM *scm_alloc_struct (int n_words,
96 int n_extra,
97 char *who);
98extern size_t scm_struct_free_0 (SCM *vtable, SCM *data);
99extern size_t scm_struct_free_light (SCM *vtable, SCM *data);
100extern size_t scm_struct_free_standard (SCM *vtable, SCM *data);
101extern size_t scm_struct_free_entity (SCM *vtable, SCM *data);
f40f662e 102extern void scm_struct_init SCM_P ((SCM handle, int tail_elts, SCM inits));
1cc91f1b
JB
103extern SCM scm_make_struct_layout SCM_P ((SCM fields));
104extern SCM scm_struct_p SCM_P ((SCM x));
105extern SCM scm_struct_vtable_p SCM_P ((SCM x));
106extern SCM scm_make_struct SCM_P ((SCM vtable, SCM tail_array_size, SCM init));
107extern SCM scm_make_vtable_vtable SCM_P ((SCM extra_fields, SCM tail_array_size, SCM init));
108extern SCM scm_struct_ref SCM_P ((SCM handle, SCM pos));
109extern SCM scm_struct_set_x SCM_P ((SCM handle, SCM pos, SCM val));
110extern SCM scm_struct_vtable SCM_P ((SCM handle));
111extern SCM scm_struct_vtable_tag SCM_P ((SCM handle));
6decd505
MD
112extern unsigned int scm_struct_ihashq SCM_P ((SCM obj, unsigned int n));
113extern SCM scm_struct_create_handle SCM_P ((SCM obj));
114extern SCM scm_struct_vtable_name SCM_P ((SCM vtable));
115extern SCM scm_set_struct_vtable_name_x SCM_P ((SCM vtable, SCM name));
bafcafb2 116extern void scm_print_struct SCM_P ((SCM exp, SCM port, scm_print_state *));
1cc91f1b 117extern void scm_init_struct SCM_P ((void));
0f2d19dd
JB
118
119#endif /* STRUCTH */