ReactOS 0.4.16-dev-338-g34e76ad
map_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 <map>
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 MapTest : public CPPUNIT_NS::TestCase
18{
26#if !defined (STLPORT) || !defined (_STLP_USE_CONTAINERS_EXTENSION)
28#endif
31
32protected:
33 void map1();
34 void mmap1();
35 void mmap2();
36 void iterators();
37 void equal_range();
39 void template_methods();
40};
41
43
44//
45// tests implementation
46//
48{
49 typedef map<char, int, less<char> > maptype;
50 maptype m;
51 // Store mappings between roman numerals and decimals.
52 m['l'] = 50;
53 m['x'] = 20; // Deliberate mistake.
54 m['v'] = 5;
55 m['i'] = 1;
56// cout << "m['x'] = " << m['x'] << endl;
57 CPPUNIT_ASSERT( m['x']== 20 );
58 m['x'] = 10; // Correct mistake.
59 CPPUNIT_ASSERT( m['x']== 10 );
60 CPPUNIT_ASSERT( m['z']== 0 );
61 //cout << "m['z'] = " << m['z'] << endl; // Note default value is added.
62 CPPUNIT_ASSERT( m.count('z') == 1 );
63 //cout << "m.count('z') = " << m.count('z') << endl;
65 CPPUNIT_ASSERT( p.second );
66 CPPUNIT_ASSERT( p.first != m.end() );
67 CPPUNIT_ASSERT( (*p.first).first == 'c' );
68 CPPUNIT_ASSERT( (*p.first).second == 100 );
69
70 p = m.insert(pair<const char, int>('c', 100));
71 CPPUNIT_ASSERT( !p.second ); // already existing pair
72 CPPUNIT_ASSERT( p.first != m.end() );
73 CPPUNIT_ASSERT( (*p.first).first == 'c' );
74 CPPUNIT_ASSERT( (*p.first).second == 100 );
75}
76
78{
79 typedef multimap<char, int, less<char> > mmap;
80 mmap m;
81 CPPUNIT_ASSERT(m.count('X')==0);
82
83 m.insert(pair<const char, int>('X', 10)); // Standard way.
84 CPPUNIT_ASSERT(m.count('X')==1);
85
86 m.insert(pair<const char, int>('X', 20)); // jbuck: standard way
87 CPPUNIT_ASSERT(m.count('X')==2);
88
89 m.insert(pair<const char, int>('Y', 32)); // jbuck: standard way
90 mmap::iterator i = m.find('X'); // Find first match.
91#ifndef _STLP_CONST
92# define _STLP_CONST const
93#endif
95 CPPUNIT_ASSERT(*i == p);
96 CPPUNIT_ASSERT((*i).first == 'X');
97 CPPUNIT_ASSERT((*i).second == 10);
98 i++;
99 CPPUNIT_ASSERT((*i).first == 'X');
100 CPPUNIT_ASSERT((*i).second == 20);
101 i++;
102 CPPUNIT_ASSERT((*i).first == 'Y');
103 CPPUNIT_ASSERT((*i).second == 32);
104 i++;
105 CPPUNIT_ASSERT(i == m.end());
106
107 size_t count = m.erase('X');
109}
111{
112 typedef pair<const int, char> pair_type;
113
114 pair_type p1(3, 'c');
115 pair_type p2(6, 'f');
116 pair_type p3(1, 'a');
117 pair_type p4(2, 'b');
118 pair_type p5(3, 'x');
119 pair_type p6(6, 'f');
120
121 typedef multimap<int, char, less<int> > mmap;
122
123 pair_type array [] = {
124 p1,
125 p2,
126 p3,
127 p4,
128 p5,
129 p6
130 };
131
132 mmap m(array + 0, array + 6);
133 mmap::iterator i;
134 i = m.lower_bound(3);
135 CPPUNIT_ASSERT((*i).first==3);
136 CPPUNIT_ASSERT((*i).second=='c');
137
138 i = m.upper_bound(3);
139 CPPUNIT_ASSERT((*i).first==6);
140 CPPUNIT_ASSERT((*i).second=='f');
141}
142
143
145{
146 typedef map<int, char, less<int> > int_map;
147 int_map imap;
148 {
149 int_map::iterator ite(imap.begin());
150 int_map::const_iterator cite(imap.begin());
151 CPPUNIT_ASSERT( ite == cite );
152 CPPUNIT_ASSERT( !(ite != cite) );
153 CPPUNIT_ASSERT( cite == ite );
154 CPPUNIT_ASSERT( !(cite != ite) );
155 }
156
157 typedef multimap<int, char, less<int> > mmap;
158 typedef mmap::value_type pair_type;
159
160 pair_type p1(3, 'c');
161 pair_type p2(6, 'f');
162 pair_type p3(1, 'a');
163 pair_type p4(2, 'b');
164 pair_type p5(3, 'x');
165 pair_type p6(6, 'f');
166
167 pair_type array [] = {
168 p1,
169 p2,
170 p3,
171 p4,
172 p5,
173 p6
174 };
175
176 mmap m(array+0, array + 6);
177
178 {
179 mmap::iterator ite(m.begin());
180 mmap::const_iterator cite(m.begin());
181 //test compare between const_iterator and iterator
182 CPPUNIT_ASSERT( ite == cite );
183 CPPUNIT_ASSERT( !(ite != cite) );
184 CPPUNIT_ASSERT( cite == ite );
185 CPPUNIT_ASSERT( !(cite != ite) );
186 }
187
188#if 0
189 /*
190 * A check that map and multimap iterators are NOT comparable
191 * the following code should generate a compile time error
192 */
193 {
194 int_map::iterator mite(imap.begin());
195 int_map::const_iterator mcite(imap.begin());
196 mmap::iterator mmite(m.begin());
197 mmap::const_iterator mmcite(m.begin());
198 CPPUNIT_ASSERT( !(mite == mmite) );
199 CPPUNIT_ASSERT( !(mcite == mmcite) );
200 CPPUNIT_ASSERT( mite != mmite );
201 CPPUNIT_ASSERT( mcite != mmcite );
202 CPPUNIT_ASSERT( !(mite == mmcite) );
203 CPPUNIT_ASSERT( !(mite == mmcite) );
204 CPPUNIT_ASSERT( mite != mmcite );
205 CPPUNIT_ASSERT( mite != mmcite );
206 }
207
208#endif
209
210 mmap::reverse_iterator ri = m.rbegin();
211 CPPUNIT_ASSERT( ri != m.rend() );
212 CPPUNIT_ASSERT( ri == m.rbegin() );
213 CPPUNIT_ASSERT( (*ri).first == 6 );
214 CPPUNIT_ASSERT( (*ri++).second == 'f' );
215 CPPUNIT_ASSERT( (*ri).first == 6 );
216 CPPUNIT_ASSERT( (*ri).second == 'f' );
217
218 mmap const& cm = m;
219 mmap::const_reverse_iterator rci = cm.rbegin();
220 CPPUNIT_ASSERT( rci != cm.rend() );
221 CPPUNIT_ASSERT( (*rci).first == 6 );
222 CPPUNIT_ASSERT( (*rci++).second == 'f' );
223 CPPUNIT_ASSERT( (*rci).first == 6 );
224 CPPUNIT_ASSERT( (*rci).second == 'f' );
225}
226
228{
229 typedef map<char, int, less<char> > maptype;
230 {
231 maptype m;
232 m['x'] = 10;
233
235 ret = m.equal_range('x');
236 CPPUNIT_ASSERT( ret.first != ret.second );
237 CPPUNIT_ASSERT( (*(ret.first)).first == 'x' );
238 CPPUNIT_ASSERT( (*(ret.first)).second == 10 );
239 CPPUNIT_ASSERT( ++(ret.first) == ret.second );
240 }
241 {
242 {
243 maptype m;
244
245 maptype::iterator i = m.lower_bound( 'x' );
246 CPPUNIT_ASSERT( i == m.end() );
247
248 i = m.upper_bound( 'x' );
249 CPPUNIT_ASSERT( i == m.end() );
250
252 ret = m.equal_range('x');
253 CPPUNIT_ASSERT( ret.first == ret.second );
254 CPPUNIT_ASSERT( ret.first == m.end() );
255 }
256
257 {
258 const maptype m;
260 ret = m.equal_range('x');
261 CPPUNIT_ASSERT( ret.first == ret.second );
262 CPPUNIT_ASSERT( ret.first == m.end() );
263 }
264 }
265}
266
268{
269 char buf1[1024];
270 StackAllocator<pair<const int, int> > stack1(buf1, buf1 + sizeof(buf1));
271
272 char buf2[1024];
273 StackAllocator<pair<const int, int> > stack2(buf2, buf2 + sizeof(buf2));
274
275 {
276 typedef map<int, int, less<int>, StackAllocator<pair<const int, int> > > MapInt;
277 less<int> intLess;
278 MapInt mint1(intLess, stack1);
279 int i;
280 for (i = 0; i < 5; ++i)
281 mint1.insert(MapInt::value_type(i, i));
282 MapInt mint1Cpy(mint1);
283
284 MapInt mint2(intLess, stack2);
285 for (; i < 10; ++i)
286 mint2.insert(MapInt::value_type(i, i));
287 MapInt mint2Cpy(mint2);
288
289 mint1.swap(mint2);
290
291 CPPUNIT_ASSERT( mint1.get_allocator().swaped() );
292 CPPUNIT_ASSERT( mint2.get_allocator().swaped() );
293
294 CPPUNIT_ASSERT( mint1 == mint2Cpy );
295 CPPUNIT_ASSERT( mint2 == mint1Cpy );
296 CPPUNIT_ASSERT( mint1.get_allocator() == stack2 );
297 CPPUNIT_ASSERT( mint2.get_allocator() == stack1 );
298 }
299 CPPUNIT_ASSERT( stack1.ok() );
300 CPPUNIT_ASSERT( stack2.ok() );
301}
302
303struct Key
304{
305 Key() : m_data(0) {}
306 explicit Key(int data) : m_data(data) {}
307
309};
310
311struct KeyCmp
312{
313 bool operator () (Key lhs, Key rhs) const
314 { return lhs.m_data < rhs.m_data; }
315
316 bool operator () (Key lhs, int rhs) const
317 { return lhs.m_data < rhs; }
318
319 bool operator () (int lhs, Key rhs) const
320 { return lhs < rhs.m_data; }
321};
322
324{
325 bool operator () (Key const volatile *lhs, Key const volatile *rhs) const
326 { return (*lhs).m_data < (*rhs).m_data; }
327
328 bool operator () (Key const volatile *lhs, int rhs) const
329 { return (*lhs).m_data < rhs; }
330
331 bool operator () (int lhs, Key const volatile *rhs) const
332 { return lhs < (*rhs).m_data; }
333};
334
336{
337#if defined (STLPORT) && defined (_STLP_USE_CONTAINERS_EXTENSION)
338 {
339 typedef map<Key, int, KeyCmp> Container;
340 typedef Container::value_type value;
341 Container cont;
342 cont.insert(value(Key(1), 1));
343 cont.insert(value(Key(2), 2));
344 cont.insert(value(Key(3), 3));
345 cont.insert(value(Key(4), 4));
346
347 CPPUNIT_ASSERT( cont.count(Key(1)) == 1 );
348 CPPUNIT_ASSERT( cont.count(1) == 1 );
349 CPPUNIT_ASSERT( cont.count(5) == 0 );
350
351 CPPUNIT_ASSERT( cont.find(2) != cont.end() );
352 CPPUNIT_ASSERT( cont.lower_bound(2) != cont.end() );
353 CPPUNIT_ASSERT( cont.upper_bound(2) != cont.end() );
354 CPPUNIT_ASSERT( cont.equal_range(2) != make_pair(cont.begin(), cont.end()) );
355
356 Container const& ccont = cont;
357 CPPUNIT_ASSERT( ccont.find(2) != ccont.end() );
358 CPPUNIT_ASSERT( ccont.lower_bound(2) != ccont.end() );
359 CPPUNIT_ASSERT( ccont.upper_bound(2) != ccont.end() );
360 CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.end(), ccont.end()) );
361 }
362
363 {
364 typedef map<Key*, int, KeyCmpPtr> Container;
365 typedef Container::value_type value;
366 Container cont;
367 Key key1(1), key2(2), key3(3), key4(4);
368 cont.insert(value(&key1, 1));
369 cont.insert(value(&key2, 2));
370 cont.insert(value(&key3, 3));
371 cont.insert(value(&key4, 4));
372
373 CPPUNIT_ASSERT( cont.count(1) == 1 );
374 CPPUNIT_ASSERT( cont.count(5) == 0 );
375
376 CPPUNIT_ASSERT( cont.find(2) != cont.end() );
377 CPPUNIT_ASSERT( cont.lower_bound(2) != cont.end() );
378 CPPUNIT_ASSERT( cont.upper_bound(2) != cont.end() );
379 CPPUNIT_ASSERT( cont.equal_range(2) != make_pair(cont.begin(), cont.end()) );
380
381 Container const& ccont = cont;
382 CPPUNIT_ASSERT( ccont.find(2) != ccont.end() );
383 CPPUNIT_ASSERT( ccont.lower_bound(2) != ccont.end() );
384 CPPUNIT_ASSERT( ccont.upper_bound(2) != ccont.end() );
385 CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.begin(), ccont.end()) );
386 }
387 {
388 typedef multimap<Key, int, KeyCmp> Container;
389 typedef Container::value_type value;
390 Container cont;
391 cont.insert(value(Key(1), 1));
392 cont.insert(value(Key(2), 2));
393 cont.insert(value(Key(3), 3));
394 cont.insert(value(Key(4), 4));
395
396 CPPUNIT_ASSERT( cont.count(Key(1)) == 1 );
397 CPPUNIT_ASSERT( cont.count(1) == 1 );
398 CPPUNIT_ASSERT( cont.count(5) == 0 );
399
400 CPPUNIT_ASSERT( cont.find(2) != cont.end() );
401 CPPUNIT_ASSERT( cont.lower_bound(2) != cont.end() );
402 CPPUNIT_ASSERT( cont.upper_bound(2) != cont.end() );
403 CPPUNIT_ASSERT( cont.equal_range(2) != make_pair(cont.begin(), cont.end()) );
404
405 Container const& ccont = cont;
406 CPPUNIT_ASSERT( ccont.find(2) != ccont.end() );
407 CPPUNIT_ASSERT( ccont.lower_bound(2) != ccont.end() );
408 CPPUNIT_ASSERT( ccont.upper_bound(2) != ccont.end() );
409 CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.end(), ccont.end()) );
410 }
411
412 {
414 typedef Container::value_type value;
415 Container cont;
416 Key key1(1), key2(2), key3(3), key4(4);
417 cont.insert(value(&key1, 1));
418 cont.insert(value(&key2, 2));
419 cont.insert(value(&key3, 3));
420 cont.insert(value(&key4, 4));
421
422 CPPUNIT_ASSERT( cont.count(1) == 1 );
423 CPPUNIT_ASSERT( cont.count(5) == 0 );
424
425 CPPUNIT_ASSERT( cont.find(2) != cont.end() );
426 CPPUNIT_ASSERT( cont.lower_bound(2) != cont.end() );
427 CPPUNIT_ASSERT( cont.upper_bound(2) != cont.end() );
428 CPPUNIT_ASSERT( cont.equal_range(2) != make_pair(cont.begin(), cont.end()) );
429
430 Container const& ccont = cont;
431 CPPUNIT_ASSERT( ccont.find(2) != ccont.end() );
432 CPPUNIT_ASSERT( ccont.lower_bound(2) != ccont.end() );
433 CPPUNIT_ASSERT( ccont.upper_bound(2) != ccont.end() );
434 CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.begin(), ccont.end()) );
435 }
436#endif
437}
438
439#if !defined (STLPORT) || \
440 !defined (_STLP_USE_PTR_SPECIALIZATIONS) || defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
441# if !defined (__DMC__)
442/* Simple compilation test: Check that nested types like iterator
443 * can be access even if type used to instanciate container is not
444 * yet completely defined.
445 */
446class IncompleteClass
447{
448 map<IncompleteClass, IncompleteClass> instances;
452};
453# endif
454#endif
pair< _T1, _T2 > _STLP_CALL make_pair(_T1 __x, _T2 __y)
Definition: _pair.h:124
multimap< IncompleteClass, IncompleteClass > minstances
Definition: map_test.cpp:450
map< IncompleteClass, IncompleteClass >::iterator it
Definition: map_test.cpp:449
multimap< IncompleteClass, IncompleteClass >::iterator mit
Definition: map_test.cpp:451
map< IncompleteClass, IncompleteClass > instances
Definition: map_test.cpp:448
CPPUNIT_TEST(allocator_with_state)
void iterators()
Definition: map_test.cpp:144
CPPUNIT_IGNORE
Definition: map_test.cpp:27
CPPUNIT_TEST(mmap1)
CPPUNIT_TEST_SUITE(MapTest)
CPPUNIT_TEST(template_methods)
void template_methods()
Definition: map_test.cpp:335
CPPUNIT_TEST(iterators)
CPPUNIT_TEST(map1)
void mmap2()
Definition: map_test.cpp:110
CPPUNIT_TEST(equal_range)
CPPUNIT_TEST_SUITE_END()
void map1()
Definition: map_test.cpp:47
void equal_range()
Definition: map_test.cpp:227
CPPUNIT_TEST(mmap2)
void mmap1()
Definition: map_test.cpp:77
void allocator_with_state()
Definition: map_test.cpp:267
_Rep_type::iterator iterator
Definition: _map.h:85
Definition: _map.h:241
_Rep_type::iterator iterator
Definition: _map.h:278
#define CPPUNIT_TEST_SUITE_REGISTRATION(X)
Definition: cppunit_mini.h:193
#define CPPUNIT_ASSERT(X)
Definition: cppunit_mini.h:200
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLfloat GLfloat p
Definition: glext.h:8902
GLuint64EXT GLuint GLuint GLenum GLenum GLuint GLuint GLenum GLuint GLuint key1
Definition: glext.h:10608
const GLfloat * m
Definition: glext.h:10848
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
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: map_test.cpp:305
Key(int data)
Definition: map_test.cpp:306
bool ok() const
Definition: _pair.h:47
Definition: pdh_main.c:94
int ret