Boost logo

Boost-Commit :

From: chochlik_at_[hidden]
Date: 2008-04-22 12:15:56


Author: matus.chochlik
Date: 2008-04-22 12:15:55 EDT (Tue, 22 Apr 2008)
New Revision: 44720
URL: http://svn.boost.org/trac/boost/changeset/44720

Log:
finished the example examples/serialization/cube.cpp showing cooperation with the Boost.Serialization library.
Text files modified:
   sandbox/mirror/libs/examples/serialization/cube.cpp | 202 +++++++++++++++++++++++++++++++++++++--
   1 files changed, 187 insertions(+), 15 deletions(-)

Modified: sandbox/mirror/libs/examples/serialization/cube.cpp
==============================================================================
--- sandbox/mirror/libs/examples/serialization/cube.cpp (original)
+++ sandbox/mirror/libs/examples/serialization/cube.cpp 2008-04-22 12:15:55 EDT (Tue, 22 Apr 2008)
@@ -1,7 +1,7 @@
 /**
  * \file examples/serialization/cube.cpp
  * Example of registering namespaces, types and classes
- * and cooperation with the Boost.Serialization library
+ * and cooperation with the Boost.Serialization library.
  *
  * NOTE: if You are not familiar with namespace and type
  * registration and reflection, You should probably
@@ -21,8 +21,8 @@
 #include <boost/mpl/at.hpp>
 
 #include <fstream>
-#include <boost/archive/xml_iarchive.hpp>
-#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
 
 #include <boost/char_type_switch/iostream.hpp>
 
@@ -65,6 +65,15 @@
                 void set_y(float_type _y){y = _y;}
                 void set_z(float_type _z){z = _z;}
                 void set_w(float_type _w){w = _w;}
+ //
+ friend bool operator == (const CoordsTempl& a, const CoordsTempl& b)
+ {
+ return
+ a.x == b.x &&
+ a.y == b.y &&
+ a.z == b.z &&
+ a.w == b.w;
+ }
         protected:
                 float_type x, y, z, w;
         };
@@ -83,6 +92,11 @@
                         : Coords(_x, _y, _z){ }
                 float_type length_squared(void){return x*x + y*y + z*z;}
                 float_type length(void){return sqrt(length_squared());}
+ //
+ friend bool operator == (const Vector& a, const Vector& b)
+ {
+ return static_cast<const Coords&>(a) == static_cast<const Coords&>(b);
+ }
         private:
         };
 
@@ -102,7 +116,9 @@
                         , rtb( _width/2.0f, _height/2.0f, -_depth/2.0f)
                         , rtf( _width/2.0f, _height/2.0f, _depth/2.0f)
                 { }
- private:
+ // the attribs are public which is actually not a good idea
+ // but this is just an example
+ //
                 // left-bottom-back
                 Vector lbb;
                 // left-bottom-front
@@ -119,6 +135,19 @@
                 Vector rtb;
                 // right-top-front
                 Vector rtf;
+ //
+ friend bool operator == (const Cube& a, const Cube& b)
+ {
+ return
+ a.lbb == b.lbb &&
+ a.lbf == b.lbf &&
+ a.ltb == b.ltb &&
+ a.ltf == b.ltf &&
+ a.rbb == b.rbb &&
+ a.rbf == b.rbf &&
+ a.rtb == b.rtb &&
+ a.rtf == b.rtf;
+ }
         };
 
 } // namespace Graphics
@@ -136,6 +165,7 @@
  */
 BOOST_MIRROR_REG_META_TYPE(_Graphics, ::Graphics, Coords)
 BOOST_MIRROR_REG_META_TYPE(_Graphics, ::Graphics, Vector)
+BOOST_MIRROR_REG_META_TYPE(_Graphics, ::Graphics, Cube)
 
 
 BOOST_MIRROR_REG_SINGLE_BASE_CLASS(
@@ -177,6 +207,43 @@
         )
 BOOST_MIRROR_REG_CLASS_ATTRIBS_END
 
+// register the attributes of Cube
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Graphics::Cube)
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 0, ::Graphics::Vector,
+ lbb
+ )
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 1, ::Graphics::Vector,
+ lbf
+ )
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 2, ::Graphics::Vector,
+ ltb
+ )
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 3, ::Graphics::Vector,
+ ltf
+ )
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 4, ::Graphics::Vector,
+ rbb
+ )
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 5, ::Graphics::Vector,
+ rbf
+ )
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 6, ::Graphics::Vector,
+ rtb
+ )
+ BOOST_MIRROR_REG_CLASS_ATTRIB(
+ 7, ::Graphics::Vector,
+ rtf
+ )
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+
 /** Support for serialization
  */
 
@@ -188,43 +255,134 @@
 };
 
 template <class Class>
+to_be_loaded<Class> make_loadable(Class& _inst)
+{
+ return to_be_loaded<Class>(_inst);
+}
+
+float& make_loadable(float& _inst)
+{
+ return _inst;
+}
+
+template <class Class>
 struct to_be_saved
 {
         to_be_saved(const Class& _inst):inst(_inst){ }
         const Class& inst;
 };
 
