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