cymoca
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
model.h
Go to the documentation of this file.
1 #ifndef CYMOCA_AST_MODEL_MODEL_H_
2 #define CYMOCA_AST_MODEL_MODEL_H_
3 
4 #include "../node.h"
5 #include "../statement/statement.h"
6 
7 #include <unordered_map>
8 
9 namespace cymoca::ast::model {
10 
15 class ElementDict : public Base {
16  protected:
17  std::unordered_map<std::string, std::unique_ptr<element::Base>> m_map{};
18 
19  public:
21  template <class... Args>
22  explicit ElementDict(Args... args) {
23  int dummy[1 + sizeof...(Args)] = {
24  (m_map[args->getName()] = std::move(args), 0)...};
25  (void)dummy;
26  }
27 
28  void set(const std::string &name, std::unique_ptr<element::Base> element) {
29  m_map[name] = std::move(element);
30  }
31 
32  element::Base &get(const std::string &name) { return *m_map[name]; }
33 
34  std::unordered_map<std::string, std::unique_ptr<element::Base>> &getMap() {
35  return m_map;
36  }
37 
38  std::vector<INode *> getChildren() override {
39  std::vector<INode *> v;
40  for (auto &c : m_map) {
41  v.push_back(c.second.get());
42  }
43  return v;
44  }
45  std::unique_ptr<INode> clone() const override {
46  auto res = std::make_unique<ElementDict>();
47  for (auto &keval : m_map) {
48  res->m_map[keval.first] = keval.second->cloneAs<element::Base>();
49  }
50  return res;
51  }
52 };
53 
57 class Class : public Base {
58  protected:
59  std::unique_ptr<ElementDict> m_elements{};
60  std::unique_ptr<equation::List> m_equations{};
61  std::unique_ptr<statement::List> m_statements{};
62 
63  public:
65  Class(std::unique_ptr<ElementDict> elements,
66  std::unique_ptr<equation::List> equations)
67  : m_elements(std::move(elements)), m_equations(std::move(equations)) {}
68  ElementDict &getElements() { return *m_elements; }
69  equation::List &getEquations() { return *m_equations; }
70  statement::List &getStatements() { return *m_statements; }
71  std::vector<INode *> getChildren() override {
72  return {m_elements.get(), m_equations.get()};
73  }
74  std::unique_ptr<INode> clone() const override {
75  return std::make_unique<Class>(m_elements->cloneAs<ElementDict>(),
76  m_equations->cloneAs<equation::List>());
77  }
78 };
79 
80 } // namespace cymoca::ast::model
81 #endif
equation::List & getEquations()
Definition: model.h:69
std::unique_ptr< T > cloneAs()
Definition: node.h:50
std::vector< INode * > getChildren() override
Definition: model.h:71
ElementDict & getElements()
Definition: model.h:68
#define NODE_MACRO
Definition: node.h:15
void set(const std::string &name, std::unique_ptr< element::Base > element)
Definition: model.h:28
std::unordered_map< std::string, std::unique_ptr< element::Base > > m_map
Definition: model.h:17
std::unique_ptr< INode > clone() const override
Definition: model.h:74
std::unique_ptr< INode > clone() const override
Definition: model.h:45
Class(std::unique_ptr< ElementDict > elements, std::unique_ptr< equation::List > equations)
Definition: model.h:65
ElementDict(Args...args)
Definition: model.h:22
std::vector< INode * > getChildren() override
Definition: model.h:38
std::unordered_map< std::string, std::unique_ptr< element::Base > > & getMap()
Definition: model.h:34
statement::List & getStatements()
Definition: model.h:70