+template <class Class>
+to_be_saved<Class> make_saveable(const Class& _inst)
+{
+ return to_be_saved<Class>(_inst);
+}
+
+const float& make_saveable(const float& _inst)
+{
+ return _inst;
+}
+
+
+template <class meta_class, class position>
+struct single_attrib_loader
+{
+ template <class Archive, class Class>
+ single_attrib_loader(Archive & ar, Class& c)
+ {
+ // first load the previous
+ single_attrib_loader<meta_class, mpl::int_<position::value - 1> >(ar, c);
+ // query the value of the current member
+ mpl::at<meta_class::all_attributes::type_list, position>::type value;
+ // load it
+ ar >> make_loadable(value);
+ // and set it
+ meta_class::all_attributes::set(c, position(), value);
+ }
+};
+
+template <class meta_class>
+struct single_attrib_loader<meta_class, mpl::int_<0> >
+{
+ template <class Archive, class Class>
+ single_attrib_loader(Archive & ar, Class& c)
+ {
+ typedef mpl::int_<0> position;
+ // we are on the first so just load it
+ mpl::at<meta_class::all_attributes::type_list, position>::type value;
+ ar >> make_loadable(value);
+ meta_class::all_attributes::set(c, position(), value);
+ }
+};
+
+
+
+
 template<class Archive, class Class>
-void load(Archive & ar, Class & c, const unsigned int version)
+void load(Archive & ar, Class & c)
 {
         typedef BOOST_MIRROR_REFLECT_CLASS(Class) meta_Class;
+ typedef mpl::int_<meta_Class::all_attributes::size::value-1> last;
+ single_attrib_loader<meta_Class, last>(ar, c);
 }
 
+template <class meta_class, class position>
+struct single_attrib_saver
+{
+ template <class Archive, class Class>
+ single_attrib_saver(Archive & ar, const Class& c)
+ {
+ // first save the previous
+ single_attrib_saver<meta_class, mpl::int_<position::value - 1> >(ar, c);
+ // query the value of the current member
+ mpl::at<meta_class::all_attributes::type_list, position>::type value;
+ // and save it
+ ar << make_saveable(meta_class::all_attributes::query(c, position(), value));
+ }
+};
+
+template <class meta_class>
+struct single_attrib_saver<meta_class, mpl::int_<0> >
+{
+ template <class Archive, class Class>
+ single_attrib_saver(Archive & ar, const Class& c)
+ {
+ typedef mpl::int_<0> position;
+ // we are on the first so just save it
+ // query the value of the current member
+ mpl::at<meta_class::all_attributes::type_list, position>::type value;
+ ar << make_saveable(meta_class::all_attributes::query(c, position(), value));
+ }
+};
+
 template<class Archive, class Class>
-void save(Archive & ar, const Class & c, const unsigned int version)
+void save(Archive & ar, const Class & c)
 {
         typedef BOOST_MIRROR_REFLECT_CLASS(Class) meta_Class;
+ typedef mpl::int_<meta_Class::all_attributes::size::value-1> last;
+ single_attrib_saver<meta_Class, last>(ar, c);
 }
 
 
 } // namespace mirror
 
-namespace serialization {
+namespace archive {
 
 template<class Archive, class Class>
-void serialize(Archive & ar, mirror::to_be_saved<Class> dst, const unsigned int version)
+void save(Archive & ar, mirror::to_be_saved<Class>& dst)
 {
- mirror::save(ar, dst.inst, version);
+ mirror::save(ar, dst.inst);
 }
 
 template<class Archive, class Class>
-void serialize(Archive & ar, mirror::to_be_loaded<Class> src, const unsigned int version)
+void load(Archive & ar, mirror::to_be_loaded<Class>& src)
 {
- mirror::load(ar, src.inst, version);
+ mirror::load(ar, src.inst);
 }
 
 
-} // namespace serialization
+} // namespace archive
+
 } // namespace boost
 
 int main(void)
@@ -237,12 +395,26 @@
         using ::Graphics::Vector;
         using ::Graphics::Cube;
         //
+ // create two different cubes
         Cube c1(2.0f, 2.0f, 2.0f), c2;
         //
- boost::archive::xml_oarchive oa(cout);
- //
- oa << BOOST_SERIALIZATION_NVP(to_be_saved<Cube>(c1));
+ // save the first one into a text file
+ {
+ std::fstream out("temp.txt", ios_base::out);
+ boost::archive::text_oarchive oa(out);
+ //
+ oa << make_saveable(c1);
+ }
         //
+ // load the second from the same file
+ {
+ std::fstream in("temp.txt", ios_base::in);
+ boost::archive::text_iarchive ia(in);
+ //
+ ia >> make_loadable(c2);
+ }
+ // compare them
+ assert(c1 == c2);
         //
         bcout << "Finished" << endl;
         //


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk