PageRenderTime 19ms CodeModel.GetById 14ms app.highlight 1ms RepoModel.GetById 2ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/archive/impl/basic_xml_iarchive.ipp

http://hadesmem.googlecode.com/
C++ Header | 114 lines | 84 code | 16 blank | 14 comment | 15 complexity | d4c52a0097455f1e66ff8b63b05c5f8f MD5 | raw file
  1/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
  2// basic_xml_iarchive.ipp:
  3
  4// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
  5// Use, modification and distribution is subject to the Boost Software
  6// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7// http://www.boost.org/LICENSE_1_0.txt)
  8
  9//  See http://www.boost.org for updates, documentation, and revision history.
 10
 11#include <boost/assert.hpp>
 12#include <cstddef> // NULL
 13#include <algorithm>
 14
 15#include <boost/serialization/throw_exception.hpp>
 16#include <boost/archive/xml_archive_exception.hpp>
 17#include <boost/archive/basic_xml_iarchive.hpp>
 18#include <boost/serialization/tracking.hpp>
 19
 20namespace boost {
 21namespace archive {
 22
 23/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 24// implementation of xml_text_archive
 25
 26template<class Archive>
 27BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 28basic_xml_iarchive<Archive>::load_start(const char *name){
 29    // if there's no name
 30    if(NULL == name)
 31        return;
 32    bool result = this->This()->gimpl->parse_start_tag(this->This()->get_is());
 33    if(true != result){
 34        boost::serialization::throw_exception(
 35            archive_exception(archive_exception::input_stream_error)
 36        );
 37    }
 38    // don't check start tag at highest level
 39    ++depth;
 40    return;
 41}
 42
 43template<class Archive>
 44BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 45basic_xml_iarchive<Archive>::load_end(const char *name){
 46    // if there's no name
 47    if(NULL == name)
 48        return;
 49    bool result = this->This()->gimpl->parse_end_tag(this->This()->get_is());
 50    if(true != result){
 51        boost::serialization::throw_exception(
 52            archive_exception(archive_exception::input_stream_error)
 53        );
 54    }
 55    
 56    // don't check start tag at highest level
 57    if(0 == --depth)
 58        return;
 59        
 60    if(0 == (this->get_flags() & no_xml_tag_checking)){
 61        // double check that the tag matches what is expected - useful for debug
 62        if(0 != name[this->This()->gimpl->rv.object_name.size()]
 63        || ! std::equal(
 64                this->This()->gimpl->rv.object_name.begin(),
 65                this->This()->gimpl->rv.object_name.end(),
 66                name
 67            )
 68        ){
 69            boost::serialization::throw_exception(
 70                xml_archive_exception(
 71                    xml_archive_exception::xml_archive_tag_mismatch,
 72                    name
 73                )
 74            );
 75        }
 76    }
 77}
 78
 79template<class Archive>
 80BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 81basic_xml_iarchive<Archive>::load_override(object_id_type & t, int){
 82    t = object_id_type(this->This()->gimpl->rv.object_id);
 83}
 84
 85template<class Archive>
 86BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 87basic_xml_iarchive<Archive>::load_override(version_type & t, int){
 88    t = version_type(this->This()->gimpl->rv.version);
 89}
 90
 91template<class Archive>
 92BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 93basic_xml_iarchive<Archive>::load_override(class_id_type & t, int){
 94    t = class_id_type(this->This()->gimpl->rv.class_id);
 95}
 96
 97template<class Archive>
 98BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 99basic_xml_iarchive<Archive>::load_override(tracking_type & t, int){
100    t = this->This()->gimpl->rv.tracking_level;
101}
102
103template<class Archive>
104BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
105basic_xml_iarchive<Archive>::basic_xml_iarchive(unsigned int flags) :
106    detail::common_iarchive<Archive>(flags),
107    depth(0)
108{}
109template<class Archive>
110BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
111basic_xml_iarchive<Archive>::~basic_xml_iarchive(){}
112
113} // namespace archive
114} // namespace boost