]> git.donarmstrong.com Git - lilypond.git/blob - hdr/register.hh
release: 0.0.27
[lilypond.git] / hdr / register.hh
1 /*
2   register.hh -- part of LilyPond
3
4   (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
5 */
6
7 #ifndef REGISTER_HH
8 #define REGISTER_HH
9 #include "proto.hh"
10 #include "sstack.hh"
11
12 /// data container.
13 struct Staff_elem_info {
14     Staff_elem * elem_p_;
15     Request*req_l_;
16     const Voice * voice_l_;
17     Voice_group_registers * group_regs_l_;
18  
19     Request_register * origin_reg_l_;
20
21     /****/
22     Staff_elem_info(Staff_elem*, Request*, Request_register*);
23     Staff_elem_info();
24 };
25
26 /// Hungarian postfix: reg
27 struct Request_register {
28     Complex_walker * walk_l_;
29     Array<Request*> accepted_req_arr_;
30     
31     /****************/
32
33     Request_register(Complex_walker*);
34     Request_register();
35     virtual ~Request_register(){}
36
37     /// take note of item/spaanner
38     virtual void acknowledge_element(Staff_elem_info){}
39     /**
40       put item in spanner. Adjust local key; etc.
41       */
42     
43     ///
44     virtual bool try_request(Request *req_l) =0;
45     /**
46       try to fit the request in this register
47
48       RETURN
49       false: request noted, but not taken.
50
51       true: request swallowed. Don't try to put elsewhere
52
53       (may be we could use C++ exceptions.. :-)
54       */
55
56     /// make items/spanners with the requests you got
57     virtual void process_request()=0;
58
59     /// typeset any spanners. Empty accepted_req_arr_
60     void pre_move_processing();
61     void post_move_processing();
62     
63 protected:
64     /// virtual, called by pre_move_process()
65     virtual void do_pre_move_process(){}
66     virtual void do_post_move_process(){}
67 };
68 /**
69   a struct which processes requests, and creates the Staff_elems  
70   */
71
72 struct Notehead_register : Request_register {
73     Item* note_p_;
74     /****************/
75     Notehead_register(Complex_walker*);
76     virtual bool try_request(Request *req_l) ;
77     virtual void process_request();
78     virtual void do_pre_move_process();
79 };
80
81 struct Slur_register : Request_register {
82     sstack<Slur_req*> requests_arr_;
83     sstack<Slur *> slur_l_stack_;
84     Array<Slur*> end_slur_l_arr_;
85     
86     /****************/
87     ~Slur_register();
88     Slur_register(Complex_walker*);
89     virtual bool try_request(Request*);
90     virtual void process_request();
91     virtual void acknowledge_element(Staff_elem_info);
92     virtual void do_pre_move_process();
93 };
94
95 struct Stem_beam_register : Request_register {
96     Stem * stem_p_;
97     Beam * beam_p_;
98     Beam_req * beam_req_l_;
99     Stem_req * stem_req_l_;
100     Beam_req * start_req_l_;
101     bool end_beam_b_;
102     Rhythmic_grouping *current_grouping;
103     int default_dir_i_;
104     
105     /****************/
106     Stem_beam_register(Complex_walker*);
107     ~Stem_beam_register();
108     void set_dir(int dir_i_);
109     virtual bool try_request(Request*);
110     virtual void process_request();
111     virtual void acknowledge_element(Staff_elem_info);
112     virtual void do_pre_move_process();
113     virtual void do_post_move_process();
114 };
115
116 struct   Script_register : Request_register {
117     Script * script_p_;
118     
119     /****************/
120     void set_dir(int dir_i_);
121     Script_register(Complex_walker*);
122     virtual bool try_request(Request*);
123     virtual void process_request();
124     virtual void acknowledge_element(Staff_elem_info);
125     virtual void do_pre_move_process();
126 };
127
128 struct Text_register : Request_register{
129     Text_item * text_p_;
130
131     /****************/
132     void set_dir(int dir_i_);
133     Text_register(Complex_walker*);
134     virtual bool try_request(Request*);
135     virtual void process_request();
136     virtual void do_pre_move_process();
137 };
138
139
140 struct Local_key_register : Request_register {
141     Local_key_item* key_item_p_;
142
143     /****************/
144     
145     virtual bool try_request(Request*);
146     virtual void process_request();
147     virtual void acknowledge_element(Staff_elem_info);
148     virtual void do_pre_move_process();
149     Local_key_register(Complex_walker*);
150 };
151
152 #endif // REGISTER_HH
153