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