X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fgrob-interface.hh;h=bde5f5263d4130091afbd44a803501ee9fc9da69;hb=ef9512388b15e1e5e2b3592299ffe489ac43abb4;hp=2062393f0b74910fe944c726a2b08625f8561499;hpb=82bc9ad690e201aaa55694f8b92261ae7338f56a;p=lilypond.git diff --git a/lily/include/grob-interface.hh b/lily/include/grob-interface.hh index 2062393f0b..bde5f5263d 100644 --- a/lily/include/grob-interface.hh +++ b/lily/include/grob-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2014 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,22 +21,15 @@ #define INTERFACE_HH #include "lily-guile.hh" +#include "protected-scm.hh" -#define DECLARE_GROB_INTERFACE() \ - static SCM interface_symbol_; \ - static bool has_interface (Grob*) - -#define ADD_INTERFACE(cl, b, c) \ - SCM cl::interface_symbol_; \ - bool cl::has_interface (Grob *me) \ - { \ - return me->internal_has_interface (interface_symbol_); \ - } \ - void cl ## _init_ifaces () \ - { \ - cl::interface_symbol_ = add_interface (#cl, b, c); \ - } \ - ADD_SCM_INIT_FUNC (cl ## ifaces, cl ## _init_ifaces); +class Grob; + +#define ADD_INTERFACE(cl, b, c) \ + Grob_interface cl ## _interface_initializer; \ + template <> char const *Grob_interface::cxx_name_ (#cl); \ + template <> char const *Grob_interface::description_ (b); \ + template <> char const *Grob_interface::variables_ (c); SCM add_interface (char const *cxx_name, char const *descr, @@ -46,5 +39,33 @@ SCM ly_add_interface (SCM, SCM, SCM); void internal_add_interface (SCM, SCM, SCM); SCM ly_all_grob_interfaces (); +template +class Grob_interface +{ +public: + Grob_interface () + { + add_scm_init_func (Grob_interface::init); + } + +private: + static void init () + { + interface_symbol_ = ::add_interface (cxx_name_, description_, variables_); + } + + template + friend bool has_interface(Grob *); + +private: + static Protected_scm interface_symbol_; + static char const *cxx_name_; + static char const *description_; + static char const *variables_; +}; + +template +Protected_scm Grob_interface::interface_symbol_; + #endif /* INTERFACE_HH */