]> git.jsancho.org Git - guile-irrlicht.git/blob - src/wrapped.h
video-driver
[guile-irrlicht.git] / src / wrapped.h
1 /* guile-irrlicht --- GNU Guile bindings for Irrlicht Engine
2
3    Copyright (C) 2020 Javier Sancho <jsf@jsancho.org>
4
5    This file is part of guile-irrlicht.
6
7    guile-irrlicht is free software; you can redistribute it and/or modify
8    it under the terms of the GNU Lesser General Public License as
9    published by the Free Software Foundation; either version 3 of the
10    License, or (at your option) any later version.
11
12    guile-irrlicht is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16
17    You should have received a copy of the GNU Lesser General Public
18    License along with guile-irrlicht. If not, see
19    <http://www.gnu.org/licenses/>.
20 */
21
22 #ifndef __GUILE_IRRLICHT_WRAPPED_H_INCLUDED__
23 #define __GUILE_IRRLICHT_WRAPPED_H_INCLUDED__
24
25 #include <libguile.h>
26
27 #define DECLARE_WRAPPED_TYPE(TYPE, INIT, PRED, WRAP, UNWRAP)            \
28   void                                                                  \
29   INIT (void);                                                          \
30                                                                         \
31   SCM                                                                   \
32   WRAP (TYPE foreign_obj);                                              \
33                                                                         \
34   TYPE                                                                  \
35   UNWRAP (SCM wrapped_obj);                                             \
36                                                                         \
37   bool                                                                  \
38   PRED (SCM wrapped_obj);
39
40
41 #define DEFINE_WRAPPED_TYPE(TYPE, PRINT_NAME, INIT, PRED, WRAP, UNWRAP) \
42   static SCM wrapped_##INIT;                                            \
43                                                                         \
44   void                                                                  \
45   INIT (void)                                                           \
46   {                                                                     \
47     SCM name, slots;                                                    \
48     scm_t_struct_finalize finalizer;                                    \
49                                                                         \
50     name = scm_from_utf8_symbol (PRINT_NAME);                           \
51     slots = scm_list_1 (scm_from_utf8_symbol ("data"));                 \
52     finalizer = NULL;                                                   \
53                                                                         \
54     wrapped_##INIT =                                                    \
55       scm_make_foreign_object_type (name, slots, finalizer);            \
56   }                                                                     \
57                                                                         \
58   SCM                                                                   \
59   WRAP (TYPE foreign_obj)                                               \
60   {                                                                     \
61     return scm_make_foreign_object_1 (wrapped_##INIT, foreign_obj);     \
62   }                                                                     \
63                                                                         \
64   TYPE                                                                  \
65   UNWRAP (SCM wrapped_obj)                                              \
66   {                                                                     \
67     scm_assert_foreign_object_type (wrapped_##INIT, wrapped_obj);       \
68     return (TYPE)scm_foreign_object_ref (wrapped_obj, 0);               \
69   }                                                                     \
70                                                                         \
71   bool                                                                  \
72   PRED (SCM wrapped_obj)                                                \
73   {                                                                     \
74     return SCM_IS_A_P (wrapped_obj, wrapped_##INIT);                    \
75   }
76
77 #endif