Figured out how to serialize a shared_ptr<string>
[mussa.git] / alg / sequence.hpp
index 34c28b69b26972dc9b64db3afc06eee7c1c5c06a..6c5b3b62018ce87f100c0a66ee78d80922f4b6ff 100644 (file)
 #include <boost/filesystem/fstream.hpp>
 
 #include <boost/serialization/base_object.hpp>
+#include <boost/serialization/export.hpp>
 #include <boost/serialization/list.hpp>
 #include <boost/serialization/nvp.hpp>
 #include <boost/serialization/string.hpp>
 #include <boost/serialization/shared_ptr.hpp>
 #include <boost/serialization/utility.hpp>
-#include <boost/serialization/export.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/vector.hpp>
 
 #include <boost/shared_ptr.hpp>
 
-#include <list>
-#include <string>
-#include <vector>
 #include <iostream>
 
 // Sequence data class
@@ -84,6 +83,21 @@ private:
 };
 BOOST_CLASS_EXPORT(motif);
 
+//! the only purpose of this class is that the shared_ptr template 
+//! functions need the serialization support to be in-class.
+class seq_string : public std::string
+{
+private:
+  friend class boost::serialization::access;
+  template<class Archive>
+  void serialize(Archive& ar, const unsigned int /*version*/) {
+    //ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(std::string);
+    ar & boost::serialization::make_nvp("bases",
+          boost::serialization::base_object<std::string>(*this)
+         );
+  }
+};
+
 //! sequence track for mussa.
 class Sequence 
 {
@@ -213,7 +227,7 @@ public:
   void load_museq(boost::filesystem::path load_file_path, int seq_num); 
   
 private:
-  boost::shared_ptr<const std::string> seq;
+  boost::shared_ptr<seq_string> seq;
   std::string header;
   std::string species;
 
@@ -237,6 +251,6 @@ private:
     ar & BOOST_SERIALIZATION_NVP(motif_list);
   }
 };
-//BOOST_CLASS_EXPORT(Sequence);
+BOOST_CLASS_EXPORT(Sequence);
 
 #endif