diff options
Diffstat (limited to 'src/boost/libs/serialization/performance/xml/harness.hpp')
-rw-r--r-- | src/boost/libs/serialization/performance/xml/harness.hpp | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/boost/libs/serialization/performance/xml/harness.hpp b/src/boost/libs/serialization/performance/xml/harness.hpp new file mode 100644 index 00000000..8955be21 --- /dev/null +++ b/src/boost/libs/serialization/performance/xml/harness.hpp @@ -0,0 +1,188 @@ +/* /libs/serialization/xml_performance/harness.hpp ***************************** + +(C) Copyright 2010 Bryce Lelbach + +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) + +*******************************************************************************/ + +#if !defined(BOOST_SERIALIZATION_XML_PERFORMANCE_HARNESS_HPP) +#define BOOST_SERIALIZATION_XML_PERFORMANCE_HARNESS_HPP + +// MS compatible compilers support #pragma once +#if defined(_MSC_VER) + # pragma once +#endif + +#include <cassert> +#include <cstdio> + +#include <string> +#include <fstream> +#include <iostream> +#include <utility> + +#include <boost/config.hpp> + +#if defined(BOOST_NO_STDC_NAMESPACE) + namespace std { + using ::remove; + } +#endif + +#include <boost/uuid/uuid.hpp> +#include <boost/uuid/uuid_io.hpp> +#include <boost/uuid/random_generator.hpp> + +#include <boost/functional/hash.hpp> + +#include <boost/utility/enable_if.hpp> + +#include <boost/type_traits/is_integral.hpp> + +#include <boost/archive/xml_iarchive.hpp> +#include <boost/archive/xml_oarchive.hpp> + +#include <boost/archive/archive_exception.hpp> + +#include "high_resolution_timer.hpp" // from /libs/spirit/optimization + +#include "node.hpp" // includes macro.hpp + +namespace boost { +namespace archive { +namespace xml { + +template<typename T> T random (void); + +template<typename T> T +random (void) { + using namespace boost::uuids; + + hash<uuid> hash; + basic_random_generator<mt19937> gen; + + return hash(gen()); +} + +template<> std::string +random<std::string> (void) { + using namespace boost::uuids; + + basic_random_generator<mt19937> gen; + uuid u = gen(); + + return to_string(u); +} + +template<typename T> std::string +save_archive (T const& s) { + std::string fn = random<std::string>() + + "-" BOOST_PP_STRINGIZE(BSL_TYPE) + BOOST_PP_STRINGIZE(BSL_EXP(BSL_NODE_MAX, BSL_DEPTH)) + ".xml" + ; + + std::ofstream ofs(fn.c_str()); + + assert(ofs.good()); + + xml_oarchive oa(ofs); + oa << BOOST_SERIALIZATION_NVP(s); + + ofs.close(); + return fn; +} + +template<typename T> std::pair<double, T> +restore_archive (std::string fn) { + std::ifstream ifs(fn.c_str()); + T s; + + assert(ifs.good()); + + high_resolution_timer u; + + xml_iarchive ia(ifs); + ia >> BOOST_SERIALIZATION_NVP(s); + + ifs.close(); + return std::pair<double, T>(u.elapsed(), s); +} + +class result_set_exception: public virtual archive_exception { + public: + enum exception_code { + invalid_archive_metadata + }; + + result_set_exception (exception_code c = invalid_archive_metadata){ } + + virtual const char* what() const throw() { + const char *msg = ""; + + switch (code) { + case invalid_archive_metadata: + msg = "result set was not created on this system"; + default: + archive_exception::what(); + } + + return msg; + } +}; + +struct entry { + std::string type; + std::size_t size; + double data; + + template<class ARC> + void serialize (ARC& ar, const unsigned int) { + ar & BOOST_SERIALIZATION_NVP(type) + & BOOST_SERIALIZATION_NVP(size) + & BOOST_SERIALIZATION_NVP(data) + ; + } + + entry (void) { } + + entry (std::string type, std::size_t size, double data): + type(type), size(size), data(data) { } +}; + +struct result_set { + std::string compiler; + std::string platform; + std::list<entry> entries; + + template<class ARC> + void serialize (ARC& ar, const unsigned int) { + ar & BOOST_SERIALIZATION_NVP(compiler) + & BOOST_SERIALIZATION_NVP(platform) + & BOOST_SERIALIZATION_NVP(entries) + ; + + if ( (compiler != BOOST_COMPILER) + || (platform != BOOST_PLATFORM)) + throw result_set_exception(); + } + + result_set (void): + compiler(BOOST_COMPILER), + platform(BOOST_PLATFORM) { } + + result_set (std::list<entry> entries): + compiler(BOOST_COMPILER), + platform(BOOST_PLATFORM), + entries(entries) { } +}; + +} // xml +} // archive +} // boost + +#endif // BOOST_SERIALIZATION_XML_PERFORMANCE_HARNESS_HPP + |