summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/flyweight/example/serialization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/flyweight/example/serialization.cpp')
-rw-r--r--src/boost/libs/flyweight/example/serialization.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/boost/libs/flyweight/example/serialization.cpp b/src/boost/libs/flyweight/example/serialization.cpp
new file mode 100644
index 000000000..80227a539
--- /dev/null
+++ b/src/boost/libs/flyweight/example/serialization.cpp
@@ -0,0 +1,133 @@
+/* Boost.Flyweight example of serialization.
+ *
+ * Copyright 2006-2014 Joaquin M Lopez Munoz.
+ * Distributed under 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)
+ *
+ * See http://www.boost.org/libs/flyweight for library home page.
+ */
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <algorithm>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/flyweight.hpp>
+#include <boost/flyweight/serialize.hpp>
+#include <boost/serialization/vector.hpp>
+#include <boost/tokenizer.hpp>
+#include <cstdio>
+#include <cstdlib>
+#include <fstream>
+#include <iostream>
+#include <iterator>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+using namespace boost::flyweights;
+
+typedef flyweight<std::string> fw_string;
+typedef std::vector<fw_string> text_container;
+
+/* Read a text file into a text_container and serialize to an archive. */
+
+void save_serialization_file()
+{
+ /* Define a tokenizer on std::istreambuf. */
+
+ typedef std::istreambuf_iterator<char> char_iterator;
+ typedef boost::tokenizer<
+ boost::char_separator<char>,
+ char_iterator
+ > tokenizer;
+
+ std::cout<<"enter input text file name: ";
+ std::string in;
+ std::getline(std::cin,in);
+ std::ifstream ifs(in.c_str());
+ if(!ifs){
+ std::cout<<"can't open "<<in<<std::endl;
+ std::exit(EXIT_FAILURE);
+ }
+
+ /* Tokenize using space and common punctuaction as separators, and
+ * keeping the separators.
+ */
+
+ tokenizer tok=tokenizer(
+ char_iterator(ifs),char_iterator(),
+ boost::char_separator<char>(
+ "",
+ "\t\n\r !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"));
+ text_container txt;
+ for(tokenizer::iterator it=tok.begin();it!=tok.end();++it){
+ txt.push_back(fw_string(*it));
+ }
+
+ std::cout<<"enter output serialization file name: ";
+ std::string out;
+ std::getline(std::cin,out);
+ std::ofstream ofs(out.c_str());
+ if(!ofs){
+ std::cout<<"can't open "<<out<<std::endl;
+ std::exit(EXIT_FAILURE);
+ }
+ boost::archive::text_oarchive oa(ofs);
+ oa<<const_cast<const text_container&>(txt);
+}
+
+/* Read a serialization archive and save the result to a text file. */
+
+void load_serialization_file()
+{
+ std::cout<<"enter input serialization file name: ";
+ std::string in;
+ std::getline(std::cin,in);
+ std::ifstream ifs(in.c_str());
+ if(!ifs){
+ std::cout<<"can't open "<<in<<std::endl;
+ std::exit(EXIT_FAILURE);
+ }
+ boost::archive::text_iarchive ia(ifs);
+ text_container txt;
+ ia>>txt;
+
+ std::cout<<"enter output text file name: ";
+ std::string out;
+ std::getline(std::cin,out);
+ std::ofstream ofs(out.c_str());
+ if(!ofs){
+ std::cout<<"can't open "<<out<<std::endl;
+ std::exit(EXIT_FAILURE);
+ }
+ std::copy(
+ txt.begin(),txt.end(),
+ std::ostream_iterator<std::string>(ofs));
+}
+
+int main()
+{
+ try{
+ std::cout<<"1 load a text file and save it as a serialization file\n"
+ "2 load a serialization file and save it as a text file\n";
+ for(;;){
+ std::cout<<"select option, enter to exit: ";
+ std::string str;
+ std::getline(std::cin,str);
+ if(str.empty())break;
+ std::istringstream istr(str);
+ int option=-1;
+ istr>>option;
+ if(option==1)save_serialization_file();
+ else if(option==2)load_serialization_file();
+ }
+ }
+ catch(const std::exception& e){
+ std::cout<<"error: "<<e.what()<<std::endl;
+ std::exit(EXIT_FAILURE);
+ }
+
+ return 0;
+}