A toolkit for working with phylogenetic data.
v0.18.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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-2017 Lucas Czech
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 
155  XmlElement(const std::string& tag) : XmlValue(kElement), tag(tag) {};
156 
157  virtual ~XmlElement() override
158  {
159  clear();
160  }
161 
162  inline void clear()
163  {
164  tag = "";
165  attributes.clear();
166  content.clear();
167  }
168 
169  inline XmlComment* append_comment (const std::string& comment)
170  {
171  auto elm = utils::make_unique<XmlComment>(comment);
172  auto ptr = elm.get();
173  content.push_back(std::move(elm));
174  return ptr;
175  }
176 
177  inline XmlMarkup* append_markup (const std::string& text)
178  {
179  auto elm = utils::make_unique<XmlMarkup>(text);
180  auto ptr = elm.get();
181  content.push_back(std::move(elm));
182  return ptr;
183  }
184 
185  inline XmlElement* append_element (const std::string& tag)
186  {
187  auto elm = utils::make_unique<XmlElement>(tag);
188  auto ptr = elm.get();
189  content.push_back(std::move(elm));
190  return ptr;
191  }
192 
193  std::string tag;
195  std::vector<std::unique_ptr<XmlValue>> content;
196 };
197 
198 // =================================================================================================
199 // Xml Document
200 // =================================================================================================
201 
205 class XmlDocument : public XmlElement
206 {
207 public:
208  virtual ~XmlDocument() override
209  {
210  clear();
211  }
212 
213  inline void clear()
214  {
216  xml_tag = "";
217  declarations.clear();
218  }
219 
220  std::string xml_tag;
222 };
223 
224 // =================================================================================================
225 // Converter Functions
226 // =================================================================================================
227 
228 const XmlComment* xml_value_to_comment (const XmlValue* v);
229 const XmlMarkup* xml_value_to_markup (const XmlValue* v);
230 const XmlElement* xml_value_to_element (const XmlValue* v);
231 
232 } // namespace utils
233 } // namespace genesis
234 
235 #endif // include guard
virtual ~XmlElement() override
std::string type_to_string() const
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)
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)
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)