And the attachment is a compilable example.
"Tommy" <tommy767@gmail.com> ha scritto nel messaggio
news:%23XGVnJLNJHA.5060@TK2MSFTNGP02.phx.gbl...
Under VC6, I had a wrapper CMAP template, which I called CMapEx which
I used for many years as a way to map case insensitive key strings to
objects.
[...]
If is possible to use CMap with an unique HashKey function unique to
CMapEx wrapper for CMAP so I can make the hash case insensitive?
Hi,
I learned that MFC CMap class is not very good, I would suggest you to use
std::map.
Note that you can mix std::map with CString class (from MFC/ATL).
So, if you want a case insensitive map from string to string, using
CString
class for strings, and std::map for mapping, you may consider providing a
custom key comparer for std::map.
The custom key comparer is responsible to do the case *in*sensitive
comparison. For that purpose, CString offers a CompareNoCase() method,
that
you can use.
CString::CompareNoCase()
http://msdn.microsoft.com/en-us/library/aa314315.aspx
The custom comparer is a class with a public method overloading
operator(),
in this form:
bool operator()( const CString & left, const CString & right ) const;
It is a predicate, that returns true if 'left < right'; of course, inside
the implementation of this operator(), you can define your own custom
comparison relation, in this case using CString::CompareNoCase():
<code>
struct CaseInsensitiveStringComparer
{
// functor for operator <
bool operator()(const CString & left, const CString & right) const
{
// Case insensitive comparison
return ( left.CompareNoCase( right ) < 0 );
}
};
</code>
You can pass this custom comparer as third template parameter of std::map
(the first template parameter is the key type, the second template
parameter
is the "destination" value type):
<code>
//
// Map string --> string, using case insensitive comparison of string keys
//
typedef std::map< CString, CString, CaseInsensitiveStringComparer >
StringDictionaryCaseInsensitive;
</code>
You can test like this (#include <map> for std::map class)
<code>
StringDictionaryCaseInsensitive test;
test[ _T("Bob") ] = _T("123");
test[ _T("Jeff") ] = _T("456");
test[ _T("BOB") ] = _T("000"); // override first Bob
ASSERT( test[ _T("Bob") ] == _T("000") );
</code>
HTH,
Giovanni