git repos / blockattack-game

blame: source/code/Libs/include/cereal/external/rapidxml/rapidxml_utils.hpp

normal view · raw

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