1 // Copyright (c) 2008 Joseph Gauterin, Niels Dekker
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6
7 // Tests swapping an array of swap_test_template<int> objects by means of boost::swap.
8
9 #include <boost/utility/swap.hpp>
10 #include <boost/core/lightweight_test.hpp>
11 #define BOOST_CHECK BOOST_TEST
12 #define BOOST_CHECK_EQUAL BOOST_TEST_EQ
13
14 //Put test class in the global namespace
15 #include "./swap_test_class.hpp"
16
17 #include <algorithm> //for std::copy and std::equal
18 #include <cstddef> //for std::size_t
19
20 template <class T>
21 class swap_test_template
22 {
23 public:
24 typedef T template_argument;
25 swap_test_class swap_test_object;
26 };
27
28 template <class T>
operator ==(const swap_test_template<T> & lhs,const swap_test_template<T> & rhs)29 inline bool operator==(const swap_test_template<T> & lhs, const swap_test_template<T> & rhs)
30 {
31 return lhs.swap_test_object == rhs.swap_test_object;
32 }
33
34 template <class T>
operator !=(const swap_test_template<T> & lhs,const swap_test_template<T> & rhs)35 inline bool operator!=(const swap_test_template<T> & lhs, const swap_test_template<T> & rhs)
36 {
37 return !(lhs == rhs);
38 }
39
40 //Provide swap function in the namespace of swap_test_template
41 //(which is the global namespace). Note that it isn't allowed to put
42 //an overload of this function within the std namespace.
43 template <class T>
swap(swap_test_template<T> & left,swap_test_template<T> & right)44 void swap(swap_test_template<T>& left, swap_test_template<T>& right)
45 {
46 left.swap_test_object.swap(right.swap_test_object);
47 }
48
49
main()50 int main()
51 {
52 const std::size_t array_size = 2;
53 const swap_test_template<int> initial_array1[array_size] = { swap_test_class(1), swap_test_class(2) };
54 const swap_test_template<int> initial_array2[array_size] = { swap_test_class(3), swap_test_class(4) };
55
56 swap_test_template<int> array1[array_size];
57 swap_test_template<int> array2[array_size];
58
59 std::copy(initial_array1, initial_array1 + array_size, array1);
60 std::copy(initial_array2, initial_array2 + array_size, array2);
61
62 swap_test_class::reset();
63 boost::swap(array1, array2);
64
65 BOOST_CHECK(std::equal(array1, array1 + array_size, initial_array2));
66 BOOST_CHECK(std::equal(array2, array2 + array_size, initial_array1));
67
68 BOOST_CHECK_EQUAL(swap_test_class::swap_count(), array_size);
69 BOOST_CHECK_EQUAL(swap_test_class::copy_count(), 0);
70
71 return boost::report_errors();
72 }
73