]> git.donarmstrong.com Git - lilypond.git/blob - lily/register-group.cc
release: 0.0.51
[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(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     Request_register* origin = info.origin_reg_l_arr_[0];
61     if (!contains_b(origin) && !origin->contains_b(this)) // am i sure?
62         return;
63     
64     for (iter_top(reg_list_, i); i.ok(); i++) 
65         i->acknowledge_element(info);
66 }
67
68 bool
69 Register_group_register::contains_b(Request_register* reg_l)const
70 {
71     bool parent_b = Request_register::contains_b(reg_l);
72     
73     if (parent_b)
74         return true;
75     for (iter_top(reg_list_, j); j.ok(); j++)
76         if (j->contains_b(reg_l))
77             return true;
78     return false;
79 }
80         
81
82
83 bool
84 Register_group_register::try_request(Request*req_l)
85 {
86     iter_top(reg_list_, i); 
87     while (i.ok()) {
88
89
90         // this construction to ensure clean deletion
91         Request_register *reg_l = i++; 
92         if (reg_l->try_request( req_l ))
93             return true;
94     }
95     return false;
96 }
97 void
98 Register_group_register::add(Array<Request_register*> p_arr)
99 {
100     for (int i =0; i<p_arr.size(); i++)
101         add(p_arr[i]);
102 }
103
104 void
105 Register_group_register::add(Request_register *reg_p)
106 {
107     reg_list_.bottom().add(reg_p);
108     reg_p->daddy_reg_l_ = this;
109 }
110
111
112 Register_group_register::~Register_group_register()
113 {
114     
115 }
116
117 Request_register *
118 Register_group_register::get_register_p(Request_register*reg_l)
119 {
120     iterator(reg_list_) reg_cur= reg_list_.find(reg_l);
121     assert(reg_cur.ok());
122     return reg_cur.remove_p();
123 }
124
125 void
126 Register_group_register::terminate_register(Request_register*r_l)
127 {
128     delete get_register_p(r_l);
129 }
130
131 IMPLEMENT_STATIC_NAME(Register_group_register);
132 ADD_THIS_REGISTER(Register_group_register);
133
134 void
135 Register_group_register::do_print()const
136 {
137 #ifndef NPRINT
138     for (iter_top(reg_list_, i); i.ok(); i++) 
139         i->print();
140 #endif
141 }