-#define TRANSLATOR_DECLARATIONS(NAME) \
- public: \
- NAME (); \
- VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \
- static SCM static_description_; \
- static Drul_array<vector<Acknowledge_information> > acknowledge_static_array_drul_; \
- virtual void fetch_precomputable_methods (Translator_void_method_ptr methods[]); \
- virtual SCM static_translator_description () const; \
- virtual SCM translator_description () const; \
- virtual Engraver_void_function_engraver_grob_info get_acknowledger (SCM sym) \
- { \
- return static_get_acknowledger (sym); \
- } \
- virtual Engraver_void_function_engraver_grob_info get_end_acknowledger (SCM sym) \
- { \
- return static_get_end_acknowledger (sym); \
- } \
- static Engraver_void_function_engraver_grob_info static_get_acknowledger (SCM sym); \
- static Engraver_void_function_engraver_grob_info static_get_end_acknowledger(SCM); \
+template <class T> Translator *
+Translator_creator::allocate (Context *ctx)
+{
+ return new T(ctx);
+}
+
+#define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \
+ public: \
+ DECLARE_CLASSNAME (NAME); \
+ virtual void fetch_precomputable_methods (SCM methods[]); \
+ DECLARE_TRANSLATOR_CALLBACKS (NAME); \
+ TRANSLATOR_INHERIT (Translator); \
+ /* end #define */
+
+#define TRANSLATOR_INHERIT(BASE) \
+ using BASE::method_finder
+
+#define DECLARE_TRANSLATOR_CALLBACKS(NAME) \
+ template <void (NAME::*mf)()> \
+ static SCM method_finder () \
+ { \
+ return Callback0_wrapper::make_smob<NAME, mf> (); \
+ } \
+ template <void (NAME::*mf)(Stream_event *)> \
+ static SCM method_finder () \
+ { \
+ return Callback_wrapper::make_smob<trampoline<NAME, mf> > (); \
+ } \
+ template <void (NAME::*mf)(Grob_info)> \
+ static SCM method_finder () { \
+ return Callback2_wrapper::make_smob<trampoline <NAME, mf> > (); \
+ } \