1 /*
2   MusicXML Library
3   Copyright (C) Grame 2006-2013
4 
5   This Source Code Form is subject to the terms of the Mozilla Public
6   License, v. 2.0. If a copy of the MPL was not distributed with this
7   file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 
9   Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France
10   research@grame.fr
11 */
12 
13 #ifndef ___msrElements___
14 #define ___msrElements___
15 
16 #include "typedefs.h"
17 #include "tree_browser.h"
18 #include "rational.h"
19 
20 
21 namespace MusicXML2
22 {
23 
24 //______________________________________________________________________________
25 class msrElement : public smartable
26 {
27   public:
28 
29     // creation from MusicXML
30     // ------------------------------------------------------
31 
32     // cloning
33     // ------------------------------------------------------
34 
35   protected:
36 
37     msrElement (
38       int inputLineNumber);
39 
40     virtual ~msrElement ();
41 
42   public:
43 
44     // set and get
45     // ------------------------------------------------------
46 
getInputLineNumber()47     int                   getInputLineNumber ()
48                               { return fInputLineNumber; }
49 
50     // services
51     // ------------------------------------------------------
52 
53   public:
54 
55     // visitors
56     // ------------------------------------------------------
57 
58     virtual void          acceptIn  (basevisitor* v);
59     virtual void          acceptOut (basevisitor* v);
60 
61     virtual void          browseData (basevisitor* v) = 0;
62 
63   public:
64 
65     // print
66     // ------------------------------------------------------
67 
68     virtual std::string   asShortString () const;
69     virtual std::string   asString () const;
70 
71     virtual void          print (ostream& os) const;
72 
73     virtual void          shortPrint (ostream& os) const;
74 
printSummary(ostream & os)75     virtual void          printSummary (ostream& os) {}
76 
77   protected:
78 
79     // fields
80     // ------------------------------------------------------
81 
82     int                   fInputLineNumber;
83 };
84 typedef SMARTP<msrElement> S_msrElement;
85 EXP ostream& operator<< (ostream& os, const S_msrElement& elt);
86 
87 //______________________________________________________________________________
88 template <typename T> class msrBrowser : public browser <T>
89 {
90   public:
91 
msrBrowser(basevisitor * v)92     msrBrowser (basevisitor* v) : fVisitor (v) {}
93 
~msrBrowser()94     virtual ~msrBrowser () {}
95 
96   public:
97 
set(basevisitor * v)98     virtual void set (basevisitor* v) { fVisitor = v; }
99 
browse(T & t)100     virtual void browse (T& t) {
101       enter (t);
102 
103       t.browseData (fVisitor);
104 
105       leave (t);
106     }
107 
108   protected:
109 
110     basevisitor*  fVisitor;
111 
enter(T & t)112     virtual void enter (T& t) { t.acceptIn  (fVisitor); }
leave(T & t)113     virtual void leave (T& t) { t.acceptOut (fVisitor); }
114 };
115 
116 
117 } // namespace MusicXML2
118 
119 
120 #endif
121