ReactOS 0.4.15-dev-7934-g1dc8d80
set_test.cpp
Go to the documentation of this file.
1//Has to be first for StackAllocator swap overload to be taken
2//into account (at least using GCC 4.0.1)
3#include "stack_allocator.h"
4
5#include <set>
6#include <algorithm>
7
9
10#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
11using namespace std;
12#endif
13
14//
15// TestCase class
16//
17class SetTest : public CPPUNIT_NS::TestCase
18{
30#if !defined (STLPORT) || !defined (_STLP_USE_CONTAINERS_EXTENSION)
32#endif
35
36protected:
37 void set1();
38 void set2();
39 void erase();
40 void insert();
41 void find();
42 void bounds();
43 void specialized_less();
47 void template_methods();
48};
49
51
52
53//
54// tests implementation
55//
57{
59 CPPUNIT_ASSERT (s.count(42) == 0);
60 s.insert(42);
61 CPPUNIT_ASSERT (s.count(42) == 1);
62 s.insert(42);
63 CPPUNIT_ASSERT (s.count(42) == 1);
64 size_t count = s.erase(42);
65 CPPUNIT_ASSERT (count == 1);
66}
67
69{
70 typedef set<int, less<int> > int_set;
71 int_set s;
73 CPPUNIT_ASSERT (p.second == true);
74 p = s.insert(42);
75 CPPUNIT_ASSERT (p.second == false);
76
77 int array1 [] = { 1, 3, 6, 7 };
78 s.insert(array1, array1 + 4);
79 CPPUNIT_ASSERT (distance(s.begin(), s.end()) == 5);
80
81 int_set s2;
82 s2.swap(s);
83 CPPUNIT_ASSERT (distance(s2.begin(), s2.end()) == 5);
84 CPPUNIT_ASSERT (distance(s.begin(), s.end()) == 0);
85
86 int_set s3;
87 s3.swap(s);
88 s3.swap(s2);
89 CPPUNIT_ASSERT (distance(s.begin(), s.end()) == 0);
90 CPPUNIT_ASSERT (distance(s2.begin(), s2.end()) == 0);
91 CPPUNIT_ASSERT (distance(s3.begin(), s3.end()) == 5);
92}
93
95{
97 s.insert(1);
98 s.erase(s.begin());
99 CPPUNIT_ASSERT( s.empty() );
100
101 size_t nb = s.erase(1);
102 CPPUNIT_ASSERT(nb == 0);
103}
104
106{
107 set<int> s;
108 set<int>::iterator i = s.insert( s.end(), 0 );
109 CPPUNIT_ASSERT( *i == 0 );
110}
111
113{
114 set<int> s;
115
116 CPPUNIT_ASSERT( s.find(0) == s.end() );
117
118 set<int> const& crs = s;
119
120 CPPUNIT_ASSERT( crs.find(0) == crs.end() );
121}
122
124{
125 int array1 [] = { 1, 3, 6, 7 };
126 set<int> s(array1, array1 + sizeof(array1) / sizeof(array1[0]));
127 set<int> const& crs = s;
128
133
134 //Check iterator on mutable set
135 sit = s.lower_bound(2);
136 CPPUNIT_ASSERT( sit != s.end() );
137 CPPUNIT_ASSERT( *sit == 3 );
138
139 sit = s.upper_bound(5);
140 CPPUNIT_ASSERT( sit != s.end() );
141 CPPUNIT_ASSERT( *sit == 6 );
142
143 pit = s.equal_range(6);
144 CPPUNIT_ASSERT( pit.first != pit.second );
145 CPPUNIT_ASSERT( pit.first != s.end() );
146 CPPUNIT_ASSERT( *pit.first == 6 );
147 CPPUNIT_ASSERT( pit.second != s.end() );
148 CPPUNIT_ASSERT( *pit.second == 7 );
149
150 pit = s.equal_range(4);
151 CPPUNIT_ASSERT( pit.first == pit.second );
152 CPPUNIT_ASSERT( pit.first != s.end() );
153 CPPUNIT_ASSERT( *pit.first == 6 );
154 CPPUNIT_ASSERT( pit.second != s.end() );
155 CPPUNIT_ASSERT( *pit.second == 6 );
156
157 //Check const_iterator on mutable set
158 scit = s.lower_bound(2);
159 CPPUNIT_ASSERT( scit != s.end() );
160 CPPUNIT_ASSERT( *scit == 3 );
161
162 scit = s.upper_bound(5);
163 CPPUNIT_ASSERT( scit != s.end() );
164 CPPUNIT_ASSERT( *scit == 6 );
165
166#ifdef _STLP_MEMBER_TEMPLATES
167 pcit = s.equal_range(6);
168 CPPUNIT_ASSERT( pcit.first != pcit.second );
169 CPPUNIT_ASSERT( pcit.first != s.end() );
170 CPPUNIT_ASSERT( *pcit.first == 6 );
171 CPPUNIT_ASSERT( pcit.second != s.end() );
172 CPPUNIT_ASSERT( *pcit.second == 7 );
173#endif
174
175 //Check const_iterator on const set
176 scit = crs.lower_bound(2);
177 CPPUNIT_ASSERT( scit != crs.end() );
178 CPPUNIT_ASSERT( *scit == 3 );
179
180 scit = crs.upper_bound(5);
181 CPPUNIT_ASSERT( scit != crs.end() );
182 CPPUNIT_ASSERT( *scit == 6 );
183
184 pcit = crs.equal_range(6);
185 CPPUNIT_ASSERT( pcit.first != pcit.second );
186 CPPUNIT_ASSERT( pcit.first != crs.end() );
187 CPPUNIT_ASSERT( *pcit.first == 6 );
188 CPPUNIT_ASSERT( pcit.second != crs.end() );
189 CPPUNIT_ASSERT( *pcit.second == 7 );
190}
191
192
194public:
196 {}
197
198 int data() const {
199 return _data;
200 }
201
202private:
203 int _data;
204};
205
206#if !defined (STLPORT) || defined (_STLP_USE_NAMESPACES)
207namespace std {
208#endif
209#if defined (STLPORT)
211#else
212 template <>
213#endif
215 bool operator () (SetTestClass const& lhs, SetTestClass const& rhs) const {
216 return lhs.data() < rhs.data();
217 }
218 };
219#if !defined (STLPORT) || defined (_STLP_USE_NAMESPACES)
220}
221#endif
222
224{
226 s.insert(SetTestClass(1));
227 s.insert(SetTestClass(3));
228 s.insert(SetTestClass(2));
229 s.insert(SetTestClass(0));
230
231 set<SetTestClass>::iterator sit(s.begin()), sitEnd(s.end());
232 int i = 0;
233 for (; sit != sitEnd; ++sit, ++i) {
234 CPPUNIT_ASSERT( sit->data() == i );
235 }
236}
237
239{
241 tree.insert(1);
242 set<int>::iterator it = tree.begin();
243 int const& int_ref = *it++;
244 CPPUNIT_ASSERT( int_ref == 1 );
245
246 CPPUNIT_ASSERT( it == tree.end() );
247 CPPUNIT_ASSERT( it != tree.begin() );
248
249 set<int>::const_iterator cit = tree.begin();
250 int const& int_cref = *cit++;
251 CPPUNIT_ASSERT( int_cref == 1 );
252}
253
255{
257 tree.insert(1);
258 tree.insert(2);
259
260 {
261 set<int>::reverse_iterator rit(tree.rbegin());
262 CPPUNIT_ASSERT( *(rit++) == 2 );
263 CPPUNIT_ASSERT( *(rit++) == 1 );
264 CPPUNIT_ASSERT( rit == tree.rend() );
265 }
266
267 {
268 set<int> const& ctree = tree;
270 CPPUNIT_ASSERT( *(rit++) == 2 );
271 CPPUNIT_ASSERT( *(rit++) == 1 );
272 CPPUNIT_ASSERT( rit == ctree.rend() );
273 }
274}
275
277{
278 char buf1[1024];
279 StackAllocator<int> stack1(buf1, buf1 + sizeof(buf1));
280
281 char buf2[1024];
282 StackAllocator<int> stack2(buf2, buf2 + sizeof(buf2));
283
284 int i;
286 less<int> intLess;
287
288 {
289 SetInt sint1(intLess, stack1);
290 for (i = 0; i < 5; ++i)
291 sint1.insert(i);
292 SetInt sint1Cpy(sint1);
293
294 SetInt sint2(intLess, stack2);
295 for (; i < 10; ++i)
296 sint2.insert(i);
297 SetInt sint2Cpy(sint2);
298
299 sint1.swap(sint2);
300
301 CPPUNIT_ASSERT( sint1.get_allocator().swaped() );
302 CPPUNIT_ASSERT( sint2.get_allocator().swaped() );
303
304 CPPUNIT_ASSERT( sint1 == sint2Cpy );
305 CPPUNIT_ASSERT( sint2 == sint1Cpy );
306 CPPUNIT_ASSERT( sint1.get_allocator() == stack2 );
307 CPPUNIT_ASSERT( sint2.get_allocator() == stack1 );
308 }
309 CPPUNIT_ASSERT( stack1.ok() );
310 CPPUNIT_ASSERT( stack2.ok() );
311 stack1.reset(); stack2.reset();
312
313 {
314 SetInt sint1(intLess, stack1);
315 SetInt sint1Cpy(sint1);
316
317 SetInt sint2(intLess, stack2);
318 for (i = 0; i < 10; ++i)
319 sint2.insert(i);
320 SetInt sint2Cpy(sint2);
321
322 sint1.swap(sint2);
323
324 CPPUNIT_ASSERT( sint1.get_allocator().swaped() );
325 CPPUNIT_ASSERT( sint2.get_allocator().swaped() );
326
327 CPPUNIT_ASSERT( sint1 == sint2Cpy );
328 CPPUNIT_ASSERT( sint2 == sint1Cpy );
329 CPPUNIT_ASSERT( sint1.get_allocator() == stack2 );
330 CPPUNIT_ASSERT( sint2.get_allocator() == stack1 );
331 }
332 CPPUNIT_ASSERT( stack1.ok() );
333 CPPUNIT_ASSERT( stack2.ok() );
334 stack1.reset(); stack2.reset();
335
336 {
337 SetInt sint1(intLess, stack1);
338 for (i = 0; i < 10; ++i)
339 sint1.insert(i);
340 SetInt sint1Cpy(sint1);
341
342 SetInt sint2(intLess, stack2);
343 SetInt sint2Cpy(sint2);
344
345 sint1.swap(sint2);
346
347 CPPUNIT_ASSERT( sint1.get_allocator().swaped() );
348 CPPUNIT_ASSERT( sint2.get_allocator().swaped() );
349
350 CPPUNIT_ASSERT( sint1 == sint2Cpy );
351 CPPUNIT_ASSERT( sint2 == sint1Cpy );
352 CPPUNIT_ASSERT( sint1.get_allocator() == stack2 );
353 CPPUNIT_ASSERT( sint2.get_allocator() == stack1 );
354 }
355 CPPUNIT_ASSERT( stack1.ok() );
356 CPPUNIT_ASSERT( stack2.ok() );
357 stack1.reset(); stack2.reset();
358}
359
360struct Key
361{
362 Key() : m_data(0) {}
363 explicit Key(int data) : m_data(data) {}
364
365 int m_data;
366};
367
368struct KeyCmp
369{
370 bool operator () (Key lhs, Key rhs) const
371 { return lhs.m_data < rhs.m_data; }
372
373 bool operator () (Key lhs, int rhs) const
374 { return lhs.m_data < rhs; }
375
376 bool operator () (int lhs, Key rhs) const
377 { return lhs < rhs.m_data; }
378};
379
380struct KeyCmpPtr
381{
382 bool operator () (Key const volatile *lhs, Key const volatile *rhs) const
383 { return (*lhs).m_data < (*rhs).m_data; }
384
385 bool operator () (Key const volatile *lhs, int rhs) const
386 { return (*lhs).m_data < rhs; }
387
388 bool operator () (int lhs, Key const volatile *rhs) const
389 { return lhs < (*rhs).m_data; }
390};
391
393{
394#if defined (STLPORT) && defined (_STLP_USE_CONTAINERS_EXTENSION)
395 {
396 typedef set<Key, KeyCmp> KeySet;
397 KeySet keySet;
398 keySet.insert(Key(1));
399 keySet.insert(Key(2));
400 keySet.insert(Key(3));
401 keySet.insert(Key(4));
402
403 CPPUNIT_ASSERT( keySet.count(Key(1)) == 1 );
404 CPPUNIT_ASSERT( keySet.count(1) == 1 );
405 CPPUNIT_ASSERT( keySet.count(5) == 0 );
406
407 CPPUNIT_ASSERT( keySet.find(2) != keySet.end() );
408 CPPUNIT_ASSERT( keySet.lower_bound(2) != keySet.end() );
409 CPPUNIT_ASSERT( keySet.upper_bound(2) != keySet.end() );
410 CPPUNIT_ASSERT( keySet.equal_range(2) != make_pair(keySet.begin(), keySet.end()) );
411
412 KeySet const& ckeySet = keySet;
413 CPPUNIT_ASSERT( ckeySet.find(2) != ckeySet.end() );
414 CPPUNIT_ASSERT( ckeySet.lower_bound(2) != ckeySet.end() );
415 CPPUNIT_ASSERT( ckeySet.upper_bound(2) != ckeySet.end() );
416 CPPUNIT_ASSERT( ckeySet.equal_range(2) != make_pair(ckeySet.begin(), ckeySet.end()) );
417 }
418
419 {
420 typedef set<Key*, KeyCmpPtr> KeySet;
421 KeySet keySet;
422 Key key1(1), key2(2), key3(3), key4(4);
423 keySet.insert(&key1);
424 keySet.insert(&key2);
425 keySet.insert(&key3);
426 keySet.insert(&key4);
427
428 CPPUNIT_ASSERT( keySet.count(1) == 1 );
429 CPPUNIT_ASSERT( keySet.count(5) == 0 );
430
431 CPPUNIT_ASSERT( keySet.find(2) != keySet.end() );
432 CPPUNIT_ASSERT( keySet.lower_bound(2) != keySet.end() );
433 CPPUNIT_ASSERT( keySet.upper_bound(2) != keySet.end() );
434 CPPUNIT_ASSERT( keySet.equal_range(2) != make_pair(keySet.begin(), keySet.end()) );
435
436 KeySet const& ckeySet = keySet;
437 CPPUNIT_ASSERT( ckeySet.find(2) != ckeySet.end() );
438 CPPUNIT_ASSERT( ckeySet.lower_bound(2) != ckeySet.end() );
439 CPPUNIT_ASSERT( ckeySet.upper_bound(2) != ckeySet.end() );
440 CPPUNIT_ASSERT( ckeySet.equal_range(2) != make_pair(ckeySet.begin(), ckeySet.end()) );
441 }
442 {
443 typedef multiset<Key, KeyCmp> KeySet;
444 KeySet keySet;
445 keySet.insert(Key(1));
446 keySet.insert(Key(2));
447 keySet.insert(Key(3));
448 keySet.insert(Key(4));
449
450 CPPUNIT_ASSERT( keySet.count(Key(1)) == 1 );
451 CPPUNIT_ASSERT( keySet.count(1) == 1 );
452 CPPUNIT_ASSERT( keySet.count(5) == 0 );
453
454 CPPUNIT_ASSERT( keySet.find(2) != keySet.end() );
455 CPPUNIT_ASSERT( keySet.lower_bound(2) != keySet.end() );
456 CPPUNIT_ASSERT( keySet.upper_bound(2) != keySet.end() );
457 CPPUNIT_ASSERT( keySet.equal_range(2) != make_pair(keySet.begin(), keySet.end()) );
458
459 KeySet const& ckeySet = keySet;
460 CPPUNIT_ASSERT( ckeySet.find(2) != ckeySet.end() );
461 CPPUNIT_ASSERT( ckeySet.lower_bound(2) != ckeySet.end() );
462 CPPUNIT_ASSERT( ckeySet.upper_bound(2) != ckeySet.end() );
463 CPPUNIT_ASSERT( ckeySet.equal_range(2) != make_pair(ckeySet.begin(), ckeySet.end()) );
464 }
465
466 {
468 KeySet keySet;
469 Key key1(1), key2(2), key3(3), key4(4);
470 keySet.insert(&key1);
471 keySet.insert(&key2);
472 keySet.insert(&key3);
473 keySet.insert(&key4);
474
475 CPPUNIT_ASSERT( keySet.count(1) == 1 );
476 CPPUNIT_ASSERT( keySet.count(5) == 0 );
477
478 CPPUNIT_ASSERT( keySet.find(2) != keySet.end() );
479 CPPUNIT_ASSERT( keySet.lower_bound(2) != keySet.end() );
480 CPPUNIT_ASSERT( keySet.upper_bound(2) != keySet.end() );
481 CPPUNIT_ASSERT( keySet.equal_range(2) != make_pair(keySet.begin(), keySet.end()) );
482
483 KeySet const& ckeySet = keySet;
484 CPPUNIT_ASSERT( ckeySet.find(2) != ckeySet.end() );
485 CPPUNIT_ASSERT( ckeySet.lower_bound(2) != ckeySet.end() );
486 CPPUNIT_ASSERT( ckeySet.upper_bound(2) != ckeySet.end() );
487 CPPUNIT_ASSERT( ckeySet.equal_range(2) != make_pair(ckeySet.begin(), ckeySet.end()) );
488 }
489#endif
490}
491
492#if !defined (STLPORT) || \
493 !defined (_STLP_USE_PTR_SPECIALIZATIONS) || defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
494# if !defined (__DMC__)
495/* Simple compilation test: Check that nested types like iterator
496 * can be access even if type used to instanciate container is not
497 * yet completely defined.
498 */
499class IncompleteClass
500{
505};
506# endif
507#endif
pair< _T1, _T2 > _STLP_CALL make_pair(_T1 __x, _T2 __y)
Definition: _pair.h:124
struct _tree tree
set< IncompleteClass > instances
Definition: set_test.cpp:501
set< IncompleteClass >::iterator it
Definition: set_test.cpp:502
multiset< IncompleteClass >::iterator mit
Definition: set_test.cpp:504
multiset< IncompleteClass > minstances
Definition: set_test.cpp:503
int data() const
Definition: set_test.cpp:198
SetTestClass(int data)
Definition: set_test.cpp:195
void template_methods()
Definition: set_test.cpp:392
void implementation_check()
Definition: set_test.cpp:238
CPPUNIT_TEST(reverse_iterator_test)
CPPUNIT_TEST(allocator_with_state)
CPPUNIT_TEST(implementation_check)
void allocator_with_state()
Definition: set_test.cpp:276
void find()
Definition: set_test.cpp:112
void bounds()
Definition: set_test.cpp:123
void erase()
Definition: set_test.cpp:94
CPPUNIT_TEST(set2)
CPPUNIT_TEST(specialized_less)
CPPUNIT_TEST_SUITE_END()
void insert()
Definition: set_test.cpp:105
CPPUNIT_IGNORE
Definition: set_test.cpp:31
CPPUNIT_TEST(template_methods)
CPPUNIT_TEST_SUITE(SetTest)
void set1()
Definition: set_test.cpp:56
CPPUNIT_TEST(erase)
void set2()
Definition: set_test.cpp:68
CPPUNIT_TEST(bounds)
void specialized_less()
Definition: set_test.cpp:223
CPPUNIT_TEST(find)
void reverse_iterator_test()
Definition: set_test.cpp:254
CPPUNIT_TEST(insert)
CPPUNIT_TEST(set1)
Definition: _set.h:220
iterator insert(const value_type &__x)
Definition: _set.h:339
_Rep_type::iterator iterator
Definition: _set.h:244
Definition: _set.h:50
_Rep_type::reverse_iterator reverse_iterator
Definition: _set.h:75
_STLP_TEMPLATE_FOR_CONT_EXT iterator upper_bound(const _KT &__x)
Definition: _set.h:200
iterator end()
Definition: _set.h:152
pair< iterator, bool > insert(const value_type &__x)
Definition: _set.h:168
_Rep_type::const_reverse_iterator const_reverse_iterator
Definition: _set.h:76
reverse_iterator rbegin()
Definition: _set.h:155
_STLP_TEMPLATE_FOR_CONT_EXT iterator lower_bound(const _KT &__x)
Definition: _set.h:196
_Rep_type::const_iterator const_iterator
Definition: _set.h:74
reverse_iterator rend()
Definition: _set.h:156
_Rep_type::iterator iterator
Definition: _set.h:73
#define CPPUNIT_TEST_SUITE_REGISTRATION(X)
Definition: cppunit_mini.h:193
#define CPPUNIT_ASSERT(X)
Definition: cppunit_mini.h:200
#define _STLP_TEMPLATE_NULL
Definition: features.h:652
GLdouble s
Definition: gl.h:2039
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizei GLsizei GLfloat distance
Definition: glext.h:11755
GLfloat GLfloat p
Definition: glext.h:8902
GLuint64EXT GLuint GLuint GLenum GLenum GLuint GLuint GLenum GLuint GLuint key1
Definition: glext.h:10608
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static const WCHAR crs[]
struct S2 s2
@ SetInt
Definition: shader.c:1966
Definition: features.h:417
bool operator()(Key const volatile *lhs, Key const volatile *rhs) const
Definition: map_test.cpp:325
bool operator()(Key lhs, Key rhs) const
Definition: map_test.cpp:313
int m_data
Definition: map_test.cpp:308
Key()
Definition: set_test.cpp:362
Key(int data)
Definition: set_test.cpp:363
bool ok() const
Definition: _pair.h:47
_T2 second
Definition: _pair.h:52
_T1 first
Definition: _pair.h:51