X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=hdr%2Fregister.hh;h=95dfe1e67b8e48afc64436a0ab6a6d1a3eb728f5;hb=e4a632f6bbdb0a331baadf64a5b97f24e2a2a338;hp=e2b5167d8d0d405f70967708fc86bf5213606ff4;hpb=4400e6a334eec3cb014f05d9dc9e098907291bfd;p=lilypond.git diff --git a/hdr/register.hh b/hdr/register.hh index e2b5167d8d..95dfe1e67b 100644 --- a/hdr/register.hh +++ b/hdr/register.hh @@ -6,148 +6,90 @@ #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 -struct Request_register { +/** + a struct which processes requests, and creates the #Staff_elem#s. + Hungarian postfix: reg + */ +class Request_register { + /** + Warning: you can't copy a #Request_register# + */ + Request_register(Request_register const &); +public: Complex_walker * walk_l_; Array accepted_req_arr_; - /****************/ - Request_register(Complex_walker*); Request_register(); virtual ~Request_register(){} - /// take note of item/spaanner - virtual void acknowledge_element(Staff_elem_info){} /** + take note of item/spanner put item in spanner. Adjust local key; etc. + + Default: ignore the info */ - - /// - virtual bool try_request(Request *req_l) =0; + virtual void acknowledge_element(Staff_elem_info){} + /** try to fit the request in this register - RETURN - false: request noted, but not taken. + @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); + /// make items/spanners with the requests you got - virtual void process_request()=0; + virtual void process_request(){} - /// typeset any spanners. Empty accepted_req_arr_ + /// 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() - virtual void do_pre_move_process(){} - virtual void do_post_move_process(){} -}; -/** - a struct which processes requests, and creates the Staff_elems - */ + /// utility + Paperdef * paper() const; -struct Notehead_register : Request_register { - Item* note_p_; - /****************/ - Notehead_register(Complex_walker*); - virtual bool try_request(Request *req_l) ; - virtual void process_request(); - virtual void do_pre_move_process(); -}; - -struct Slur_register : Request_register { - Array requests_arr_; - Array slur_l_stack_; - Array end_slur_l_arr_; - - /****************/ - ~Slur_register(); - Slur_register(Complex_walker*); - virtual bool try_request(Request*); - virtual void process_request(); - virtual void acknowledge_element(Staff_elem_info); - virtual void do_pre_move_process(); -}; -struct Stem_beam_register : Request_register { - Stem * stem_p_; - Beam * beam_p_; - Beam_req * beam_req_l_; - Stem_req * stem_req_l_; - Beam_req * start_req_l_; - bool end_beam_b_; - Rhythmic_grouping *current_grouping; - int default_dir_i_; - - /****************/ - Stem_beam_register(Complex_walker*); - ~Stem_beam_register(); - void set_dir(int dir_i_); - virtual bool try_request(Request*); - virtual void process_request(); - virtual void acknowledge_element(Staff_elem_info); - virtual void do_pre_move_process(); - virtual void do_post_move_process(); -}; - -struct Script_register : Request_register { - Script * script_p_; - - /****************/ - void set_dir(int dir_i_); - Script_register(Complex_walker*); - virtual bool try_request(Request*); - virtual void process_request(); - virtual void acknowledge_element(Staff_elem_info); - virtual void do_pre_move_process(); -}; + /** + invoke walker method to typeset element + */ + void typeset_element(Staff_elem*elem_p); -struct Text_register : Request_register{ - Text_item * text_p_; - /****************/ - void set_dir(int dir_i_); - Text_register(Complex_walker*); - virtual bool try_request(Request*); - virtual void process_request(); - virtual void do_pre_move_process(); + /** + 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); }; -struct Local_key_register : Request_register { - Local_key_item* key_item_p_; - - /****************/ - - virtual bool try_request(Request*); - virtual void process_request(); - virtual void acknowledge_element(Staff_elem_info); - virtual void do_pre_move_process(); - Local_key_register(Complex_walker*); -}; - #endif // REGISTER_HH