summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/serialization/example/demo_auto_ptr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/serialization/example/demo_auto_ptr.cpp')
-rw-r--r--src/boost/libs/serialization/example/demo_auto_ptr.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/boost/libs/serialization/example/demo_auto_ptr.cpp b/src/boost/libs/serialization/example/demo_auto_ptr.cpp
new file mode 100644
index 000000000..ff86ac413
--- /dev/null
+++ b/src/boost/libs/serialization/example/demo_auto_ptr.cpp
@@ -0,0 +1,135 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// demo_auto_ptr.cpp
+
+// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <list>
+#include <memory>
+#include <fstream>
+#include <string>
+
+#include <cstdio> // remove, std::autoptr inteface wrong in dinkumware
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{
+ using ::remove;
+}
+#endif
+
+#include <boost/archive/tmpdir.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+
+#include <boost/serialization/split_free.hpp>
+
+namespace boost {
+namespace serialization {
+
+/////////////////////////////////////////////////////////////
+// implement serialization for auto_ptr< T >
+// note: this must be added to the boost namespace in order to
+// be called by the library
+template<class Archive, class T>
+inline void save(
+ Archive & ar,
+ const std::auto_ptr< T > &t,
+ const unsigned int file_version
+){
+ // only the raw pointer has to be saved
+ // the ref count is rebuilt automatically on load
+ const T * const tx = t.get();
+ ar << tx;
+}
+
+template<class Archive, class T>
+inline void load(
+ Archive & ar,
+ std::auto_ptr< T > &t,
+ const unsigned int file_version
+){
+ T *pTarget;
+ ar >> pTarget;
+ // note that the reset automagically maintains the reference count
+ #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
+ t.release();
+ t = std::auto_ptr< T >(pTarget);
+ #else
+ t.reset(pTarget);
+ #endif
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class T>
+inline void serialize(
+ Archive & ar,
+ std::auto_ptr< T > &t,
+ const unsigned int file_version
+){
+ boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+/////////////////////////////////////////////////////////////
+// test auto_ptr serialization
+class A
+{
+private:
+ friend class boost::serialization::access;
+ int x;
+ template<class Archive>
+ void serialize(Archive &ar, const unsigned int /* file_version */){
+ ar & x;
+ }
+public:
+ A(){} // default constructor
+ ~A(){} // default destructor
+};
+
+void save(const std::auto_ptr<A> & spa, const char *filename)
+{
+ std::ofstream ofs(filename);
+ boost::archive::text_oarchive oa(ofs);
+ oa << spa;
+}
+
+void load(std::auto_ptr<A> & spa, const char *filename)
+{
+ // open the archive
+ std::ifstream ifs(filename);
+ boost::archive::text_iarchive ia(ifs);
+
+ // restore the schedule from the archive
+ ia >> spa;
+}
+
+int main(int argc, char *argv[])
+{
+ std::string filename = boost::archive::tmpdir();
+ filename += "/testfile";
+
+ // create a new auto pointer to ta new object of type A
+ std::auto_ptr<A> spa(new A);
+ // serialize it
+ save(spa, filename.c_str());
+ // reset the auto pointer to NULL
+ // thereby destroying the object of type A
+ // note that the reset automagically maintains the reference count
+ #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
+ spa.release();
+ #else
+ spa.reset();
+ #endif
+ // restore state to one equivalent to the original
+ // creating a new type A object
+ load(spa, filename.c_str());
+ // obj of type A gets destroyed
+ // as auto_ptr goes out of scope
+ std::remove(filename.c_str());
+ return 0;
+}