Photon 1.0.0
Loading...
Searching...
No Matches
rapidxml_utils.hpp
Go to the documentation of this file.
1#ifndef RAPIDXML_UTILS_HPP_INCLUDED
2#define RAPIDXML_UTILS_HPP_INCLUDED
3
4// Copyright (C) 2006, 2009 Marcin Kalicinski
5// Version 1.13
6// Revision $DateTime: 2009/05/13 01:46:17 $
9
10#include "rapidxml.hpp"
11#include <fstream>
12#include <stdexcept>
13#include <string>
14#include <vector>
15
16namespace rapidxml
17{
18
20 template <class Ch = char> class file
21 {
22
23 public:
26 file(const char* filename)
27 {
28 using namespace std;
29
30 // Open stream
31 basic_ifstream<Ch> stream(filename, ios::binary);
32 if (!stream)
33 throw runtime_error(std::string("cannot open file ") + filename);
34 stream.unsetf(ios::skipws);
35
36 // Determine stream size
37 stream.seekg(0, ios::end);
38 size_t size = stream.tellg();
39 stream.seekg(0);
40
41 // Load data and add terminating 0
42 m_data.resize(size + 1);
43 stream.read(&m_data.front(), static_cast<streamsize>(size));
44 m_data[size] = 0;
45 }
46
49 file(std::basic_istream<Ch>& stream)
50 {
51 using namespace std;
52
53 // Load data and add terminating 0
54 stream.unsetf(ios::skipws);
55 m_data.assign(istreambuf_iterator<Ch>(stream), istreambuf_iterator<Ch>());
56 if (stream.fail() || stream.bad())
57 throw runtime_error("error reading stream");
58 m_data.push_back(0);
59 }
60
63 Ch* data()
64 {
65 return &m_data.front();
66 }
67
70 const Ch* data() const
71 {
72 return &m_data.front();
73 }
74
77 std::size_t size() const
78 {
79 return m_data.size();
80 }
81
82 private:
83 std::vector<Ch> m_data; // File data
84 };
85
88 template <class Ch> inline std::size_t count_children(xml_node<Ch>* node)
89 {
90 xml_node<Ch>* child = node->first_node();
91 std::size_t count = 0;
92 while (child)
93 {
94 ++count;
95 child = child->next_sibling();
96 }
97 return count;
98 }
99
102 template <class Ch> inline std::size_t count_attributes(xml_node<Ch>* node)
103 {
104 xml_attribute<Ch>* attr = node->first_attribute();
105 std::size_t count = 0;
106 while (attr)
107 {
108 ++count;
109 attr = attr->next_attribute();
110 }
111 return count;
112 }
113
114} // namespace rapidxml
115
116#endif
Represents data loaded from a file.
Definition rapidxml_utils.hpp:21
std::vector< Ch > m_data
Definition rapidxml_utils.hpp:83
file(std::basic_istream< Ch > &stream)
Definition rapidxml_utils.hpp:49
std::size_t size() const
Definition rapidxml_utils.hpp:77
const Ch * data() const
Definition rapidxml_utils.hpp:70
Ch * data()
Definition rapidxml_utils.hpp:63
file(const char *filename)
Definition rapidxml_utils.hpp:26
Definition rapidxml.hpp:784
xml_attribute< Ch > * next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
Definition rapidxml.hpp:845
Definition rapidxml.hpp:882
xml_attribute< Ch > * first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
Definition rapidxml.hpp:1017
xml_node< Ch > * next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
Definition rapidxml.hpp:995
xml_node< Ch > * first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
Definition rapidxml.hpp:924
constexpr auto count() -> size_t
Definition core.h:1538
Definition rapidxml.hpp:62
std::size_t count_children(xml_node< Ch > *node)
Definition rapidxml_utils.hpp:88
std::size_t count_attributes(xml_node< Ch > *node)
Definition rapidxml_utils.hpp:102
Definition uuid.h:926
This file contains rapidxml parser and DOM implementation.