X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fwrapped.h;fp=src%2Fwrapped.h;h=2412d7eab0907ab46d02c098457d8eeedf73fb93;hb=2dfe078cf4082caf641c96449907f36a9029b486;hp=0000000000000000000000000000000000000000;hpb=21f12bf4ba8c031b36784e1e0a479535f477cc59;p=guile-irrlicht.git diff --git a/src/wrapped.h b/src/wrapped.h new file mode 100644 index 0000000..2412d7e --- /dev/null +++ b/src/wrapped.h @@ -0,0 +1,72 @@ +/* guile-irrlicht --- GNU Guile bindings for Irrlicht Engine + + Copyright (C) 2020 Javier Sancho + + This file is part of guile-irrlicht. + + guile-irrlicht is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 3 of the + License, or (at your option) any later version. + + guile-irrlicht is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with guile-irrlicht. If not, see + . +*/ + +#include + +#define DECLARE_WRAPPED_TYPE(TYPE, INIT, PRED, WRAP, UNWRAP) \ + void \ + INIT (void); \ + \ + SCM \ + WRAP (TYPE foreign_obj); \ + \ + TYPE \ + UNWRAP (SCM wrapped_obj); \ + \ + bool \ + PRED (SCM wrapped_obj); + + +#define DEFINE_WRAPPED_TYPE(TYPE, PRINT_NAME, INIT, PRED, WRAP, UNWRAP) \ + static SCM wrapped_type; \ + \ + void \ + INIT (void) \ + { \ + SCM name, slots; \ + scm_t_struct_finalize finalizer; \ + \ + name = scm_from_utf8_symbol (PRINT_NAME); \ + slots = scm_list_1 (scm_from_utf8_symbol ("data")); \ + finalizer = NULL; \ + \ + wrapped_type = \ + scm_make_foreign_object_type (name, slots, finalizer); \ + } \ + \ + SCM \ + WRAP (TYPE foreign_obj) \ + { \ + return scm_make_foreign_object_1 (wrapped_type, foreign_obj); \ + } \ + \ + TYPE \ + UNWRAP (SCM wrapped_obj) \ + { \ + scm_assert_foreign_object_type (wrapped_type, wrapped_obj); \ + return (TYPE)scm_foreign_object_ref (wrapped_obj, 0); \ + } \ + \ + bool \ + PRED (SCM wrapped_obj) \ + { \ + return SCM_IS_A_P (wrapped_obj, wrapped_type); \ + }