]> git.donarmstrong.com Git - lilypond.git/blob - lily/register-group.cc
release: 0.0.64
[lilypond.git] / lily / register-group.cc
1 /*
2   registergroup.cc -- implement Register_group_register
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "proto.hh"
10 #include "plist.hh"
11 #include "register-group.hh"
12 #include "register.hh"
13
14 bool
15 Register_group_register::acceptable_request_b(Request* r)const
16 {
17     for (iter_top(reg_list_, i); i.ok(); i++) {
18         if (i->acceptable_request_b(r))
19             return true;
20     }
21     return false;
22 }
23
24 void
25 Register_group_register::set_feature(Feature d)
26 {
27     iter_top(reg_list_, i);
28     while (i.ok()) {
29         // this construction to ensure clean deletion
30         Request_register *reg_l = i++; 
31         reg_l->set_feature(d);
32     }
33 }
34
35 void
36 Register_group_register::sync_features()
37 {
38     iter_top(reg_list_, i);
39     while (i.ok()) {
40
41         Request_register *reg_l = i++; 
42         reg_l->sync_features();
43     }
44 }
45
46 void
47 Register_group_register::pre_move_processing()
48 {
49     iter_top(reg_list_, i);
50     while (i.ok()) {
51         // this construction to ensure clean deletion
52         Request_register *reg_l = i++; 
53         reg_l->pre_move_processing();
54     }
55 }
56
57 void
58 Register_group_register::process_requests()
59 {
60     iter_top(reg_list_, i);
61     while (i.ok()) {
62         // this construction to ensure clean deletion
63         Request_register *reg_l = i++; 
64         reg_l->process_requests();
65     }
66 }
67
68 void
69 Register_group_register::post_move_processing()
70 {
71     iter_top(reg_list_, i);
72     while (i.ok()) {
73         // this construction to ensure clean deletion
74         Request_register *reg_l = i++; 
75         reg_l->post_move_processing();
76     }
77 }
78
79 void
80 Register_group_register::acknowledge_element(Score_elem_info info)
81 {
82     Request_register* origin = info.origin_reg_l_arr_[0];
83     if (!contains_b(origin) && !origin->contains_b(this)) // am i sure?
84         return;
85     
86     for (iter_top(reg_list_, i); i.ok(); i++) 
87         i->acknowledge_element(info);
88 }
89
90 bool
91 Register_group_register::contains_b(Request_register* reg_l)const
92 {
93     bool parent_b = Request_register::contains_b(reg_l);
94     
95     if (parent_b)
96         return true;
97     for (iter_top(reg_list_, j); j.ok(); j++)
98         if (j->contains_b(reg_l))
99             return true;
100     return false;
101 }
102         
103
104
105 bool
106 Register_group_register::try_request(Request*req_l)
107 {
108     iter_top(reg_list_, i); 
109     while (i.ok()) {
110
111
112         // this construction to ensure clean deletion
113         Request_register *reg_l = i++; 
114         if (reg_l->try_request( req_l ))
115             return true;
116     }
117     return false;
118 }
119 void
120 Register_group_register::add(Array<Request_register*> p_arr)
121 {
122     for (int i =0; i<p_arr.size(); i++)
123         add(p_arr[i]);
124 }
125
126 void
127 Register_group_register::add(Request_register *reg_p)
128 {
129     reg_list_.bottom().add(reg_p);
130     reg_p->daddy_reg_l_ = this;
131 }
132
133
134 Register_group_register::~Register_group_register()
135 {
136     
137 }
138
139 Request_register *
140 Register_group_register::get_register_p(Request_register*reg_l)
141 {
142     iterator(reg_list_) reg_cur= reg_list_.find(reg_l);
143     assert(reg_cur.ok());
144     return reg_cur.remove_p();
145 }
146
147 void
148 Register_group_register::terminate_register(Request_register*r_l)
149 {
150     delete get_register_p(r_l);
151 }
152
153 IMPLEMENT_STATIC_NAME(Register_group_register);
154 ADD_THIS_REGISTER(Register_group_register);
155
156 void
157 Register_group_register::do_print()const
158 {
159 #ifndef NPRINT
160     for (iter_top(reg_list_, i); i.ok(); i++) 
161         i->print();
162 #endif
163 }