LCOV - code coverage report
Current view: top level - app/libs/rapidxml - rapidxml_utils.hpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 15 16 93.8 %
Date: 2023-08-17 16:45:52 Functions: 1 1 100.0 %

          Line data    Source code
       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             : 
      16             : namespace rapidxml
      17             : {
      18             : 
      19             :     //! Represents data loaded from a file
      20             :     template<class Ch = char>
      21           5 :     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           5 :         file(const char *filename)
      29           5 :         {
      30             :             using namespace std;
      31             : 
      32             :             // Open stream
      33          10 :             basic_ifstream<Ch> stream(filename, ios::binary);
      34           5 :             if (!stream)
      35           0 :                 throw runtime_error(string("cannot open file ") + filename);
      36           5 :             stream.unsetf(ios::skipws);
      37             :             
      38             :             // Determine stream size
      39           5 :             stream.seekg(0, ios::end);
      40           5 :             size_t size = stream.tellg();
      41           5 :             stream.seekg(0);   
      42             :             
      43             :             // Load data and add terminating 0
      44           5 :             m_data.resize(size + 1);
      45           5 :             stream.read(&m_data.front(), static_cast<streamsize>(size));
      46           5 :             m_data[size] = 0;
      47           5 :         }
      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           5 :         Ch *data()
      66             :         {
      67           5 :             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

Generated by: LCOV version 1.14