#ifndef REGISTER_HH
#define REGISTER_HH
+
#include "proto.hh"
#include "varray.hh"
#include "request.hh"
+#include "staffeleminfo.hh"
-/// data container.
-struct Staff_elem_info {
- Staff_elem * elem_p_;
- Request*req_l_;
- const Voice * voice_l_;
- Voice_group_registers * group_regs_l_;
- Request_register * origin_reg_l_;
-
- /* *** */
- Staff_elem_info(Staff_elem*, Request*, Request_register*);
- Staff_elem_info();
-};
-/// Hungarian postfix: reg
/**
- a struct which processes requests, and creates the Staff_elems
+ a struct which processes requests, and creates the #Staff_elem#s.
+ Hungarian postfix: reg
*/
-struct Request_register {
- Complex_walker * walk_l_;
- Array<Request*> accepted_req_arr_;
-
- /* *************** */
+class Request_register {
/**
- Warning: you can't copy a Request_register
+ Warning: you can't copy a #Request_register#
*/
Request_register(Request_register const &);
+public:
+ Complex_walker * walk_l_;
+ Array<Request*> accepted_req_arr_;
+
Request_register(Complex_walker*);
Request_register();
virtual ~Request_register(){}
- /** take note of item/spaanner
- put item in spanner. Adjust local key; etc.
- */
- virtual void acknowledge_element(Staff_elem_info){}
/**
- Announce element to walker
- */
- void announce_element(Staff_elem_info);
+ take note of item/spanner
+ put item in spanner. Adjust local key; etc.
- /**
- invoke walker method to typeset element
+ Default: ignore the info
*/
- void typeset_element(Staff_elem*elem_p);
-
+ virtual void acknowledge_element(Staff_elem_info){}
+
/**
try to fit the request in this register
@return
false: not noted, not taken.
- true: request swallowed. Don't try to put elsewhere
+ true: request swallowed. Don't try to put the request elsewhere.
(may be we could use C++ exceptions.. :-)
+
+ #Request_register::try_request# always returns false
*/
- virtual bool try_request(Request *req_l) =0;
+ virtual bool try_request(Request *req_l);
/// make items/spanners with the requests you got
- virtual void process_request()=0;
- Paperdef * paper() const;
- /// typeset any spanners. Empty accepted_req_arr_
+ virtual void process_request(){}
+
+ /// typeset any spanners. Empty #accepted_req_arr_#
void pre_move_processing();
+ /// reset any appropriate data.
void post_move_processing();
+ virtual bool acceptable_request_b(Request*) const;
virtual void set_dir(int){}
protected:
- /// virtual, called by pre_move_process()
+ /// utility
+ Paperdef * paper() const;
+
+
+ /**
+ invoke walker method to typeset element
+ */
+ void typeset_element(Staff_elem*elem_p);
+
+
+ /**
+ typeset a "command" item.
+ If the column is not breakable, #pre_p# and #post_p# are junked
+ */
+ void typeset_breakable_item(Item * pre_p , Item * nobreak_p, Item * post_p);
+ /** virtual, called by #pre_move_processing()#
+ #Request_register::do_pre_move_process()# defaults to NOP
+ */
virtual void do_pre_move_process(){}
+ /** virtual, called by #post_move_processing#,
+ #Request_register::do_post_move_process()# defaults to NOP */
virtual void do_post_move_process(){}
+ /**
+ Announce element to walker. Utility
+ */
+ void announce_element(Staff_elem_info);
};