]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/translator.hh
14ff0b31a1b394fa8ae4239207d8898fa46b42f2
[lilypond.git] / lily / include / translator.hh
1 /*
2   translator.hh -- declare Translator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #ifndef TRANSLATOR_HH
10 #define TRANSLATOR_HH
11
12 #include "global-ctor.hh"
13 #include "std-string.hh"
14 #include "lily-proto.hh"
15 #include "virtual-methods.hh"
16 #include "input.hh"
17 #include "smobs.hh"
18 #include "std-vector.hh"
19 #include "protected-scm.hh"
20
21 struct Acknowledge_information
22 {
23   SCM symbol_;
24   Engraver_void_function_engraver_grob_info function_;
25 };
26
27
28 /*
29   Each translator class has a static list of listener records. Each
30   record makes one explains how to register one of the class's stream event
31   listeners to a context.
32 */
33 typedef struct translator_listener_record {
34   Listener (*get_listener_) (void *);
35   SCM event_class_;
36   struct translator_listener_record *next_;
37 } translator_listener_record;
38
39 #define TRANSLATOR_DECLARATIONS(NAME)                                   \
40 private:                                                                \
41   static translator_listener_record *listener_list_;                    \
42   public:                                                               \
43   NAME ();                                                              \
44   VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME);                          \
45   static SCM static_description_;                                       \
46   static Drul_array<vector<Acknowledge_information> > acknowledge_static_array_drul_; \
47   virtual void fetch_precomputable_methods (Translator_void_method_ptr methods[]); \
48   virtual SCM static_translator_description () const;                   \
49   virtual SCM translator_description () const;                          \
50   virtual Engraver_void_function_engraver_grob_info get_acknowledger (SCM sym) \
51   {                                                                     \
52     return static_get_acknowledger (sym);                               \
53   }                                                                     \
54   virtual Engraver_void_function_engraver_grob_info get_end_acknowledger (SCM sym) \
55   {                                                                     \
56     return static_get_end_acknowledger (sym);                           \
57   } \
58   static Engraver_void_function_engraver_grob_info static_get_acknowledger (SCM sym); \
59   static Engraver_void_function_engraver_grob_info static_get_end_acknowledger(SCM); \
60 public:                                                                 \
61   virtual translator_listener_record *get_listener_list () const        \
62   {                                                                     \
63     return listener_list_;                                              \
64   }                                                                     \
65   /* end #define */
66
67 #define DECLARE_TRANSLATOR_LISTENER(m)                  \
68 public:                                                 \
69 inline void listen_ ## m (Stream_event *);              \
70 /* Should be private */                                 \
71 static void _internal_declare_ ## m ();                 \
72 private:                                                \
73 static Listener _get_ ## m ## _listener (void *);       \
74 DECLARE_LISTENER (_listen_scm_ ## m);
75
76 #define DECLARE_ACKNOWLEDGER(x) public : void acknowledge_ ## x (Grob_info); protected:
77 #define DECLARE_END_ACKNOWLEDGER(x) public : void acknowledge_end_ ## x (Grob_info); protected:
78
79 enum Translator_precompute_index
80   {
81     START_TRANSLATION_TIMESTEP,
82     STOP_TRANSLATION_TIMESTEP,
83     PROCESS_MUSIC,
84     PROCESS_ACKNOWLEDGED,
85     TRANSLATOR_METHOD_PRECOMPUTE_COUNT,
86   };
87
88 /*
89   Translate music into grobs.
90 */
91 class Translator
92 {
93   void init ();
94
95 protected:
96   bool must_be_last_;
97
98 public:
99   bool must_be_last () const;
100
101   Context *context () const { return daddy_context_; }
102
103   Translator (Translator const &);
104
105   SCM internal_get_property (SCM symbol) const;
106
107   virtual Output_def *get_output_def () const;
108   virtual Translator_group *get_daddy_translator ()const;
109   virtual Moment now_mom () const;
110
111   virtual void initialize ();
112   virtual void finalize ();
113
114   /*should maybe be virtual*/
115   void connect_to_context (Context *c);
116   void disconnect_from_context (Context *c);
117
118   void stop_translation_timestep ();
119   void start_translation_timestep ();
120   void process_music ();
121   void process_acknowledged ();
122
123   Context *get_score_context () const;
124   Global_context *get_global_context () const;
125
126   TRANSLATOR_DECLARATIONS (Translator);
127   DECLARE_SMOBS (Translator, dummy);
128
129 protected:                      // should be private.
130   Context *daddy_context_;
131   void protect_event (SCM ev);
132   virtual void derived_mark () const;
133   static void add_translator_listener (translator_listener_record **listener_list, translator_listener_record *r, Listener (*get_listener) (void *), const char *ev_class);
134   SCM get_listened_class_list (const translator_listener_record *listeners) const;
135
136   friend class Translator_group;
137 };
138 void add_translator (Translator *trans);
139
140 Translator *get_translator (SCM s);
141 Moment get_event_length (Stream_event *s);
142 DECLARE_UNSMOB (Translator, translator);
143 #endif // TRANSLATOR_HH