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 /common | |
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
Diffstat (limited to 'common')
-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 |
5 files changed, 85 insertions, 46 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> |