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