test_optional.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
  2. // test_optional.cpp
  3. // (C) Copyright 2004 Pavel Vozenilek
  4. // Use, modification and distribution is subject to the Boost Software
  5. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. // should pass compilation and execution
  8. #include <cstddef> // NULL
  9. #include <cstdio> // remove
  10. #include <fstream>
  11. #include <boost/config.hpp>
  12. #if defined(BOOST_NO_STDC_NAMESPACE)
  13. namespace std{
  14. using ::remove;
  15. }
  16. #endif
  17. #include <boost/archive/archive_exception.hpp>
  18. #include "test_tools.hpp"
  19. #include <boost/serialization/optional.hpp>
  20. #include <boost/serialization/string.hpp>
  21. struct A {
  22. int m_x;
  23. template<class Archive>
  24. void serialize(Archive & ar, const unsigned int /* version */){
  25. ar & boost::serialization::make_nvp("x", m_x);
  26. };
  27. bool operator==(const A & rhs) const {
  28. return m_x == rhs.m_x;
  29. }
  30. // note that default constructor is not trivial
  31. A() :
  32. m_x(0)
  33. {}
  34. A(int x) :
  35. m_x(x)
  36. {}
  37. };
  38. int test_main( int /* argc */, char* /* argv */[] )
  39. {
  40. const char * testfile = boost::archive::tmpnam(NULL);
  41. BOOST_REQUIRE(NULL != testfile);
  42. const boost::optional<int> aoptional1;
  43. const boost::optional<int> aoptional2(123);
  44. const boost::optional<A> aoptional3;
  45. A a(1);
  46. const boost::optional<A> aoptional4(a);
  47. const boost::optional<A *> aoptional5;
  48. const boost::optional<A *> aoptional6(& a);
  49. {
  50. test_ostream os(testfile, TEST_STREAM_FLAGS);
  51. test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
  52. oa << boost::serialization::make_nvp("aoptional1",aoptional1);
  53. oa << boost::serialization::make_nvp("aoptional2",aoptional2);
  54. oa << boost::serialization::make_nvp("aoptional3",aoptional3);
  55. oa << boost::serialization::make_nvp("aoptional4",aoptional4);
  56. oa << boost::serialization::make_nvp("aoptional5",aoptional5);
  57. oa << boost::serialization::make_nvp("aoptional6",aoptional6);
  58. }
  59. boost::optional<int> aoptional1a(999);
  60. boost::optional<int> aoptional2a;
  61. boost::optional<A> aoptional3a;
  62. boost::optional<A> aoptional4a;
  63. boost::optional<A *> aoptional5a;
  64. boost::optional<A *> aoptional6a;
  65. {
  66. test_istream is(testfile, TEST_STREAM_FLAGS);
  67. test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
  68. ia >> boost::serialization::make_nvp("aoptional1",aoptional1a);
  69. ia >> boost::serialization::make_nvp("aoptional2",aoptional2a);
  70. ia >> boost::serialization::make_nvp("aoptional3",aoptional3a);
  71. ia >> boost::serialization::make_nvp("aoptional4",aoptional4a);
  72. ia >> boost::serialization::make_nvp("aoptional5",aoptional5a);
  73. ia >> boost::serialization::make_nvp("aoptional6",aoptional6a);
  74. }
  75. BOOST_CHECK(aoptional1 == aoptional1a);
  76. BOOST_CHECK(aoptional2 == aoptional2a);
  77. BOOST_CHECK(aoptional3 == aoptional3a);
  78. BOOST_CHECK(aoptional4.get() == aoptional4a.get());
  79. BOOST_CHECK(aoptional5 == aoptional5a);
  80. BOOST_CHECK(*aoptional6.get() == *aoptional6a.get());
  81. std::remove(testfile);
  82. return EXIT_SUCCESS;
  83. }
  84. // EOF