]> git.donarmstrong.com Git - lilypond.git/blob - lily/register-group.cc
0725d6c16b8b7dbd850875e11bb64e8b80e7a029
[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)
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(Features d)
26 {
27     for (iter_top(reg_list_, i); i.ok(); i++) {
28         i->set_feature(d);
29     }
30 }
31
32 void
33 Register_group_register::pre_move_processing()
34 {
35     for (iter_top(reg_list_, i); i.ok(); i++) 
36         i->pre_move_processing();
37 }
38
39 void
40 Register_group_register::process_requests()
41 {
42     for (iter_top(reg_list_, i); i.ok(); i++) 
43         i->process_requests();
44 }
45
46 void
47 Register_group_register::post_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->post_move_processing();
54     }
55 }
56
57 void
58 Register_group_register::acknowledge_element(Staff_elem_info info)
59 {
60     if (!contains_b(info.origin_reg_l_arr_[0]))
61         return;
62     
63     for (iter_top(reg_list_, i); i.ok(); i++) 
64         i->acknowledge_element(info);
65 }
66
67 bool
68 Register_group_register::contains_b(Request_register* reg_l)
69 {
70     bool parent_b = Request_register::contains_b(reg_l);
71     
72     if (parent_b)
73         return true;
74     for (iter_top(reg_list_, j); j.ok(); j++)
75         if (j->contains_b(reg_l))
76             return true;
77     return false;
78 }
79         
80
81
82 bool
83 Register_group_register::try_request(Request*req_l)
84 {
85     iter_top(reg_list_, i); 
86     while (i.ok()) {
87
88
89         // this construction to ensure clean deletion
90         Request_register *reg_l = i++; 
91         if (reg_l->try_request( req_l ))
92             return true;
93     }
94     return false;
95 }
96
97 void
98 Register_group_register::add(Request_register *reg_p)
99 {
100     reg_list_.bottom().add(reg_p);
101     reg_p->daddy_reg_l_ = this;
102 }
103
104
105 Register_group_register::~Register_group_register()
106 {
107     
108 }
109
110 Request_register *
111 Register_group_register::get_register_p(Request_register*reg_l)
112 {
113     iterator(reg_list_) reg_cur= reg_list_.find(reg_l);
114     assert(reg_cur.ok());
115     return reg_cur.remove_p();
116 }
117
118 void
119 Register_group_register::terminate_register(Request_register*r_l)
120 {
121     delete get_register_p(r_l);
122 }
123
124 IMPLEMENT_STATIC_NAME(Register_group_register);
125
126 void
127 Register_group_register::do_print()const
128 {
129 #ifndef NPRINT
130     for (iter_top(reg_list_, i); i.ok(); i++) 
131         i->print();
132 #endif
133 }