git repos / blockattack-game

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

normal view · raw

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