]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.24
authorfred <fred>
Thu, 23 Jan 1997 00:28:25 +0000 (00:28 +0000)
committerfred <fred>
Thu, 23 Jan 1997 00:28:25 +0000 (00:28 +0000)
hdr/staffwalker.hh [new file with mode: 0644]
src/staffwalker.cc [new file with mode: 0644]

diff --git a/hdr/staffwalker.hh b/hdr/staffwalker.hh
new file mode 100644 (file)
index 0000000..d994522
--- /dev/null
@@ -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_column*> {
+    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 (file)
index 0000000..5967242
--- /dev/null
@@ -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<Staff_column*> (s)
+{
+    assert(false);
+}
+
+Staff_walker::Staff_walker(Staff * s, PScore*ps )
+    : PCursor<Staff_column*> (s->cols)
+{
+    staff_ = s;
+    pscore_ = ps;
+    break_status = BREAK_END - BREAK_PRE;
+}
+
+Moment
+Staff_walker::when() const
+{
+    return (* (PCursor<Staff_column*> *) 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<Staff_column*>::operator++(i);
+    reset();
+}