1//
2// Boost.Pointer Container
3//
4// Copyright Thorsten Ottosen 2003-2005. Use, modification and
5// distribution is subject to the Boost Software License, Version
6// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9// For more information, see http://www.boost.org/libs/ptr_container/
10//
11
12#include "test_data.hpp"
13#include <boost/ptr_container/exception.hpp>
14#include <boost/ptr_container/detail/ptr_container_disable_deprecated.hpp>
15#include <boost/range/sub_range.hpp>
16
17#if defined(BOOST_PTR_CONTAINER_DISABLE_DEPRECATED)
18#pragma GCC diagnostic push
19#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
20#endif
21
22template< typename C, typename B, typename T, bool Ordered >
23void ptr_set_test();
24
25template< class T, bool Ordered >
26struct test_algorithms
27{
28 template< class Cont >
29 void operator()( Cont& c, const Cont& c2 ) const
30 {
31 typename Cont::iterator i;
32 typename Cont::const_iterator ci;
33
34 T* t = new T;
35 i = c.lower_bound( *t );
36 ci = c2.lower_bound( *t );
37 i = c.upper_bound( *t );
38 ci = c2.upper_bound( *t );
39 delete t;
40
41 BOOST_DEDUCED_TYPENAME Cont::reverse_iterator ri = c.rbegin();
42 hide_warning(ri);
43 BOOST_DEDUCED_TYPENAME Cont::const_reverse_iterator cri = c2.rbegin();
44 BOOST_DEDUCED_TYPENAME Cont::reverse_iterator rv2 = c.rend();
45 hide_warning(rv2);
46 BOOST_DEDUCED_TYPENAME Cont::const_reverse_iterator cvr2 = c2.rend();
47 hide_warning(cvr2);
48 cri = c.crbegin();
49 cri = c.crend();
50 }
51};
52
53template< class T >
54struct test_algorithms<T,false>
55{
56 template< class Cont>
57 void operator()( Cont& c, const Cont& c2 ) const
58 {
59 }
60};
61
62template< typename C, typename B, typename T, bool Ordered >
63void ptr_set_test()
64{
65 using namespace boost;
66
67 BOOST_TEST_MESSAGE( "starting associative container test" );
68 enum { max_cnt = 10, size = 100 };
69 C c;
70 BOOST_CHECK( c.size() == 0 );
71 c.insert( c.end(), new T );
72 c.insert( c.end(), new T );
73
74 const C c2( c.begin(), c.end() );
75 BOOST_CHECK( c.size() == c2.size() );
76
77 C c3;
78
79 BOOST_TEST_MESSAGE( "finished construction test" );
80
81 C a_copy( c );
82 BOOST_CHECK_EQUAL( a_copy.size(), c.size() );
83 a_copy = a_copy;
84 BOOST_CHECK_EQUAL( a_copy.size(), c.size() );
85 c.clear();
86 a_copy = c;
87 a_copy = a_copy;
88 BOOST_CHECK( a_copy.empty() );
89
90 BOOST_TEST_MESSAGE( "finished copying test" );
91
92 BOOST_DEDUCED_TYPENAME C::allocator_type alloc = c.get_allocator();
93 BOOST_DEDUCED_TYPENAME C::iterator i = c.begin();
94 BOOST_DEDUCED_TYPENAME C::const_iterator ci = c2.begin();
95 ci = c.cbegin();
96 ci = c.cend();
97 BOOST_DEDUCED_TYPENAME C::iterator i2 = c.end();
98 hide_warning(i2);
99 BOOST_DEDUCED_TYPENAME C::const_iterator ci2 = c2.begin();
100 hide_warning(ci2);
101
102 BOOST_TEST_MESSAGE( "finished iterator test" );
103
104 BOOST_DEDUCED_TYPENAME C::size_type s = c.size();
105 BOOST_DEDUCED_TYPENAME C::size_type s2 = c.max_size();
106 hide_warning(s2);
107 BOOST_CHECK_EQUAL( c.size(), s );
108 bool b = c.empty();
109 hide_warning(b);
110 BOOST_TEST_MESSAGE( "finished accessors test" );
111
112 T* t = new T;
113 c.insert( c.end(), t );
114 c.insert( new T );
115#ifndef BOOST_NO_AUTO_PTR
116 c.insert( c.end(), std::auto_ptr<T>( new T ) );
117 std::auto_ptr<T> ap( new T );
118 c.insert( ap );
119#endif
120#ifndef BOOST_NO_CXX11_SMART_PTR
121 c.insert( c.end(), std::unique_ptr<T>( new T ) );
122 std::unique_ptr<T> up( new T );
123 c.insert( std::move( up ) );
124#endif
125 c3.insert( c.begin(), c.end() );
126 c.erase( c.begin() );
127 c3.erase( c3.begin(), c3.end() );
128 t = new T;
129 c.insert( new T );
130 c.erase( *t );
131 delete t;
132
133 BOOST_CHECK( c3.empty() );
134 c.swap( c3 );
135 BOOST_CHECK( !c3.empty() );
136 BOOST_CHECK( c.empty() );
137 c3.clear();
138
139 //
140 // remark: we cannot pass c3 directly as it would
141 // extract const iterators ... and the
142 // current standard does not allow erase()
143 // to be given const iterators
144 //
145 c3.erase( boost::make_iterator_range(c3) );
146 BOOST_CHECK( c3.empty() );
147 BOOST_TEST_MESSAGE( "finished modifiers test" );
148
149 c.insert( c.end(), new T );
150 typename C::auto_type ptr2 = c.release( c.begin() );
151#ifndef BOOST_NO_AUTO_PTR
152 std::auto_ptr<C> ap2 = c.release();
153#else
154 std::unique_ptr<C> up2 = c.release();
155#endif
156 c = c2.clone();
157 BOOST_TEST_MESSAGE( "finished release/clone test" );
158
159 c3.insert( new T );
160 c3.insert( new T );
161 BOOST_CHECK_EQUAL( c3.size(), 2u );
162#if defined(BOOST_NO_SFINAE) || defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
163#else
164 c3.insert( make_iterator_range( c ) );
165// BOOST_CHECK_EQUAL( c3.size(), 4u );
166#endif
167 c. BOOST_NESTED_TEMPLATE transfer<C>( c3.begin(), c3 );
168 BOOST_CHECK( c3.empty() == false );
169 c.clear();
170 unsigned long c3size = c3.size();
171 hide_warning( c3size );
172 unsigned long num = c. BOOST_NESTED_TEMPLATE transfer<C>( c3.begin(),
173 c3.end(),
174 c3 );
175
176 BOOST_CHECK( num > 0 );
177 BOOST_CHECK_EQUAL( num, c.size() );
178 BOOST_CHECK( c3.empty() );
179 BOOST_CHECK( !c.empty() );
180 c3. BOOST_NESTED_TEMPLATE transfer<C>( c );
181 BOOST_CHECK( !c3.empty() );
182 BOOST_CHECK( c.empty() );
183#ifdef BOOST_NO_SFINAE
184#else
185 c. BOOST_NESTED_TEMPLATE transfer<C>( make_iterator_range( c3 ), c3 );
186 BOOST_CHECK( !c.empty() );
187 BOOST_CHECK( c3.empty() );
188#endif
189
190 BOOST_TEST_MESSAGE( "finished transfer test" );
191
192 C c4;
193 c4.swap(c3);
194 swap(c4,c3);
195 BOOST_TEST_MESSAGE( "finished set/map interface test" );
196
197 sub_range<C> sub;
198 sub_range<const C> csub;
199
200 t = new T;
201 i = c.find( *t );
202 ci = c2.find( *t );
203 c2.count( *t );
204
205 test_algorithms<T,Ordered>()( c, c2 );
206 sub = c.equal_range( *t );
207 csub = c2.equal_range( *t );
208 delete t;
209
210 BOOST_TEST_MESSAGE( "finished algorithms interface test" );
211
212}
213
214#if defined(BOOST_PTR_CONTAINER_DISABLE_DEPRECATED)
215#pragma GCC diagnostic pop
216#endif
217

source code of boost/libs/ptr_container/test/associative_test_data.hpp