diff options
author | Max Horn | 2006-07-30 12:21:54 +0000 |
---|---|---|
committer | Max Horn | 2006-07-30 12:21:54 +0000 |
commit | 53f73eac8569010ccddfeebeddcdb2619b2616aa (patch) | |
tree | 542e09fc5045ea616390d07f6543dfb32845df98 | |
parent | bd49091afd55cf2663095a1882bab34496ef01f0 (diff) | |
download | scummvm-rg350-53f73eac8569010ccddfeebeddcdb2619b2616aa.tar.gz scummvm-rg350-53f73eac8569010ccddfeebeddcdb2619b2616aa.tar.bz2 scummvm-rg350-53f73eac8569010ccddfeebeddcdb2619b2616aa.zip |
Added explicit string equals/hash functors to a new header common/hash-str.h; removed Hash functor specialization for String and char pointers; changed all code using hashmaps with string keys to explicitly specify whether they honor or ignore case
svn-id: r23634
-rw-r--r-- | common/config-manager.h | 15 | ||||
-rw-r--r-- | common/file.cpp | 8 | ||||
-rw-r--r-- | common/hash-str.h | 79 | ||||
-rw-r--r-- | common/hashmap.h | 27 | ||||
-rw-r--r-- | common/str.cpp | 2 | ||||
-rw-r--r-- | engines/saga/game.cpp | 5 | ||||
-rw-r--r-- | engines/simon/game.cpp | 6 | ||||
-rw-r--r-- | graphics/fontman.h | 3 | ||||
-rw-r--r-- | gui/eval.h | 21 |
9 files changed, 112 insertions, 54 deletions
diff --git a/common/config-manager.h b/common/config-manager.h index f7c1ce121b..364ca638ba 100644 --- a/common/config-manager.h +++ b/common/config-manager.h @@ -29,23 +29,10 @@ #include "common/hashmap.h" #include "common/singleton.h" #include "common/str.h" +#include "common/hash-str.h" namespace Common { -struct IgnoreCase_Less { - bool operator()(const String& x, const String& y) const { return scumm_stricmp(x.c_str(), y.c_str()) < 0; } -}; - -struct IgnoreCase_EqualTo { - bool operator()(const String& x, const String& y) const { return scumm_stricmp(x.c_str(), y.c_str()) == 0; } -}; - -struct IgnoreCase_Hash { - uint operator()(const String& x) const { return hashit_lower(x.c_str()); } -}; - -typedef HashMap<String, String, IgnoreCase_Hash, IgnoreCase_EqualTo> StringMap; - /** * The (singleton) configuration manager, used to query & set configuration * values using string keys. diff --git a/common/file.cpp b/common/file.cpp index da682037e8..68360ce1d8 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -24,6 +24,7 @@ #include "common/fs.h" #include "common/hashmap.h" #include "common/util.h" +#include "common/hash-str.h" #ifdef MACOSX #include "CoreFoundation/CoreFoundation.h" @@ -31,14 +32,13 @@ namespace Common { -typedef HashMap<String, String> FilesMap; -typedef HashMap<String, int> StringIntMap; +typedef HashMap<String, int, CaseSensitiveString_Hash, CaseSensitiveString_EqualTo> StringIntMap; // The following two objects could be turned into static members of class // File. However, then we would be forced to #include hashmap in file.h // which seems to be a high price just for a simple beautification... static StringIntMap *_defaultDirectories; -static FilesMap *_filesMap; +static StringMap *_filesMap; static FILE *fopenNoCase(const String &filename, const String &directory, const char *mode) { FILE *file; @@ -142,7 +142,7 @@ void File::addDefaultDirectoryRecursive(const FilesystemNode &dir, int level, co (*_defaultDirectories)[directory] = level; if (!_filesMap) - _filesMap = new FilesMap; + _filesMap = new StringMap; for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (file->isDirectory()) { diff --git a/common/hash-str.h b/common/hash-str.h new file mode 100644 index 0000000000..bb61e3091d --- /dev/null +++ b/common/hash-str.h @@ -0,0 +1,79 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef COMMON_HASH_STR_H +#define COMMON_HASH_STR_H + +#include "common/hashmap.h" +#include "common/str.h" + +namespace Common { + +uint hashit(const char *str); +uint hashit_lower(const char *str); // Generate a hash based on the lowercase version of the string + + +// FIXME: The following functors obviously are not consistently named + +struct CaseSensitiveString_EqualTo { + bool operator()(const String& x, const String& y) const { return strcmp(x.c_str(), y.c_str()) == 0; } +}; + +struct CaseSensitiveString_Hash { + uint operator()(const String& x) const { return hashit(x.c_str()); } +}; + + +struct IgnoreCase_EqualTo { + bool operator()(const String& x, const String& y) const { return scumm_stricmp(x.c_str(), y.c_str()) == 0; } +}; + +struct IgnoreCase_Hash { + uint operator()(const String& x) const { return hashit_lower(x.c_str()); } +}; + + + +typedef HashMap<String, String, IgnoreCase_Hash, IgnoreCase_EqualTo> StringMap; + + +#if 0 +// Specalization of the Hash functor for String objects. +template <> +struct Hash<String> { + uint operator()(const String& s) const { + return hashit(s.c_str()); + } +}; + +template <> +struct Hash<const char *> { + uint operator()(const char *s) const { + return hashit(s); + } +}; +#endif + + +} // End of namespace Common + + +#endif diff --git a/common/hashmap.h b/common/hashmap.h index 15eebbf839..87ed1b1173 100644 --- a/common/hashmap.h +++ b/common/hashmap.h @@ -58,24 +58,6 @@ namespace Common { -uint hashit(const char *str); -uint hashit_lower(const char *str); // Generate a hash based on the lowercase version of the string - -// Specalization of the Hash functor for String objects. -template <> -struct Hash<String> { - uint operator()(const String& s) const { - return hashit(s.c_str()); - } -}; - -template <> -struct Hash<const char *> { - uint operator()(const char *s) const { - return hashit(s); - } -}; - // data structure used by HashMap internally to keep // track of what's mapped to what. template <class Key, class Val> @@ -85,15 +67,6 @@ struct BaseNode { BaseNode() {} BaseNode(const Key &key) : _key(key) {} }; - -template <class Val> -struct BaseNode<const char *, Val> { - char *_key; - Val _value; - BaseNode() {assert(0);} - BaseNode(const char *key) { _key = (char *)malloc(strlen(key)+1); strcpy(_key, key); } - ~BaseNode() { free(_key); } -}; // The table sizes ideally are primes. We use a helper function to find // suitable table sizes. diff --git a/common/str.cpp b/common/str.cpp index a170099f70..d793c54cb8 100644 --- a/common/str.cpp +++ b/common/str.cpp @@ -22,7 +22,7 @@ #include "common/stdafx.h" #include "common/str.h" -#include "common/hash.h" +#include "common/hash-str.h" #include "common/util.h" #include <ctype.h> diff --git a/engines/saga/game.cpp b/engines/saga/game.cpp index 38b3d2fb59..2b66e42bf5 100644 --- a/engines/saga/game.cpp +++ b/engines/saga/game.cpp @@ -30,6 +30,7 @@ #include "common/fs.h" #include "common/md5.h" #include "common/hashmap.h" +#include "common/hash-str.h" #include "common/config-manager.h" #include "base/plugins.h" @@ -98,10 +99,10 @@ static int detectGame(const FSList *fslist, Common::Language language, Common::P int gamesCount = ARRAYSIZE(gameDescriptions); int filesCount; - typedef Common::HashMap<Common::String, bool> StringSet; + typedef Common::HashMap<Common::String, bool, Common::CaseSensitiveString_Hash, Common::CaseSensitiveString_EqualTo> StringSet; StringSet filesList; - typedef Common::HashMap<Common::String, Common::String> StringMap; + typedef Common::StringMap StringMap; StringMap filesMD5; Common::String tstr; diff --git a/engines/simon/game.cpp b/engines/simon/game.cpp index 4e5987f3d3..75d31c90d2 100644 --- a/engines/simon/game.cpp +++ b/engines/simon/game.cpp @@ -29,6 +29,8 @@ #include "common/file.h" #include "common/fs.h" #include "common/md5.h" +#include "common/hashmap.h" +#include "common/hash-str.h" #include "simon/simon.h" @@ -1349,10 +1351,10 @@ static int detectGame(const FSList *fslist, Common::Language language, Common::P int gamesCount = ARRAYSIZE(gameDescriptions); int filesCount; - typedef Common::HashMap<Common::String, bool> StringSet; + typedef Common::HashMap<Common::String, bool, Common::CaseSensitiveString_Hash, Common::CaseSensitiveString_EqualTo> StringSet; StringSet filesList; - typedef Common::HashMap<Common::String, Common::String> StringMap; + typedef Common::StringMap StringMap; StringMap filesMD5; Common::String tstr, tstr2; diff --git a/graphics/fontman.h b/graphics/fontman.h index fb73286e3d..443587ca7c 100644 --- a/graphics/fontman.h +++ b/graphics/fontman.h @@ -27,6 +27,7 @@ #include "common/singleton.h" #include "common/str.h" #include "common/hashmap.h" +#include "common/hash-str.h" #include "graphics/font.h" @@ -81,7 +82,7 @@ private: friend class Common::Singleton<SingletonBaseType>; FontManager(); - Common::HashMap<Common::String, const Font *> _fontMap; + Common::HashMap<Common::String, const Font *, Common::CaseSensitiveString_Hash, Common::CaseSensitiveString_EqualTo> _fontMap; }; diff --git a/gui/eval.h b/gui/eval.h index 4d960a8db1..570c4c96bd 100644 --- a/gui/eval.h +++ b/gui/eval.h @@ -26,6 +26,7 @@ #include "common/stdafx.h" #include "common/str.h" #include "common/hashmap.h" +#include "common/hash-str.h" namespace GUI { @@ -68,14 +69,28 @@ public: char *lastToken() { return _token; } + + template <class Val> + struct CharStar_BaseNode { + char *_key; + Val _value; + CharStar_BaseNode() {assert(0);} + CharStar_BaseNode(const char *key) { _key = (char *)malloc(strlen(key)+1); strcpy(_key, key); } + ~CharStar_BaseNode() { free(_key); } + }; + struct CharStar_EqualTo { bool operator()(const char *x, const char *y) const { return strcmp(x, y) == 0; } }; + struct CharStar_Hash { + uint operator()(const char *x) const { return Common::hashit(x); } + }; + //typedef HashMap<String, int> VariablesMap; - typedef HashMap<const char *, int, Common::Hash<const char *>, CharStar_EqualTo> VariablesMap; - typedef HashMap<const char *, String, Common::Hash<const char *>, CharStar_EqualTo> AliasesMap; - typedef HashMap<const char *, String, Common::Hash<const char *>, CharStar_EqualTo> StringsMap; + typedef HashMap<const char *, int, CharStar_Hash, CharStar_EqualTo, CharStar_BaseNode<int> > VariablesMap; + typedef HashMap<const char *, String, CharStar_Hash, CharStar_EqualTo, CharStar_BaseNode<String> > AliasesMap; + typedef HashMap<const char *, String, CharStar_Hash, CharStar_EqualTo, CharStar_BaseNode<String> > StringsMap; private: enum TokenTypes { |