A toolkit for working with phylogenetic data.
v0.24.0
xml/document.hpp
Go to the documentation of this file.
1 #ifndef GENESIS_UTILS_FORMATS_XML_DOCUMENT_H_
2 #define GENESIS_UTILS_FORMATS_XML_DOCUMENT_H_
3 
4 /*
5  Genesis - A toolkit for working with phylogenetic data.
6  Copyright (C) 2014-2020 Lucas Czech and HITS gGmbH
7 
8  This program is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program. If not, see <http://www.gnu.org/licenses/>.
20 
21  Contact:
22  Lucas Czech <lucas.czech@h-its.org>
23  Exelixis Lab, Heidelberg Institute for Theoretical Studies
24  Schloss-Wolfsbrunnenweg 35, D-69118 Heidelberg, Germany
25 */
26 
34 #include <memory>
35 #include <string>
36 #include <unordered_map>
37 #include <vector>
38 
40 
41 namespace genesis {
42 namespace utils {
43 
44 // =================================================================================================
45 // Xml Value
46 // =================================================================================================
47 
51 class XmlValue
52 {
53 public:
54  enum Type {
58  };
59 
60  inline static std::string type_to_string (const Type t)
61  {
62  switch (t) {
63  case kComment : return "Comment";
64  case kMarkup : return "Markup";
65  case kElement : return "Element";
66  default : return "Unknown";
67  }
68  }
69 
70  inline std::string type_to_string () const
71  {
72  return type_to_string(type_);
73  }
74 
75  inline Type type() const
76  {
77  return type_;
78  }
79 
80  inline bool is_comment()
81  {
82  return type_ == kComment;
83  }
84 
85  inline bool is_markup()
86  {
87  return type_ == kMarkup;
88  }
89 
90  inline bool is_element()
91  {
92  return type_ == kElement;
93  }
94 
95  virtual ~XmlValue() {}
96 
97 protected:
104  XmlValue (const Type type) : type_(type) {}
105 
107  const Type type_;
108 };
109 
110 // =================================================================================================
111 // Xml Comment
112 // =================================================================================================
113 
117 class XmlComment : public XmlValue
118 {
119 public:
121  XmlComment(const std::string& comment) : XmlValue(kComment), content(comment) {}
122 
123  std::string content;
124 };
125 
126 // =================================================================================================
127 // Xml Markup
128 // =================================================================================================
129 
133 class XmlMarkup : public XmlValue
134 {
135 public:
137  XmlMarkup(const std::string& content) : XmlValue(kMarkup), content(content) {}
138 
139  std::string content;
140 };
141 
142 // =================================================================================================
143 // Xml Element
144 // =================================================================================================
145 
149 class XmlElement : public XmlValue
150 {
151 public:
152  typedef std::unordered_map<std::string, std::string> StringMapType;
153 
154  // -------------------------------------------------------------
155  // Constructors and Rule of Five
156  // -------------------------------------------------------------
157 
159  XmlElement(const std::string& tag) : XmlValue(kElement), tag(tag) {}
160 
161  XmlElement( XmlElement const& ) = delete;
162  XmlElement( XmlElement&& ) = delete;
163 
164  XmlElement& operator= ( XmlElement const& ) = delete;
165  XmlElement& operator= ( XmlElement&& ) = delete;
166 
167  virtual ~XmlElement() override
168  {
169  clear();
170  }
171 
172  // -------------------------------------------------------------
173  // Content Functions
174  // -------------------------------------------------------------
175 
176  inline void clear()
177  {
178  tag = "";
179  attributes.clear();
180  content.clear();
181  }
182 
183  inline XmlComment* append_comment (const std::string& comment)
184  {
185  auto elm = utils::make_unique<XmlComment>(comment);
186  auto ptr = elm.get();
187  content.push_back(std::move(elm));
188  return ptr;
189  }
190 
191  inline XmlMarkup* append_markup (const std::string& text)
192  {
193  auto elm = utils::make_unique<XmlMarkup>(text);
194  auto ptr = elm.get();
195  content.push_back(std::move(elm));
196  return ptr;
197  }
198 
199  inline XmlElement* append_element (const std::string& tag_value)
200  {
201  auto elm = utils::make_unique<XmlElement>(tag_value);
202  auto ptr = elm.get();
203  content.push_back(std::move(elm));
204  return ptr;
205  }
206 
207  std::string tag;
208  StringMapType attributes;
209  std::vector<std::unique_ptr<XmlValue>> content;
210 };
211 
212 // =================================================================================================
213 // Xml Document
214 // =================================================================================================
215 
219 class XmlDocument : public XmlElement
220 {
221 public:
222  virtual ~XmlDocument() override
223  {
224  clear();
225  }
226 
227  inline void clear()
228  {
230  xml_tag = "";
231  declarations.clear();
232  }
233 
234  std::string xml_tag;
236 };
237 
238 // =================================================================================================
239 // Converter Functions
240 // =================================================================================================
241 
242 const XmlComment* xml_value_to_comment (const XmlValue* v);
243 const XmlMarkup* xml_value_to_markup (const XmlValue* v);
244 const XmlElement* xml_value_to_element (const XmlValue* v);
245 
246 } // namespace utils
247 } // namespace genesis
248 
249 #endif // include guard
std::string type_to_string() const
virtual ~XmlElement() override
const Type type_
Stores the type of an object. Set by the constructor.
virtual ~XmlDocument() override
const XmlComment * xml_value_to_comment(const XmlValue *v)
Converts a pointer to an XmlValue to XmlComment if appropriate.
XmlElement(const std::string &tag)
Container namespace for all symbols of genesis in order to keep them separate when used as a library...
const XmlElement * xml_value_to_element(const XmlValue *v)
Converts a pointer to an XmlValue to XmlElement if appropriate.
Provides some valuable additions to STD.
XmlMarkup(const std::string &content)
XmlElement * append_element(const std::string &tag_value)
const XmlMarkup * xml_value_to_markup(const XmlValue *v)
Converts a pointer to an XmlValue to XmlMarkup if appropriate.
static std::string type_to_string(const Type t)
XmlComment * append_comment(const std::string &comment)
std::unordered_map< std::string, std::string > StringMapType
std::vector< std::unique_ptr< XmlValue > > content
XmlValue(const Type type)
Protected constructor that allows derived classes to set their value type.
XmlMarkup * append_markup(const std::string &text)
XmlComment(const std::string &comment)