Ugly, not-to-be-pushed sucking in of all of Boost to get windows to work.
[dyninst.git] / external / boost / archive / impl / basic_xml_iarchive.ipp
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 <cassert>
12 #include <algorithm>
13
14 #include <boost/throw_exception.hpp>
15
16 #include <boost/archive/basic_xml_iarchive.hpp>
17 #include <boost/serialization/tracking.hpp>
18 //#include <boost/serialization/extended_type_info.hpp>
19
20 namespace boost {
21 namespace archive {
22
23 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
24 // implementation of xml_text_archive
25
26 template<class Archive>
27 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
28 basic_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::throw_exception(
35             archive_exception(archive_exception::stream_error)
36         );
37     }
38     // don't check start tag at highest level
39     ++depth;
40     return;
41 }
42
43 template<class Archive>
44 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
45 basic_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::throw_exception(
52             archive_exception(archive_exception::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::throw_exception(
70                 archive_exception(archive_exception::stream_error)
71             );
72         }
73     }
74 }
75
76 template<class Archive>
77 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
78 basic_xml_iarchive<Archive>::load_override(object_id_type & t, int){
79     t = this->This()->gimpl->rv.object_id;
80 }
81
82 template<class Archive>
83 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
84 basic_xml_iarchive<Archive>::load_override(version_type & t, int){
85     t = this->This()->gimpl->rv.version;
86 }
87
88 template<class Archive>
89 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
90 basic_xml_iarchive<Archive>::load_override(class_id_type & t, int){
91     t = this->This()->gimpl->rv.class_id;
92 }
93
94 template<class Archive>
95 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
96 basic_xml_iarchive<Archive>::load_override(tracking_type & t, int){
97     t = this->This()->gimpl->rv.tracking_level;
98 }
99
100 template<class Archive>
101 BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
102 basic_xml_iarchive<Archive>::basic_xml_iarchive(unsigned int flags) :
103     detail::common_iarchive<Archive>(flags),
104     depth(0)
105 {}
106 template<class Archive>
107 BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
108 basic_xml_iarchive<Archive>::~basic_xml_iarchive(){}
109
110 } // namespace archive
111 } // namespace boost