• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
22 template< typename C, typename B, typename T, bool Ordered >
23 void ptr_set_test();
24 
25 template< class T, bool Ordered >
26 struct test_algorithms
27 {
28     template< class Cont >
operator ()test_algorithms29     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 
53 template< class T >
54 struct test_algorithms<T,false>
55 {
56     template< class Cont>
operator ()test_algorithms57     void operator()( Cont& c, const Cont& c2 ) const
58     {
59     }
60 };
61 
62 template< typename C, typename B, typename T, bool Ordered >
ptr_set_test()63 void 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