1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//Has to be first for StackAllocator swap overload to be taken
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//into account (at least using GCC 4.0.1)
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stack_allocator.h"
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector>
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm>
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <map>
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <set>
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <hash_map>
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <hash_set>
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <rope>
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <string>
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h"
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__MVS__)
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char star = 92;
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char star = 42;
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined (_STLP_USE_NAMESPACES)
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std;
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass HashTest : public CPPUNIT_NS::TestCase
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE(HashTest);
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS)
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_IGNORE;
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(hmap1);
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(hmmap1);
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(hmmap2);
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(hmset1);
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(hset2);
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(insert_erase);
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(allocator_with_state);
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //CPPUNIT_TEST(equality);
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE_END();
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_multiset<char, hash<char>, equal_to<char> > hmset;
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void hmap1();
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void hmmap1();
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void hmmap2();
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void hmset1();
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void hset2();
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void insert_erase();
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //void equality();
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void allocator_with_state();
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_multimap<int, int> hashType;
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef multimap<int, int> mapType;
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void check_keys( hashType& h, mapType& m );
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(HashTest);
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::hmap1()
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_map<char, crope, hash<char>, equal_to<char> > maptype;
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  maptype m;
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Store mappings between roman numerals and decimals.
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m['l'] = "50";
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m['x'] = "20"; // Deliberate mistake.
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m['v'] = "5";
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m['i'] = "1";
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !strcmp(m['x'].c_str(),"20") );
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m['x'] = "10"; // Correct mistake.
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !strcmp(m['x'].c_str(),"10") );
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !strcmp(m['z'].c_str(),"") );
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( m.count('z')==1 );
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  pair<maptype::iterator, bool> p = m.insert(pair<const char, crope>('c', crope("100")));
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(p.second);
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  p = m.insert(pair<const char, crope>('c', crope("100")));
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(!p.second);
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Some iterators compare check, really compile time checks
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  maptype::iterator ite(m.begin());
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  maptype::const_iterator cite(m.begin());
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  cite = m.begin();
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  maptype const& cm = m;
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  cite = cm.begin();
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( ite == cite );
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !(ite != cite) );
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( cite == ite );
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !(cite != ite) );
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::hmmap1()
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_multimap<char, int, hash<char>,equal_to<char> > mmap;
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  mmap m;
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(m.count('X')==0);
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m.insert(pair<const char,int>('X', 10)); // Standard way.
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(m.count('X')==1);
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//  m.insert('X', 20); // Non-standard, but very convenient!
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m.insert(pair<const char,int>('X', 20));  // jbuck: standard way
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(m.count('X')==2);
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//  m.insert('Y', 32);
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m.insert(pair<const char,int>('Y', 32));  // jbuck: standard way
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  mmap::iterator i = m.find('X'); // Find first match.
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*i).first=='X');
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*i).second==10);
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  i++;
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*i).first=='X');
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*i).second==20);
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  i++;
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*i).first=='Y');
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*i).second==32);
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  i++;
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(i==m.end());
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t count = m.erase('X');
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(count==2);
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Some iterators compare check, really compile time checks
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  mmap::iterator ite(m.begin());
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  mmap::const_iterator cite(m.begin());
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( ite == cite );
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !(ite != cite) );
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( cite == ite );
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !(cite != ite) );
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_multimap<size_t, size_t> HMapType;
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  HMapType hmap;
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //We fill the map to implicitely start a rehash.
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (size_t counter = 0; counter < 3077; ++counter)
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    hmap.insert(HMapType::value_type(1, counter));
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hmap.insert(HMapType::value_type(12325, 1));
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hmap.insert(HMapType::value_type(12325, 2));
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( hmap.count(12325) == 2 );
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //At this point 23 goes to the same bucket as 12325, it used to reveal a bug.
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hmap.insert(HMapType::value_type(23, 0));
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( hmap.count(12325) == 2 );
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Short demonstrator that helps reproducing a bug in the hash-table implementation
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// of STLPort 5.0.1/5.0.2.
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Problem: Fill a hash_multimap with entries of which many have the same key
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          Internally, entries with the same key are kept as one block within the same bucket.
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          Thus, when calling equal_range(key) the begin/end of that block is returned.
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          However, this code shows that for key =3, that block is destroyed after inserting the 194th element.
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          According to _hashtable.c we will have a rehash from size 193 to size 389 in that situation.
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          After that rehash,  equal_range only returns 2 elements with key = 3 whereas there are 65 in it.
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Reproduction:
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          In the main()-method we fill a hash_multimap as well as a multi_map with the same <key, data> pairs
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          After each insertion we call check_keys(...) to assure validity of these two containers.
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          This works fine up to the 193th insertion. Insertion 194 generates the bug.
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          check_keys() works as follows:
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          (a) we check whether both containers contain the same number of elements.
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          (b) Assuming that the multi_map works correctly, we iterate over all its elements and check
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//              whether we can find that key also in the hash_multimap. We collect all data for that specific
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//              key in in a set ("collection"). Notice that data is unique by construction in main(), thus the
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//              number of elements in the set must equal the number of entries in the hash_multimap and in the multimap
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//          (c) We check if we have seen as many data elements in collection as we have seen in the multimap.
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//              if so, we print "OK", otherwise we print a detailed key/data overview and assert.
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Caution:
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//        There are several configurations of the program that will NOT fail. (see comment in code below)
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//        E.g. it seems that whenever the keys are more or less sorted, the problem does not occur.
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//        Also, using numbers from 200 downto 1 or from 300 downto 1 cannot generate the problem,
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//        whereas using 400 downto 1 will fail.
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//        Finally, if we use key 1 (rather than key 3) we cannot generate a problem.
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::check_keys( HashTest::hashType& h, HashTest::mapType& m )
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  set<int> collection;
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // (a) check sizes
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_CHECK( h.size() == m.size() );
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // (b) iterate over multi_map
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( mapType::iterator i = m.begin(); i != m.end(); ++i ) {
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // look up that key in hash-table and keep all data in the set
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    pair<hashType::iterator,hashType::iterator> range = h.equal_range( i->first );
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for ( hashType::iterator j = range.first; j != range.second; ++j ) {
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      collection.insert( j->second );
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // (c) we should have seen as many elements as there are in the hash-table
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if 0
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (collection.size() == h.size()) cout << " OK" << endl;
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // if not, please report
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cout << " FAILED: " << endl;
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int lastKey  = -1;
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // iterate over all elements in multi_map
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (mapType::iterator mIter = m.begin(); mIter != m.end(); mIter++) {
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // new key? print a new status line
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (mIter->first != lastKey) {
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        cout << endl << "Key : " << mIter->first << endl;
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        lastKey = mIter->first;
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // print all hashed values for that key
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        cout << " data in hash: ";
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pair<hashType::iterator,hashType::iterator> range = h.equal_range(mIter->first);
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        for (hashType::iterator h = range.first; h != range.second; h++) {
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          assert (h->first == lastKey);
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          cerr << h->second << ", "; // print all data for that key in Hash-Table
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        cout << endl << " data in map:  ";
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // and print all member in multi-map until the next key occurs
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      cout << mIter->second << ", " ;  // print all data for that key in Map
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_CHECK( collection.size() == h.size() );
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::hmmap2()
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hashType h;
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  mapType m;
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // CAUTION the following configurations WORKS in our setting
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //      for (int id = 1; id != 400; id ++)   and int key = (id %3 == 0 ? 3 : id)
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //      for (int id = 200; id != 1; id --)   and int key = (id %3 == 0 ? 3 : id)
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //      for (int id = 300; id != 1; id --)   and int key = (id %3 == 0 ? 3 : id)
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //      for (int id = 400; id != 1; id --)   and int key = (id %3 == 0 ? 1 : id)
259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //      for (int id = 4000; id != 1; id --)  and int key = (id %3 == 0 ? 1 : id)
260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //
261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // whereas these will FAIL
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //      for (int id = 400; id != 1; id --)   and int key = (id %3 == 0 ? 3 : id)
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //      for (int id = 4000; id != 1; id --)  and int key = (id %3 == 0 ? 3 : id)
264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //
265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( int id = 400; id != 1; id-- ) {
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // generate many entries with key 3, fill up with unique keys. Data is unique (needed in check_keys())
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int key = (id % 3 == 0 ? 3 : id);
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // keep hash_multi_map and multimap in sync
271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    h.insert(make_pair(key, id));
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    m.insert(make_pair(key, id));
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // check whether both contain the same elements
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    check_keys( h, m );
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::hmset1()
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hmset s;
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( s.count(star) == 0 );
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  s.insert(star);
286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( s.count(star) == 1 );
287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  s.insert(star);
288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( s.count(star) == 2 );
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hmset::iterator i = s.find(char(40));
290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( i == s.end() );
291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  i = s.find(star);
293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( i != s.end() )
294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( *i == '*' );
295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( s.erase(star) == 2 );
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::hset2()
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hash_set<int, hash<int>, equal_to<int> > s;
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  pair<hash_set<int, hash<int>, equal_to<int> >::iterator, bool> p = s.insert(42);
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( p.second );
304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( *(p.first) == 42 );
305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  p = s.insert(42);
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( !p.second );
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::insert_erase()
312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_map<string, size_t, hash<string>, equal_to<string> > hmap;
315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hmap::value_type val_type;
316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    hmap values;
318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (__BORLANDC__) || (__BORLANDC__ >= 0x564)
319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(val_type("foo", 0)).second );
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(val_type("bar", 0)).second );
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(val_type("abc", 0)).second );
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(hmap::value_type("foo", 0)).second );
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(hmap::value_type("bar", 0)).second );
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(hmap::value_type("abc", 0)).second );
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.erase("foo") == 1 );
329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.erase("bar") == 1 );
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.erase("abc") == 1 );
331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    hmap values;
335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (__BORLANDC__) || (__BORLANDC__ >= 0x564)
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(val_type("foo", 0)).second );
337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(val_type("bar", 0)).second );
338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(val_type("abc", 0)).second );
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(hmap::value_type("foo", 0)).second );
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(hmap::value_type("bar", 0)).second );
342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.insert(hmap::value_type("abc", 0)).second );
343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.erase("abc") == 1 );
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.erase("bar") == 1 );
347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( values.erase("foo") == 1 );
348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Here is the test showing why equality operator on hash containers
354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * has no meaning:
355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct equality_hash_func {
357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t operator () (size_t val) const {
358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return val % 10;
359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::equality()
363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hash_set<size_t, equality_hash_func, equal_to<size_t> > s1, s2;
365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  s1.insert(10);
367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  s1.insert(20);
368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  s2.insert(20);
370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  s2.insert(10);
371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //s1 and s2 contains both 10 and 20:
373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( s1 == s2 );
374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott*/
376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid HashTest::allocator_with_state()
378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf1[2048];
381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  StackAllocator<int> stack1(buf1, buf1 + sizeof(buf1));
382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf2[2048];
384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  StackAllocator<int> stack2(buf2, buf2 + sizeof(buf2));
385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef hash_set<int, hash<int>, equal_to<int>, StackAllocator<int> > HashSetInt;
388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    HashSetInt hint1(10, hash<int>(), equal_to<int>(), stack1);
389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int i;
391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (i = 0; i < 5; ++i)
392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      hint1.insert(i);
393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    HashSetInt hint1Cpy(hint1);
394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    HashSetInt hint2(10, hash<int>(), equal_to<int>(), stack2);
396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (; i < 10; ++i)
397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      hint2.insert(i);
398e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    HashSetInt hint2Cpy(hint2);
399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    hint1.swap(hint2);
401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( hint1.get_allocator().swaped() );
403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( hint2.get_allocator().swaped() );
404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( hint1.get_allocator() == stack2 );
406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( hint2.get_allocator() == stack1 );
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( stack1.ok() );
409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( stack2.ok() );
410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && \
414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   (!defined (_STLP_USE_PTR_SPECIALIZATIONS) || defined (_STLP_CLASS_PARTIAL_SPECIALIZATION))
415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (__DMC__)
416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Simple compilation test: Check that nested types like iterator
418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * can be access even if type used to instanciate container is not
419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * yet completely defined.
420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass IncompleteClass
422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hash_set<IncompleteClass> hsinstances;
424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_set<IncompleteClass>::iterator hsit;
425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hash_multiset<IncompleteClass> hsminstances;
426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_multiset<IncompleteClass>::iterator hsmit;
427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hash_map<IncompleteClass, IncompleteClass> hminstances;
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_map<IncompleteClass, IncompleteClass>::iterator hmit;
430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  hash_multimap<IncompleteClass, IncompleteClass> hmminstances;
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef hash_multimap<IncompleteClass, IncompleteClass>::iterator hmmit;
432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
435