• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2 // test_vector.cpp
3 
4 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
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 <fstream>
13 
14 #include <cstdio> // remove
15 #include <boost/config.hpp>
16 #if defined(BOOST_NO_STDC_NAMESPACE)
17 namespace std{
18     using ::remove;
19 }
20 #endif
21 #include <boost/static_assert.hpp>
22 #include "test_tools.hpp"
23 
24 #include <boost/serialization/vector.hpp>
25 
26 // normal class with default constructor
27 #include "A.hpp"
28 #include "A.ipp"
29 
30 template <class T>
test_vector_detail(const std::vector<T> & avector)31 int test_vector_detail(const std::vector<T> & avector)
32 {
33     const char * testfile = boost::archive::tmpnam(NULL);
34     BOOST_REQUIRE(NULL != testfile);
35 
36     // test array of objects
37     {
38         test_ostream os(testfile, TEST_STREAM_FLAGS);
39         test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
40         oa << boost::serialization::make_nvp("avector", avector);
41     }
42     std::vector< T > avector1;
43     {
44         test_istream is(testfile, TEST_STREAM_FLAGS);
45         test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
46         ia >> boost::serialization::make_nvp("avector", avector1);
47     }
48     BOOST_CHECK(avector == avector1);
49     std::remove(testfile);
50     return EXIT_SUCCESS;
51 }
52 
53 template <class T>
test_default_constructible()54 int test_default_constructible()
55 {
56     // test array of objects
57     std::vector<T> avector;
58     avector.push_back(T());
59     avector.push_back(T());
60     return test_vector_detail(avector);
61 }
62 
63 // class without default constructor
64 struct X {
65     //BOOST_DELETED_FUNCTION(X());
66 public:
67     int m_i;
XX68     X(const X & x) :
69         m_i(x.m_i)
70     {}
XX71     X(const int & i) :
72         m_i(i)
73     {}
operator ==X74     bool operator==(const X & rhs) const {
75         return m_i == rhs.m_i;
76     }
77     template<class Archive>
serializeX78     void serialize(Archive & ar, const unsigned int /*version*/){
79         ar & BOOST_SERIALIZATION_NVP(m_i);
80     }
81 };
82 
83 template<class Archive>
save_construct_data(Archive & ar,const X * x,const unsigned int)84 inline void save_construct_data(
85     Archive & ar,
86     const X * x,
87     const unsigned int /* file_version */
88 ){
89     // variable used for construction
90     ar << boost::serialization::make_nvp("i", x->m_i);
91 }
92 
93 template<class Archive>
load_construct_data(Archive & ar,X * x,const unsigned int)94 inline void load_construct_data(
95     Archive & ar,
96     X * x,
97     const unsigned int /* file_version */
98 ){
99     int i;
100     ar >> boost::serialization::make_nvp("i", i);
101     ::new(x)X(i);
102 }
103 
test_non_default_constructible()104 int test_non_default_constructible()
105 {
106     // test array of objects
107     std::vector<X> avector;
108     avector.push_back(X(123));
109     avector.push_back(X(456));
110     return test_vector_detail(avector);
111 }
112 
test_main(int,char * [])113 int test_main( int /* argc */, char* /* argv */[] )
114 {
115     int res;
116     res = test_default_constructible<A>();
117     // test an int vector for which optimized versions should be available
118     if (res == EXIT_SUCCESS)
119         res = test_default_constructible<int>();
120     // test a bool vector
121     if (res == EXIT_SUCCESS)
122         res = test_default_constructible<bool>();
123     if (res == EXIT_SUCCESS)
124         res = test_non_default_constructible();
125     return res;
126 }
127 
128 // EOF
129