New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
rapidxml_utils.hpp in vendors/XIOS/current/extern/rapidxml/include – NEMO

source: vendors/XIOS/current/extern/rapidxml/include/rapidxml_utils.hpp @ 3428

Last change on this file since 3428 was 3428, checked in by rblod, 12 years ago

importing initial XIOS vendor drop

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