When wxUSE_STL == 1 and STL provides quasi-standard hash_map/hash_set,

wxHashMap/wxHashSet are just typedefs for them. This makes impossible
to forward declare these classes.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27182 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mattia Barbon
2004-05-08 20:20:24 +00:00
parent 11e720751c
commit bdcade0a10
16 changed files with 5363 additions and 1925 deletions

View File

@@ -18,6 +18,30 @@
#include "wx/string.h"
#if (defined(HAVE_EXT_HASH_MAP) || defined(HAVE_HASH_MAP)) \
&& (defined(HAVE_GNU_CXX_HASH_MAP) || defined(HAVE_STD_HASH_MAP))
#define HAVE_STL_HASH_MAP
#endif
#if wxUSE_STL && defined(HAVE_STL_HASH_MAP)
#if defined(HAVE_EXT_HASH_MAP)
#include <ext/hash_map>
#elif defined(HAVE_HASH_MAP)
#include <hash_map>
#endif
#if defined(HAVE_GNU_CXX_HASH_MAP)
#define WX_HASH_MAP_NAMESPACE __gnu_cxx
#elif defined(HAVE_STD_HASH_MAP)
#define WX_HASH_MAP_NAMESPACE std
#endif
#define _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP ) \
typedef WX_HASH_MAP_NAMESPACE::hash_map< KEY_T, VALUE_T, HASH_T, KEY_EQ_T > CLASSNAME;
#else // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP)
#include <stddef.h> // for ptrdiff_t
#ifdef __WXWINCE__
@@ -408,6 +432,8 @@ inline bool grow_lf70( size_t buckets, size_t items )
return float(items)/float(buckets) >= 0.85;
}
#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP)
// ----------------------------------------------------------------------------
// hashing and comparison functors
// ----------------------------------------------------------------------------
@@ -416,6 +442,31 @@ inline bool grow_lf70( size_t buckets, size_t items )
// operators to suppress warnings about "statement with no effect" from gcc
// in the hash table class assignment operator (where they're assigned)
#if wxUSE_STL && defined(HAVE_STL_HASH_MAP)
// integer types
class WXDLLIMPEXP_BASE wxIntegerHash
{
WX_HASH_MAP_NAMESPACE::hash<long> longHash;
WX_HASH_MAP_NAMESPACE::hash<unsigned long> ulongHash;
WX_HASH_MAP_NAMESPACE::hash<int> intHash;
WX_HASH_MAP_NAMESPACE::hash<unsigned int> uintHash;
WX_HASH_MAP_NAMESPACE::hash<short> shortHash;
WX_HASH_MAP_NAMESPACE::hash<unsigned short> ushortHash;
public:
wxIntegerHash() { }
size_t operator()( long x ) const { return longHash( x ); }
size_t operator()( unsigned long x ) const { return ulongHash( x ); }
size_t operator()( int x ) const { return intHash( x ); }
size_t operator()( unsigned int x ) const { return uintHash( x ); }
size_t operator()( short x ) const { return shortHash( x ); }
size_t operator()( unsigned short x ) const { return ushortHash( x ); }
wxIntegerHash& operator=(const wxIntegerHash&) { return *this; }
};
#else // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP)
// integer types
class WXDLLIMPEXP_BASE wxIntegerHash
{
@@ -431,6 +482,8 @@ public:
wxIntegerHash& operator=(const wxIntegerHash&) { return *this; }
};
#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP)
class WXDLLIMPEXP_BASE wxIntegerEqual
{
public:
@@ -453,7 +506,11 @@ public:
// TODO: this might not work well on architectures with 64 bit pointers but
// 32 bit longs, we should use % ULONG_MAX there
#if wxUSE_STL && defined(HAVE_STL_HASH_MAP)
size_t operator()( const void* k ) const { return (size_t)k; }
#else
unsigned long operator()( const void* k ) const { return (unsigned long)wxPtrToULong(k); }
#endif
wxPointerHash& operator=(const wxPointerHash&) { return *this; }
};
@@ -502,6 +559,8 @@ public:
wxStringEqual& operator=(const wxStringEqual&) { return *this; }
};
#if !wxUSE_STL || !defined(HAVE_STL_HASH_MAP)
#define _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP ) \
_WX_DECLARE_PAIR( KEY_T, VALUE_T, CLASSNAME##_wxImplementation_Pair, CLASSEXP ) \
_WX_DECLARE_HASH_MAP_KEY_EX( KEY_T, CLASSNAME##_wxImplementation_Pair, CLASSNAME##_wxImplementation_KeyEx, CLASSEXP ) \
@@ -543,6 +602,8 @@ public: \
{ return GetNode( key ) ? 1 : 0; } \
}
#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP)
// these macros are to be used in the user code
#define WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME) \
_WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, class )