detail_array_wrapper_serialization_test.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright 2019 Hans Dembinski
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/archive/binary_iarchive.hpp>
  7. #include <boost/archive/binary_oarchive.hpp>
  8. #include <boost/archive/text_iarchive.hpp>
  9. #include <boost/archive/text_oarchive.hpp>
  10. #include <boost/core/lightweight_test.hpp>
  11. #include <boost/histogram/detail/array_wrapper.hpp>
  12. #include <sstream>
  13. #include <vector>
  14. #include "std_ostream.hpp"
  15. #include "throw_exception.hpp"
  16. namespace dtl = boost::histogram::detail;
  17. namespace ba = boost::archive;
  18. template <class T>
  19. struct dummy_array_wrapper {
  20. T* ptr;
  21. std::size_t size;
  22. template <class Archive>
  23. void serialize(Archive& ar, unsigned /* version */) {
  24. for (auto&& x : dtl::make_span(ptr, size)) ar& x;
  25. }
  26. };
  27. template <class OArchive, class IArchive>
  28. void run_tests() {
  29. std::vector<int> v = {{1, 2, 3}};
  30. std::stringstream os1;
  31. {
  32. OArchive oa(os1);
  33. auto w = dtl::make_array_wrapper(v.data(), v.size());
  34. oa << w;
  35. }
  36. std::ostringstream os2;
  37. {
  38. OArchive oa(os2);
  39. auto w = dummy_array_wrapper<int>{v.data(), v.size()};
  40. oa << w;
  41. }
  42. BOOST_TEST_EQ(os1.str(), os2.str());
  43. std::vector<int> v2(3, 0);
  44. {
  45. IArchive ia(os1);
  46. auto w = dtl::make_array_wrapper(v2.data(), v2.size());
  47. ia >> w;
  48. }
  49. BOOST_TEST_EQ(v, v2);
  50. }
  51. int main() {
  52. BOOST_TEST(dtl::has_array_optimization<ba::binary_oarchive>::value);
  53. BOOST_TEST(dtl::has_array_optimization<ba::binary_iarchive>::value);
  54. BOOST_TEST_NOT(dtl::has_array_optimization<ba::text_oarchive>::value);
  55. BOOST_TEST_NOT(dtl::has_array_optimization<ba::text_iarchive>::value);
  56. run_tests<ba::binary_oarchive, ba::binary_iarchive>();
  57. run_tests<ba::text_oarchive, ba::text_iarchive>();
  58. return boost::report_errors();
  59. }