BIE |
/home/weinberg/src/BIE/persistence/BIE_polymorphic_xml_oarchive_pre_1_35.h00001 #ifndef BIE_POLYMORPHIC_XML_OARCHIVE_H 00002 #define BIE_POLYMORPHIC_XML_OARCHIVE_H 00003 00004 #include <iostream> 00005 #include <sstream> 00006 #include <iomanip> 00007 00008 #include <boost/version.hpp> 00009 #include <boost/config.hpp> 00010 00011 #include <boost/archive/basic_xml_oarchive.hpp> 00012 #include <boost/archive/polymorphic_xml_oarchive.hpp> 00013 #include <boost/archive/xml_oarchive.hpp> 00014 /* #if ((BOOST_VERSION / 100) % 1000) < 35 */ 00015 /* #include <boost/archive/detail/polymorphic_oarchive_impl.hpp> */ 00016 /* #else */ 00017 #include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp> 00018 /* #endif */ 00019 00020 #include <boost/archive/impl/basic_xml_oarchive.ipp> 00021 #include <boost/archive/impl/xml_oarchive_impl.ipp> 00022 00023 #include <boost/archive/detail/abi_prefix.hpp> 00024 00025 namespace BIE { 00026 template<class Archive> 00027 class BIE_xml_oarchive_impl : 00028 public ::boost::archive::xml_oarchive_impl<Archive> { 00029 friend class ::boost::archive::detail::interface_oarchive<Archive>; 00030 friend class ::boost::archive::basic_xml_oarchive<Archive>; 00031 friend class ::boost::archive::save_access; 00032 00033 public: 00034 template<class T> 00035 BOOST_ARCHIVE_DECL(void) 00036 save(const T & t) { 00037 ::boost::archive::xml_oarchive_impl<Archive>::save(t); 00038 } 00039 00040 template<class T> 00041 BOOST_ARCHIVE_DECL(void) 00042 save(const T * t) { 00043 ::boost::archive::xml_oarchive_impl<Archive>::save(t); 00044 } 00045 00046 BOOST_ARCHIVE_DECL(void) 00047 save(const float & t) { 00048 this->save_binary(&t, sizeof(t)); 00049 } 00050 00051 BOOST_ARCHIVE_DECL(void) 00052 save(const double & t) { 00053 this->save_binary(&t, sizeof(t)); 00054 } 00055 00056 public: 00057 // special treatment for name-value pairs. 00058 template<class T> 00059 void save_override( 00060 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING 00061 const 00062 #endif 00063 ::boost::serialization::nvp<T> & t, 00064 int 00065 ){ 00066 this->This()->save_start(t.name()); 00067 ::boost::archive::save(* this->This(), t.const_value()); 00068 this->This()->save_end(t.name()); 00069 } 00070 00071 // specific overrides for attributes - not name value pairs so we 00072 // want to trap them before the above "fall through" 00073 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00074 save_override(const ::boost::archive::object_id_type & t, int) { 00075 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00076 } 00077 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00078 save_override(const ::boost::archive::object_reference_type & t, int) { 00079 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00080 } 00081 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00082 save_override(const ::boost::archive::version_type & t, int) { 00083 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00084 } 00085 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00086 save_override(const ::boost::archive::class_id_type & t, int) { 00087 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00088 } 00089 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00090 save_override(const ::boost::archive::class_id_optional_type & t, int) { 00091 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00092 } 00093 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00094 save_override(const ::boost::archive::class_id_reference_type & t, int) { 00095 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00096 } 00097 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00098 save_override(const ::boost::archive::class_name_type & t, int) { 00099 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00100 } 00101 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 00102 save_override(const ::boost::archive::tracking_type & t, int) { 00103 ::boost::archive::basic_xml_oarchive<Archive>::save_override(t, 0); 00104 } 00105 00106 protected: 00107 BIE_xml_oarchive_impl(std::ostream & os, unsigned int flags) : 00108 ::boost::archive::xml_oarchive_impl<Archive>(os, flags) { } 00109 00110 ~BIE_xml_oarchive_impl() { } 00111 }; 00112 00113 // copy of boost/archive/xml_oarchive.hpp:94 00114 // CRTP - Curiously Recurring Template Pattern 00115 class BIE_xml_oarchive : 00116 public BIE_xml_oarchive_impl<BIE_xml_oarchive> { 00117 public: 00118 BIE_xml_oarchive(std::ostream & os, unsigned int flags = 0) : 00119 BIE_xml_oarchive_impl<BIE_xml_oarchive>(os, flags) {} 00120 00121 ~BIE_xml_oarchive(){} 00122 }; 00123 00124 /* #if ((BOOST_VERSION / 100) % 1000) < 35 */ 00125 /* typedef boost::archive::detail::polymorphic_oarchive_impl< */ 00126 /* #else */ 00127 typedef boost::archive::detail::polymorphic_oarchive_dispatch< 00128 /* #endif */ 00129 BIE_xml_oarchive_impl<BIE_xml_oarchive> 00130 > BIE_polymorphic_xml_oarchive; 00131 } // namespace BIE 00132 00133 BOOST_SERIALIZATION_REGISTER_ARCHIVE(BIE::BIE_xml_oarchive) 00134 BOOST_SERIALIZATION_REGISTER_ARCHIVE(BIE::BIE_polymorphic_xml_oarchive) 00135 00136 #include <boost/archive/detail/abi_suffix.hpp> 00137 00138 #endif // BIE_POLYMORPHIC_XML_OARCHIVE_H Send suggestions, questions, and feedback to WEINBERG at ASTRO dot UMASS dot EDU. Documentation generated at Fri Mar 26 00:35:11 2010 by
|