From: fred Date: Thu, 23 Jan 1997 00:28:25 +0000 (+0000) Subject: lilypond-0.0.24 X-Git-Tag: release/1.5.59~6390 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c66042427e4025ba2efebcdb28fda4c2e81fcc1b;p=lilypond.git lilypond-0.0.24 --- diff --git a/hdr/staffwalker.hh b/hdr/staffwalker.hh new file mode 100644 index 0000000000..d9945229f2 --- /dev/null +++ b/hdr/staffwalker.hh @@ -0,0 +1,47 @@ + +/* + staffwalker.hh -- part of LilyPond + + (c) 1996,97 Han-Wen Nienhuys +*/ + +#ifndef STAFFWALKER_HH +#define STAFFWALKER_HH + +#include "staff.hh" + +struct Staff_walker : public PCursor { + Staff * staff_; + PScore * pscore_; + + int break_status; + + /****************/ + + int priority() const; // Command + Moment when() const; + virtual ~Staff_walker(); + Staff_walker(Staff*, PScore*); + void process() ; + void process_command(Command *); + void operator++(int); + + /**************** + VIRTUAL + ****************/ + + /// every time ++ is called + virtual void reset(){} + virtual void process_requests()=0; + virtual void do_TYPESET_command(Command*)=0; + virtual void do_INTERPRET_command(Command*)=0 ; +private: + Staff_walker(Staff_walker const&); +}; +/** + manage run-time info when walking staffcolumns such as: key, + meter, pending beams & slurs + */ + +#endif // STAFFWALKER_HH + diff --git a/src/staffwalker.cc b/src/staffwalker.cc new file mode 100644 index 0000000000..5967242dbb --- /dev/null +++ b/src/staffwalker.cc @@ -0,0 +1,69 @@ +#include "request.hh" +#include "staffwalker.hh" +#include "stcol.hh" +#include "sccol.hh" + +Staff_walker::~Staff_walker() {} +Staff_walker::Staff_walker(Staff_walker const &s) + :PCursor (s) +{ + assert(false); +} + +Staff_walker::Staff_walker(Staff * s, PScore*ps ) + : PCursor (s->cols) +{ + staff_ = s; + pscore_ = ps; + break_status = BREAK_END - BREAK_PRE; +} + +Moment +Staff_walker::when() const +{ + return (* (PCursor *) this)->when(); +} + +void +Staff_walker::process() +{ + break_status = BREAK_END - BREAK_PRE; + if (ptr()->staff_commands_p_) + for (iter_top(*ptr()->staff_commands_p_,i); i.ok(); i++) { + process_command(i); + } + + process_requests(); +} + + +void +Staff_walker::process_command(Command*com) +{ + switch (com->code){ + case BREAK_PRE: + case BREAK_MIDDLE: + case BREAK_POST: + case BREAK_END: + (*this)->score_column_l_->set_breakable(); + break_status = com->code- BREAK_PRE; + break; + case INTERPRET: + do_INTERPRET_command(com); + break; + + case TYPESET: + do_TYPESET_command(com); + break; + + default : + break; + } +} + +void +Staff_walker::operator++(int i) +{ + PCursor::operator++(i); + reset(); +}