| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
1 |
#ifndef CEREAL_RAPIDXML_UTILS_HPP_INCLUDED |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
2 |
#define CEREAL_RAPIDXML_UTILS_HPP_INCLUDED |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
3 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
4 |
// Copyright (C) 2006, 2009 Marcin Kalicinski |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
5 |
// Version 1.13 |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
6 |
// Revision $DateTime: 2009/05/13 01:46:17 $ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
7 |
//! in certain simple scenarios. They should probably not be used if maximizing performance is the main objective. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
8 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
9 |
#include "rapidxml.hpp" |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
10 |
#include <vector> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
11 |
#include <string> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
12 |
#include <fstream> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
13 |
#include <stdexcept> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
14 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
15 |
namespace cereal { |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
16 |
namespace rapidxml |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
17 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
18 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
19 |
//! Represents data loaded from a file |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
20 |
template<class Ch = char> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
21 |
class file |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
22 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
23 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
24 |
public: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
25 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
26 |
//! Loads file into the memory. Data will be automatically destroyed by the destructor. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
27 |
//! \param filename Filename to load. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
28 |
file(const char *filename) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
29 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
30 |
using namespace std; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
31 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
32 |
// Open stream |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
33 |
basic_ifstream<Ch> stream(filename, ios::binary); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
34 |
if (!stream) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
35 |
throw runtime_error(string("cannot open file ") + filename); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
36 |
stream.unsetf(ios::skipws); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
37 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
38 |
// Determine stream size |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
39 |
stream.seekg(0, ios::end); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
40 |
size_t size = stream.tellg(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
41 |
stream.seekg(0); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
42 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
43 |
// Load data and add terminating 0 |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
44 |
m_data.resize(size + 1); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
45 |
stream.read(&m_data.front(), static_cast<streamsize>(size)); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
46 |
m_data[size] = 0; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
47 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
48 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
49 |
//! Loads file into the memory. Data will be automatically destroyed by the destructor |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
50 |
//! \param stream Stream to load from |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
51 |
file(std::basic_istream<Ch> &stream) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
52 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
53 |
using namespace std; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
54 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
55 |
// Load data and add terminating 0 |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
56 |
stream.unsetf(ios::skipws); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
57 |
m_data.assign(istreambuf_iterator<Ch>(stream), istreambuf_iterator<Ch>()); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
58 |
if (stream.fail() || stream.bad()) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
59 |
throw runtime_error("error reading stream"); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
60 |
m_data.push_back(0); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
61 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
62 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
63 |
//! Gets file data. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
64 |
//! \return Pointer to data of file. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
65 |
Ch *data() |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
66 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
67 |
return &m_data.front(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
68 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
69 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
70 |
//! Gets file data. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
71 |
//! \return Pointer to data of file. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
72 |
const Ch *data() const |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
73 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
74 |
return &m_data.front(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
75 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
76 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
77 |
//! Gets file data size. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
78 |
//! \return Size of file data, in characters. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
79 |
std::size_t size() const |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
80 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
81 |
return m_data.size(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
82 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
83 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
84 |
private: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
85 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
86 |
std::vector<Ch> m_data; // File data |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
87 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
88 |
}; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
89 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
90 |
//! Counts children of node. Time complexity is O(n). |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
91 |
//! \return Number of children of node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
92 |
template<class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
93 |
inline std::size_t count_children(xml_node<Ch> *node) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
94 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
95 |
xml_node<Ch> *child = node->first_node(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
96 |
std::size_t count = 0; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
97 |
while (child) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
98 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
99 |
++count; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
100 |
child = child->next_sibling(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
101 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
102 |
return count; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
103 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
104 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
105 |
//! Counts attributes of node. Time complexity is O(n). |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
106 |
//! \return Number of attributes of node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
107 |
template<class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
108 |
inline std::size_t count_attributes(xml_node<Ch> *node) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
109 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
110 |
xml_attribute<Ch> *attr = node->first_attribute(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
111 |
std::size_t count = 0; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
112 |
while (attr) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
113 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
114 |
++count; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
115 |
attr = attr->next_attribute(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
116 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
117 |
return count; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
118 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
119 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
120 |
} |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
121 |
} // namespace cereal |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
122 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
123 |
#endif |
|
|
1970-01-01 00:00 |
124 |
|