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)
18namespace std{
19 using ::remove;
20}
21#endif
22
23#include <boost/archive/archive_exception.hpp>
24#include "test_tools.hpp"
25
26
27struct 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
46template<template<class> class Optional>
47int 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
100int 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

source code of boost/libs/serialization/test/test_optional.cpp