MicroModelicaCCompiler  4.5.3
writer.hpp
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  This file is part of QSS Solver.
4 
5  QSS Solver is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  QSS Solver is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QSS Solver. If not, see <http://www.gnu.org/licenses/>.
17 
18  ******************************************************************************/
19 
20 #ifndef MMO_WRITER_H_
21 #define MMO_WRITER_H_
22 
23 #include <boost/variant/variant.hpp>
24 #include <fstream>
25 #include <list>
26 #include <string>
27 
28 #include "../util/util.hpp"
29 
30 namespace MicroModelica {
31 namespace Generator {
32 
33 #define SECTIONS 35
34 namespace WRITER {
35 typedef enum {
36  Prologue,
37  Epilogue,
38  Alloc_Data,
39  Init_Data,
41  Include,
43  Init_Code,
44  Input,
45  Model,
48  Model_Deps,
51  Model_Bdf,
55  ZC_Simple,
56  ZC_Generic,
63  Jacobian,
64  Output,
72 
74 } // namespace WRITER
75 
76 class Writer {
77  public:
78  virtual ~Writer(){};
79  virtual void setFile(std::string fname) = 0;
80  virtual void clearFile() = 0;
81 
82  template <class W>
83  void write(W out, WRITER::Section section, bool clean = true, WRITER::Insert it = WRITER::Prepend)
84  {
85  std::stringstream buffer;
86  buffer << out;
87  write(buffer, section, clean, it);
88  }
89 
90  virtual void write(std::string str, WRITER::Section section, WRITER::Insert it = WRITER::Prepend) = 0;
91  virtual void write(std::stringstream &s, WRITER::Section section, bool clean = true, WRITER::Insert it = WRITER::Prepend) = 0;
92  virtual void removeFromSection(std::string str, WRITER::Section section) = 0;
93  virtual void writeBlock(std::list<std::string> block, WRITER::Section section) = 0;
94  virtual void print(WRITER::Section section) = 0;
95  virtual void print(std::stringstream &s) = 0;
96  virtual void print(std::string s) = 0;
97  virtual bool isEmpty(WRITER::Section section) = 0;
98  virtual void printBlock(std::list<std::string> block) = 0;
99  virtual void setIndent(int n) = 0;
100  virtual std::string indent() = 0;
101  virtual std::string indent(int n) = 0;
102  virtual void beginBlock() = 0;
103  virtual void beginBlock(WRITER::Section s) = 0;
104  virtual void endBlock() = 0;
105  virtual void endBlock(WRITER::Section s) = 0;
106  virtual std::string block() = 0;
107  virtual void clear(WRITER::Section section) = 0;
108  virtual void newLine(WRITER::Section section) = 0;
109  virtual void write(Util::SymbolTable symbols, WRITER::Section s) = 0;
110 };
111 
112 typedef std::shared_ptr<Writer> WriterPtr;
113 
114 class MemoryWriter : public Writer {
115  public:
116  MemoryWriter();
118  void setFile(std::string fname);
119  void clearFile();
120  void write(std::string str, WRITER::Section section, WRITER::Insert it = WRITER::Prepend);
121  void write(std::stringstream &s, WRITER::Section section, bool clean = true, WRITER::Insert it = WRITER::Prepend);
122  void removeFromSection(std::string str, WRITER::Section section);
123  void writeBlock(std::list<std::string> block, WRITER::Section section);
124  void print(WRITER::Section section);
125  void print(std::stringstream &s);
126  void print(std::string s);
127  bool isEmpty(WRITER::Section section);
128  void printBlock(std::list<std::string> block);
129  void setIndent(int n);
130  std::string indent();
131  std::string indent(int n);
132  void beginBlock();
133  void beginBlock(WRITER::Section s);
134  void endBlock();
135  void endBlock(WRITER::Section s);
136  std::string block();
137  void newLine(WRITER::Section section);
138  void clear(WRITER::Section section);
139  void write(Util::SymbolTable symbols, WRITER::Section s);
140 
141  private:
142  std::list<std::string> _sections[SECTIONS];
143  std::ofstream _file;
144  std::string _indentStr;
145  std::string _block;
146  int _indent;
147  int _blockIndent;
148  std::list<std::string>::iterator _removeIt;
149 };
150 
151 class FileWriter : public Writer {
152  public:
153  FileWriter();
154  ~FileWriter();
155  void setFile(std::string fname);
156  void clearFile();
157  void write(std::string str, WRITER::Section section, WRITER::Insert it = WRITER::Prepend);
158  void write(std::stringstream &s, WRITER::Section section, bool clean = true, WRITER::Insert it = WRITER::Prepend);
159  void removeFromSection(std::string str, WRITER::Section section);
160  void writeBlock(std::list<std::string> block, WRITER::Section section);
161  void print(WRITER::Section section);
162  void print(std::stringstream &s);
163  void print(std::string s);
164  bool isEmpty(WRITER::Section section);
165  void printBlock(std::list<std::string> block);
166  void setIndent(int n);
167  std::string indent();
168  std::string indent(int n);
169  void beginBlock();
170  void beginBlock(WRITER::Section s);
171  void endBlock();
172  void endBlock(WRITER::Section s);
173  std::string block();
174  void newLine(WRITER::Section section);
175  void clear(WRITER::Section section);
177 
178  private:
179  std::ofstream _sections[SECTIONS];
180  std::ofstream _file;
181  std::string _indentStr;
182  std::string _block;
183  int _indent;
184  int _blockIndent;
185 };
186 
187 typedef boost::variant<MemoryWriter, FileWriter> WriterType;
188 } // namespace Generator
189 } // namespace MicroModelica
190 
191 #endif /* MMO_WRITER_H_ */
MicroModelica::Generator::FileWriter::newLine
void newLine(WRITER::Section section)
Definition: writer.cpp:245
MicroModelica::Generator::Writer::print
virtual void print(WRITER::Section section)=0
ModelTable< std::string, std::string >
MicroModelica::Generator::MemoryWriter::_indent
int _indent
Definition: writer.hpp:180
MicroModelica::Generator::MemoryWriter
Definition: writer.hpp:148
MicroModelica::Generator::MemoryWriter::setIndent
void setIndent(int n)
Definition: writer.cpp:161
MicroModelica::Generator::FileWriter::_file
std::ofstream _file
Definition: writer.hpp:214
MicroModelica::Generator::Writer::printBlock
virtual void printBlock(std::list< std::string > block)=0
MicroModelica::Generator::WRITER::ZC_Generic
@ ZC_Generic
Definition: writer.hpp:90
MicroModelica::Generator::WRITER::Model
@ Model
Definition: writer.hpp:79
MicroModelica::Generator::WRITER::Handler_Neg
@ Handler_Neg
Definition: writer.hpp:94
MicroModelica::Generator::WRITER::Jacobian
@ Jacobian
Definition: writer.hpp:97
MicroModelica::Generator::MemoryWriter::isEmpty
bool isEmpty(WRITER::Section section)
Definition: writer.cpp:151
MicroModelica::Generator::MemoryWriter::_block
std::string _block
Definition: writer.hpp:179
MicroModelica::Generator::FileWriter::_indent
int _indent
Definition: writer.hpp:217
MicroModelica::Generator::MemoryWriter::block
std::string block()
Definition: writer.cpp:206
MicroModelica::Generator::FileWriter::clear
void clear(WRITER::Section section)
Definition: writer.cpp:239
MicroModelica::Generator::MemoryWriter::write
void write(std::string str, WRITER::Section section, WRITER::Insert it=WRITER::Prepend)
MicroModelica::Generator::WRITER::Model_Header
@ Model_Header
Definition: writer.hpp:103
MicroModelica::Generator::WRITER::Handler_Neg_Simple
@ Handler_Neg_Simple
Definition: writer.hpp:95
MicroModelica::Generator::FileWriter::~FileWriter
~FileWriter()
Definition: writer.cpp:227
MicroModelica::Generator::Writer::endBlock
virtual void endBlock()=0
MicroModelica::Generator::MemoryWriter::removeFromSection
void removeFromSection(std::string str, WRITER::Section section)
Definition: writer.cpp:65
MicroModelica::Generator::FileWriter::block
std::string block()
Definition: writer.cpp:314
MicroModelica::Generator::WRITER::Alloc_Data
@ Alloc_Data
Definition: writer.hpp:72
MicroModelica::Generator::WRITER::Model_Deps_Generic
@ Model_Deps_Generic
Definition: writer.hpp:84
MicroModelica::Generator::FileWriter::indent
std::string indent()
Definition: writer.cpp:295
MicroModelica::Generator::MemoryWriter::_indentStr
std::string _indentStr
Definition: writer.hpp:178
MicroModelica::Generator::FileWriter::setIndent
void setIndent(int n)
Definition: writer.cpp:285
MicroModelica::Generator::Writer::setIndent
virtual void setIndent(int n)=0
MicroModelica::Generator::WRITER::Handler_Pos
@ Handler_Pos
Definition: writer.hpp:91
MicroModelica::Generator::Writer::setFile
virtual void setFile(std::string fname)=0
MicroModelica::Generator::WRITER::Model_Bdf_Generic
@ Model_Bdf_Generic
Definition: writer.hpp:87
MicroModelica::Generator::Writer::clear
virtual void clear(WRITER::Section section)=0
MicroModelica::Generator::Writer::isEmpty
virtual bool isEmpty(WRITER::Section section)=0
MicroModelica::Generator::Writer::writeBlock
virtual void writeBlock(std::list< std::string > block, WRITER::Section section)=0
MicroModelica::Generator::WRITER::Append_Simple
@ Append_Simple
Definition: writer.hpp:107
MicroModelica::Generator::FileWriter::beginBlock
void beginBlock()
Definition: writer.cpp:306
MicroModelica::Generator::WRITER::Handler_Pos_Generic
@ Handler_Pos_Generic
Definition: writer.hpp:93
MicroModelica::Generator::Writer::~Writer
virtual ~Writer()
Definition: writer.hpp:112
MicroModelica::Generator::FileWriter
Definition: writer.hpp:185
MicroModelica::Generator::WRITER::Empty
@ Empty
Definition: writer.hpp:104
MicroModelica::Generator::MemoryWriter::~MemoryWriter
~MemoryWriter()
Definition: writer.cpp:90
MicroModelica::Generator::MemoryWriter::MemoryWriter
MemoryWriter()
Definition: writer.cpp:50
MicroModelica::Generator::MemoryWriter::_file
std::ofstream _file
Definition: writer.hpp:177
MicroModelica::Generator::MemoryWriter::indent
std::string indent()
Definition: writer.cpp:171
MicroModelica::Generator::WRITER::Prepend
@ Prepend
Definition: writer.hpp:107
MicroModelica::Generator::Writer
Definition: writer.hpp:110
MicroModelica::Generator::FileWriter::write
void write(std::string str, WRITER::Section section, WRITER::Insert it=WRITER::Prepend)
MicroModelica::Generator::Writer::removeFromSection
virtual void removeFromSection(std::string str, WRITER::Section section)=0
MicroModelica::Generator::WRITER::Model_Simple
@ Model_Simple
Definition: writer.hpp:80
MicroModelica::Generator::WriterType
boost::variant< MemoryWriter, FileWriter > WriterType
Definition: writer.hpp:221
MicroModelica::Generator::MemoryWriter::print
void print(WRITER::Section section)
Definition: writer.cpp:131
MicroModelica::Generator::WRITER::Output_Generic
@ Output_Generic
Definition: writer.hpp:100
MicroModelica::Generator::FileWriter::_indentStr
std::string _indentStr
Definition: writer.hpp:215
MicroModelica::Generator::MemoryWriter::_blockIndent
int _blockIndent
Definition: writer.hpp:181
MicroModelica::Generator::WRITER::Alloc_Output
@ Alloc_Output
Definition: writer.hpp:74
MicroModelica::Generator::FileWriter::FileWriter
FileWriter()
Definition: writer.cpp:218
MicroModelica::Generator::MemoryWriter::_sections
std::list< std::string > _sections[SECTIONS]
Definition: writer.hpp:176
MicroModelica::Generator::FileWriter::removeFromSection
void removeFromSection(std::string str, WRITER::Section section)
Definition: writer.cpp:237
MicroModelica::Generator::WRITER::Append_Generic
@ Append_Generic
Definition: writer.hpp:107
MicroModelica::Generator::FileWriter::clearFile
void clearFile()
Definition: writer.cpp:243
SECTIONS
#define SECTIONS
Definition: writer.hpp:67
MicroModelica::Generator::MemoryWriter::endBlock
void endBlock()
Definition: writer.cpp:200
MicroModelica::Generator::WRITER::ZC_Simple
@ ZC_Simple
Definition: writer.hpp:89
MicroModelica::Generator::FileWriter::_blockIndent
int _blockIndent
Definition: writer.hpp:218
MicroModelica::Generator::WRITER::Output
@ Output
Definition: writer.hpp:98
MicroModelica::Generator::WRITER::Handler_Neg_Generic
@ Handler_Neg_Generic
Definition: writer.hpp:96
MicroModelica::Generator::Writer::block
virtual std::string block()=0
MicroModelica::Generator::WRITER::Handler_Pos_Simple
@ Handler_Pos_Simple
Definition: writer.hpp:92
MicroModelica::Generator::WRITER::Function_Code
@ Function_Code
Definition: writer.hpp:102
MicroModelica::Generator::WRITER::Model_Deps
@ Model_Deps
Definition: writer.hpp:82
MicroModelica::Generator::FileWriter::isEmpty
bool isEmpty(WRITER::Section section)
Definition: writer.cpp:275
MicroModelica::Generator::Writer::beginBlock
virtual void beginBlock()=0
MicroModelica::Generator::FileWriter::print
void print(WRITER::Section section)
Definition: writer.cpp:265
MicroModelica::Generator::MemoryWriter::newLine
void newLine(WRITER::Section section)
Definition: writer.cpp:92
MicroModelica::Generator::MemoryWriter::printBlock
void printBlock(std::list< std::string > block)
Definition: writer.cpp:153
MicroModelica::Generator::MemoryWriter::_removeIt
std::list< std::string >::iterator _removeIt
Definition: writer.hpp:182
MicroModelica::Generator::WRITER::Epilogue
@ Epilogue
Definition: writer.hpp:71
MicroModelica::Generator::WRITER::Function_Header
@ Function_Header
Definition: writer.hpp:101
MicroModelica::Generator::FileWriter::printBlock
void printBlock(std::list< std::string > block)
Definition: writer.cpp:277
MicroModelica::Generator::MemoryWriter::writeBlock
void writeBlock(std::list< std::string > block, WRITER::Section section)
Definition: writer.cpp:123
MicroModelica
Definition: files.cpp:45
MicroModelica::Generator::FileWriter::writeBlock
void writeBlock(std::list< std::string > block, WRITER::Section section)
Definition: writer.cpp:257
MicroModelica::Generator::WRITER::Output_Simple
@ Output_Simple
Definition: writer.hpp:99
MicroModelica::Generator::Writer::clearFile
virtual void clearFile()=0
MicroModelica::Generator::WRITER::Init_Output
@ Init_Output
Definition: writer.hpp:76
MicroModelica::Generator::WRITER::Include
@ Include
Definition: writer.hpp:75
MicroModelica::Generator::WRITER::Model_Bdf_Simple
@ Model_Bdf_Simple
Definition: writer.hpp:86
MicroModelica::Generator::WRITER::Insert
Insert
Definition: writer.hpp:107
MicroModelica::Generator::WRITER::Model_Deps_Simple
@ Model_Deps_Simple
Definition: writer.hpp:83
MicroModelica::Generator::MemoryWriter::clear
void clear(WRITER::Section section)
Definition: writer.cpp:86
MicroModelica::Generator::WRITER::Prologue
@ Prologue
Definition: writer.hpp:70
MicroModelica::Generator::Writer::write
void write(W out, WRITER::Section section, bool clean=true, WRITER::Insert it=WRITER::Prepend)
Definition: writer.hpp:117
MicroModelica::Generator::WRITER::Input
@ Input
Definition: writer.hpp:78
MicroModelica::Generator::WRITER::Model_Generic
@ Model_Generic
Definition: writer.hpp:81
MicroModelica::Generator::MemoryWriter::setFile
void setFile(std::string fname)
Definition: writer.cpp:57
MicroModelica::Generator::FileWriter::setFile
void setFile(std::string fname)
Definition: writer.cpp:241
MicroModelica::Generator::WRITER::Model_Bdf
@ Model_Bdf
Definition: writer.hpp:85
MicroModelica::Generator::FileWriter::endBlock
void endBlock()
Definition: writer.cpp:310
MicroModelica::Generator::WriterPtr
std::shared_ptr< Writer > WriterPtr
Definition: writer.hpp:146
MicroModelica::Generator::MemoryWriter::beginBlock
void beginBlock()
Definition: writer.cpp:182
MicroModelica::Generator::MemoryWriter::clearFile
void clearFile()
Definition: writer.cpp:88
MicroModelica::Generator::WRITER::Init_Code
@ Init_Code
Definition: writer.hpp:77
MicroModelica::Generator::Writer::newLine
virtual void newLine(WRITER::Section section)=0
MicroModelica::Generator::WRITER::Init_Data
@ Init_Data
Definition: writer.hpp:73
MicroModelica::Generator::FileWriter::_sections
std::ofstream _sections[SECTIONS]
Definition: writer.hpp:213
MicroModelica::Generator::WRITER::Zero_Crossing
@ Zero_Crossing
Definition: writer.hpp:88
MicroModelica::Generator::WRITER::Section
Section
Definition: writer.hpp:69
MicroModelica::Generator::Writer::indent
virtual std::string indent()=0
MicroModelica::Generator::FileWriter::_block
std::string _block
Definition: writer.hpp:216