Re: CMAP under vs2005+
This is a multi-part message in MIME format.
--------------020609040207010309060907
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Giovanni Dicanio wrote:
Looks like I making progress with this mixed method. I appreciate the
code example. I am going to create a CMapEx class to provide the same
First(), Next(), Lookup() methods. Probably not 100% but at this point I
am just trying to get all my projects compiled under VS2005 then I can go
thru an code/optimization phase.
Yes, of course you can implement a class that has an "interface" (i.e.
public methods) similar to your original CMapEx interface, and you can use
an implementation based on std::map (instead of using CMap).
Boy! Took me all day, but I finally got my new std::map based "CMapEx"
working in template fashion. I really do need to do more work with
templates to finally get a good handle on it. :-)
Attached is the new version. Thanks for all your insight and assistance.
Example usage:
// File: G:\local\wc7\common\teststdmap.cpp
#include "mapex.h"
struct TCodeInfo {
DWORD ref;
void *code;
DWORD size;
FILETIME time;
};
void testmap()
{
CMapEx<TCodeInfo> codeCache;
TCodeInfo ci1 = {1,NULL,1};
TCodeInfo ci2 = {2,NULL,1};
TCodeInfo ci3 = {3,NULL,1};
TCodeInfo ci4 = {4,NULL,1};
codeCache["code1.wcx"] = ci1;
codeCache["Code2.wcx"] = ci2;
codeCache["code3.wcx"] = ci3;
codeCache["code4.wcx"] = ci4;
codeCache["CODE2.wcx"] = ci2;
codeCache["Code1.wcx"] = ci1;
printf("count: %d\n",codeCache.GetCount()); // 4 expected
CString k;
TCodeInfo v;
if (codeCache.First(k,v)) do {
printf("%s = %d\n",i, k, v.ref);
} while (codeCache.Next(k,v));
}
void main(char argc, char *argv[])
{
testmap();
}
--
--------------020609040207010309060907
Content-Type: text/plain;
name="mapex.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="mapex.h"
//---------------------------------------------------------------------
// (c) copyright 2000-008 by Santronics Software, Inc.
//
// File : mapex.h
// About:
//
// A extended std::map template specifically for using case-insensitive
// string keys. No need to force the keys to one case. Any objects
// can be used for the map value parameter.
//
// Usage:
//
// CMapEx<VALUE> object;
//
// Example:
//
// CMapEx<CString> m;
//
// m["key1"] = "ext 2223";
// m["KEY1"] = "ext 2223"; << overrides the first "key1"
// m["kEy2"] = "ext 2225";
// m["Key2"] = "ext 2225"; << override the first "kEy2"
//
// printf("count: %d\n",map.GetCount()); // SHOULD BE 2
//
//---------------------------------------------------------------------
#ifndef __MAP_EX_H__
#define __MAP_EX_H__
#include <afx.h>
#include <map>
#include <string>
struct __cbCStringCaseCmp
{
bool operator()(const CString & left, const CString & right) const
{
// Case insensitive comparison
return ( left.CompareNoCase( right ) < 0 );
}
};
#define TKEYSTR CString
template <typename VALUE>
class CMapEx : public std::map<TKEYSTR, VALUE, __cbCStringCaseCmp>
{
public:
DWORD GetSize() { return this->size(); }
DWORD GetCount() { return this->size(); }
void Rewind() { it = this->begin(); }
BOOL First(TKEYSTR &k, VALUE &v)
{
Rewind();
if (it != this->end()) {
k = it->first;
v = it->second;
++it;
return TRUE;
}
return FALSE;
}
BOOL Next(TKEYSTR &k, VALUE &v)
{
if (it != this->end()) {
k = it->first;
v = it->second;
++it;
return TRUE;
}
return FALSE;
}
void RemoveAll() { this->clear(); }
BOOL RemoveKey(const TKEYSTR &key)
{
it = this->find(key);
if (it != this->end()) {
this->erase(it);
return TRUE;
}
return FALSE;
}
void SetAt(const TKEYSTR &k, const VALUE &v) { (*this)[k] = v; }
BOOL Lookup(const TKEYSTR &k, VALUE& v)
{
it = this->find(k);
if (it != this->end()) {
v = it->second;
++it;
return TRUE;
}
return FALSE;
}
private:
iterator it;
};
#endif // __MAP_EX_H__
--------------020609040207010309060907--