New wxHashMap class.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13910 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mattia Barbon
2002-01-29 21:26:57 +00:00
parent 8e33234f93
commit 0508ba2a6b
3 changed files with 822 additions and 0 deletions

View File

@@ -64,6 +64,7 @@
#define TEST_FILETIME
#define TEST_FTP
#define TEST_HASH
#define TEST_HASHMAP
#define TEST_INFO_FUNCTIONS
#define TEST_LIST
#define TEST_LOCALE
@@ -88,6 +89,7 @@
#undef TEST_ALL
static const bool TEST_ALL = TRUE;
#else
#define TEST_HASHMAP
#define TEST_FILENAME
static const bool TEST_ALL = FALSE;
@@ -1094,6 +1096,149 @@ static void TestHash()
#endif // TEST_HASH
// ----------------------------------------------------------------------------
// wxHashMap
// ----------------------------------------------------------------------------
#ifdef TEST_HASHMAP
#include "wx/hashmap.h"
// test compilation of basic map types
WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash, wxPointerEqual, myPtrHashMap );
WX_DECLARE_HASH_MAP( long, long, wxIntegerHash, wxIntegerEqual, myLongHashMap );
WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash, wxIntegerEqual,
myUnsignedHashMap );
WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash, wxIntegerEqual,
myTestHashMap1 );
WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash, wxIntegerEqual,
myTestHashMap2 );
WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash, wxIntegerEqual,
myTestHashMap3 );
WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash, wxIntegerEqual,
myTestHashMap4 );
WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
myStringHashMap );
typedef myStringHashMap::iterator Itor;
static void TestHashMap()
{
puts("*** Testing wxHashMap ***\n");
myStringHashMap sh(0); // as small as possible
wxString buf;
size_t i;
const size_t count = 10000;
// init with some data
for( i = 0; i < count; ++i )
{
buf.Printf(wxT("%d"), i );
sh[buf] = wxT("A") + buf + wxT("C");
}
// test that insertion worked
if( sh.size() != count )
{
printf("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n", sh.size(), count);
}
for( i = 0; i < count; ++i )
{
buf.Printf(wxT("%d"), i );
if( sh[buf] != wxT("A") + buf + wxT("C") )
{
printf("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n");
return;
}
}
// check that iterators work
Itor it;
for( i = 0, it = sh.begin(); it != sh.end(); ++it, ++i )
{
if( i == count )
{
printf("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n");
return;
}
if( it->second != sh[it->first] )
{
printf("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n");
return;
}
}
if( sh.size() != i )
{
printf("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n", i, count);
}
// test copy ctor, assignment operator
myStringHashMap h1( sh ), h2( 0 );
h2 = sh;
for( i = 0, it = sh.begin(); it != sh.end(); ++it, ++i )
{
if( h1[it->first] != it->second )
{
printf("*** ERROR: COPY CTOR BROKEN %s ***\n", it->first.c_str());
}
if( h2[it->first] != it->second )
{
printf("*** ERROR: OPERATOR= BROKEN %s ***\n", it->first.c_str());
}
}
// other tests
for( i = 0; i < count; ++i )
{
buf.Printf(wxT("%d"), i );
size_t sz = sh.size();
// test find() and erase(it)
if( i < 100 )
{
it = sh.find( buf );
if( it != sh.end() )
{
sh.erase( it );
if( sh.find( buf ) != sh.end() )
{
printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i);
}
}
else
printf("*** ERROR: CANT FIND ELEMENT %u ***\n", i);
}
else
// test erase(key)
{
size_t c = sh.erase( buf );
if( c != 1 )
printf("*** ERROR: SHOULD RETURN 1 ***\n");
if( sh.find( buf ) != sh.end() )
{
printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i);
}
}
// count should decrease
if( sh.size() != sz - 1 )
{
printf("*** ERROR: COUNT DID NOT DECREASE ***\n");
}
}
printf("*** Finished testing wxHashMap ***\n");
}
#endif TEST_HASHMAP
// ----------------------------------------------------------------------------
// wxList
// ----------------------------------------------------------------------------
@@ -5396,6 +5541,10 @@ int main(int argc, char **argv)
TestHash();
#endif // TEST_HASH
#ifdef TEST_HASHMAP
TestHashMap();
#endif // TEST_HASHMAP
#ifdef TEST_MIME
wxLog::AddTraceMask(_T("mime"));
if ( 1 )