agrippa1994

boost text stream

Dec 13th, 2013
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <boost/archive/text_iarchive.hpp>
  2. #include <boost/archive/text_oarchive.hpp>
  3. #include <boost/iostreams/stream.hpp>
  4. #include <boost/iostreams/device/back_inserter.hpp>
  5.  
  6.  
  7. #include <iostream>
  8.  
  9. struct Test
  10. {
  11.     int x;
  12.     int y;
  13.     int z;
  14. };
  15.  
  16. namespace boost{
  17.     namespace serialization{
  18.         template<class Archive> void serialize(Archive & ar, Test & t, const unsigned int version){
  19.             ar & t.x;
  20.             ar & t.y;
  21.             ar & t.z;
  22.         }
  23.     }
  24. }
  25. class output_stream
  26. {
  27.     std::string m_data;
  28.     boost::iostreams::back_insert_device<std::string> m_inserter;
  29.     boost::iostreams::stream<boost::iostreams::back_insert_device<std::string> > m_streamer;
  30.     boost::archive::text_oarchive m_archive;
  31.  
  32. public:
  33.     output_stream() : m_inserter(m_data), m_streamer(m_inserter), m_archive(m_streamer) { }
  34.  
  35.     const std::string& data() { m_streamer.flush();  return m_data; }
  36.  
  37.     template<typename T> boost::archive::text_oarchive& operator << (T& obj) {
  38.         return (m_archive << obj);
  39.     }
  40. };
  41.  
  42. class input_stream
  43. {
  44.     boost::iostreams::basic_array_source<char> m_device;
  45.     boost::iostreams::stream<boost::iostreams::basic_array_source<char> > m_stream;
  46.     boost::archive::text_iarchive m_archive;
  47.  
  48. public:
  49.     input_stream(const char *pData, size_t len) : m_device((const char *)pData, len), m_stream(m_device), m_archive(m_stream) { }
  50.  
  51.     input_stream(const std::string& data) : m_device((const char *)data.c_str(), data.length()), m_stream(m_device), m_archive(m_stream) { }
  52.     template<typename T> boost::archive::text_iarchive& operator >> (T& obj){
  53.         return (m_archive >> obj);
  54.     }
  55.  
  56. };
  57.  
  58. int main(int argc, const char * argv[])
  59. {
  60.     Test t_1 = { 20, 40, 60 };
  61.     Test t_2;
  62.  
  63.     output_stream o;
  64.     o << t_1;
  65.  
  66.     input_stream i(o.data());
  67.     i >> t_2;
  68.  
  69.     std::cout << t_2.x << ' ' << t_2.y << ' ' << t_2.z << std::endl;
  70.  
  71.     return 0;
  72. }
Add Comment
Please, Sign In to add comment