Removed common/map.h with the Common::Map template class (it was a very bad implementation, and our HashMap is simply better).
svn-id: r21688
This commit is contained in:
parent
4572d0ba16
commit
dc77d02c7e
6 changed files with 6 additions and 302 deletions
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
#include "common/config-manager.h"
|
#include "common/config-manager.h"
|
||||||
#include "common/list.h"
|
#include "common/list.h"
|
||||||
#include "common/map.h"
|
|
||||||
#include "common/str.h"
|
#include "common/str.h"
|
||||||
#include "common/stream.h"
|
#include "common/stream.h"
|
||||||
|
|
||||||
|
@ -51,7 +50,6 @@ namespace Common {
|
||||||
*/
|
*/
|
||||||
class ConfigFile {
|
class ConfigFile {
|
||||||
public:
|
public:
|
||||||
//typedef Map<String, bool, IgnoreCase_Less> StringSet;
|
|
||||||
typedef HashMap<String, bool, IgnoreCase_Hash, IgnoreCase_EqualTo> StringSet;
|
typedef HashMap<String, bool, IgnoreCase_Hash, IgnoreCase_EqualTo> StringSet;
|
||||||
|
|
||||||
struct KeyValue {
|
struct KeyValue {
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
|
|
||||||
#include "common/array.h"
|
#include "common/array.h"
|
||||||
//#include "common/config-file.h"
|
//#include "common/config-file.h"
|
||||||
#include "common/map.h"
|
|
||||||
#include "common/hashmap.h"
|
#include "common/hashmap.h"
|
||||||
#include "common/singleton.h"
|
#include "common/singleton.h"
|
||||||
#include "common/str.h"
|
#include "common/str.h"
|
||||||
|
@ -45,7 +44,6 @@ struct IgnoreCase_Hash {
|
||||||
uint operator()(const String& x) const { return hashit_lower(x.c_str()); }
|
uint operator()(const String& x) const { return hashit_lower(x.c_str()); }
|
||||||
};
|
};
|
||||||
|
|
||||||
//typedef Map<String, String, IgnoreCase_Less> StringMap;
|
|
||||||
typedef HashMap<String, String, IgnoreCase_Hash, IgnoreCase_EqualTo> StringMap;
|
typedef HashMap<String, String, IgnoreCase_Hash, IgnoreCase_EqualTo> StringMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -76,7 +74,6 @@ public:
|
||||||
bool hasKVComment(const String &key) const;
|
bool hasKVComment(const String &key) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
//typedef Map<String, Domain, IgnoreCase_Less> DomainMap;
|
|
||||||
typedef HashMap<String, Domain, IgnoreCase_Hash, IgnoreCase_EqualTo> DomainMap;
|
typedef HashMap<String, Domain, IgnoreCase_Hash, IgnoreCase_EqualTo> DomainMap;
|
||||||
|
|
||||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||||
|
|
291
common/map.h
291
common/map.h
|
@ -1,291 +0,0 @@
|
||||||
/* 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_MAP_H
|
|
||||||
#define COMMON_MAP_H
|
|
||||||
|
|
||||||
#include "common/scummsys.h"
|
|
||||||
#include "common/func.h"
|
|
||||||
|
|
||||||
namespace Common {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Template based map (aka dictionary) class which uniquely maps elements of
|
|
||||||
* class Key to elements of class Value.
|
|
||||||
*
|
|
||||||
* @todo This implementation is fairly limited. In particular, the tree is not
|
|
||||||
* balanced. Ultimately this template should be reimplemented, e.g. using
|
|
||||||
* a red-black tree. Or if one day using Std C++ lib becomes acceptable,
|
|
||||||
* we can use that.
|
|
||||||
* @todo Having unit tests for this class would be very desirable. There are a
|
|
||||||
* big number of things which can go wrong in this code.
|
|
||||||
*/
|
|
||||||
template <class Key, class Value, class Comparator = Less<Key> >
|
|
||||||
class Map {
|
|
||||||
protected:
|
|
||||||
struct BaseNode {
|
|
||||||
Key _key;
|
|
||||||
Value _value;
|
|
||||||
BaseNode() {}
|
|
||||||
BaseNode(const Key &key) : _key(key) {}
|
|
||||||
};
|
|
||||||
struct Node : BaseNode {
|
|
||||||
Node *_parent;
|
|
||||||
Node *_left, *_right;
|
|
||||||
Node() : _parent(0), _left(0), _right(0) {}
|
|
||||||
Node(const Key &key, Node *parent) : BaseNode(key), _parent(parent), _left(0), _right(0) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
Node *_root;
|
|
||||||
Node *_header;
|
|
||||||
|
|
||||||
Comparator _cmp;
|
|
||||||
|
|
||||||
uint _size;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Map<Key, Value, Comparator>(const Map<Key, Value, Comparator> &map);
|
|
||||||
Map<Key, Value, Comparator> &operator =(const Map<Key, Value, Comparator> &map);
|
|
||||||
|
|
||||||
public:
|
|
||||||
class const_iterator {
|
|
||||||
friend class Map<Key, Value, Comparator>;
|
|
||||||
protected:
|
|
||||||
Node *_node;
|
|
||||||
const_iterator(Node *node) : _node(node) {}
|
|
||||||
|
|
||||||
public:
|
|
||||||
const_iterator() : _node(0) {}
|
|
||||||
|
|
||||||
const BaseNode &operator *() const { assert(_node != 0); return *_node; }
|
|
||||||
const BaseNode *operator->() const { assert(_node != 0); return _node; }
|
|
||||||
bool operator ==(const const_iterator &iter) const { return _node == iter._node; }
|
|
||||||
bool operator !=(const const_iterator &iter) const { return !(*this == iter); }
|
|
||||||
const_iterator operator ++() {
|
|
||||||
if (!_node)
|
|
||||||
return *this;
|
|
||||||
if (_node->_right) {
|
|
||||||
_node = _node->_right;
|
|
||||||
while (_node->_left)
|
|
||||||
_node = _node->_left;
|
|
||||||
} else {
|
|
||||||
Node *parent = _node->_parent;
|
|
||||||
while (_node == parent->_right) {
|
|
||||||
_node = parent;
|
|
||||||
parent = _node->_parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_node->_right != parent)
|
|
||||||
_node = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_node->_parent == 0)
|
|
||||||
_node = 0;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
Map<Key, Value, Comparator>() : _root(0), _size(0) {
|
|
||||||
_header = new Node();
|
|
||||||
_header->_right = _header->_left = _header;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef __SYMBIAN32__
|
|
||||||
virtual ~Map<Key, Value, Comparator>()
|
|
||||||
#else
|
|
||||||
~Map()
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
clearNodes(_root);
|
|
||||||
delete _header;
|
|
||||||
_root = _header = 0;
|
|
||||||
_size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the object for the given key. If no match is found, a new entry
|
|
||||||
* with the given key and the default data value is inserted.
|
|
||||||
*/
|
|
||||||
Value &operator [](const Key &key) {
|
|
||||||
Node *node;
|
|
||||||
if (!_root) {
|
|
||||||
node = _root = new Node(key, _header);
|
|
||||||
_size++;
|
|
||||||
} else {
|
|
||||||
node = findOrCreateNode(_root, key);
|
|
||||||
}
|
|
||||||
return node->_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Value &operator [](const Key &key) const {
|
|
||||||
Node *node = findNode(_root, key);
|
|
||||||
assert(node != 0);
|
|
||||||
return node->_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool contains(const Key &key) const {
|
|
||||||
return (findNode(_root, key) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear() {
|
|
||||||
clearNodes(_root);
|
|
||||||
_root = 0;
|
|
||||||
_size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool empty() const {
|
|
||||||
return (_root == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint size() const { return _size; }
|
|
||||||
|
|
||||||
size_t erase(const Key &key) {
|
|
||||||
// TODO - implement efficiently. Indeed, maybe switch to using red-black trees?
|
|
||||||
// For now, just a lame, bad remove algorithm. Rule: don't remove elements
|
|
||||||
// from one of our maps if you need to be efficient :-)
|
|
||||||
Node *node = findNode(_root, key);
|
|
||||||
if (!node)
|
|
||||||
return 0; // key wasn't present, so no work has to be done
|
|
||||||
|
|
||||||
// Now we have to remove 'node'. There are two simple cases and one hard.
|
|
||||||
Node *parent = node->_parent;
|
|
||||||
Node *rep;
|
|
||||||
if (!node->_left) {
|
|
||||||
rep = node->_right;
|
|
||||||
} else if (!node->_right) {
|
|
||||||
rep = node->_left;
|
|
||||||
} else {
|
|
||||||
// We have to do it the hard way since both children are present.
|
|
||||||
Node *n2;
|
|
||||||
|
|
||||||
n2 = rep = node->_right;
|
|
||||||
|
|
||||||
// Now insert the left child leftmost into our right child
|
|
||||||
while (n2->_left)
|
|
||||||
n2 = n2->_left;
|
|
||||||
n2->_left = node->_left;
|
|
||||||
n2->_left->_parent = n2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace this node with node 'rep'
|
|
||||||
if (rep)
|
|
||||||
rep->_parent = parent;
|
|
||||||
if (parent == _header) // Root node?
|
|
||||||
_root = rep;
|
|
||||||
else if (parent->_left == node)
|
|
||||||
parent->_left = rep;
|
|
||||||
else
|
|
||||||
parent->_right = rep;
|
|
||||||
|
|
||||||
// Finally free the allocated memory
|
|
||||||
delete node;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void merge(const Map<Key, Value, Comparator> &map) {
|
|
||||||
merge(map._root);
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator begin() const {
|
|
||||||
Node *node = _root;
|
|
||||||
if (node) {
|
|
||||||
while (node->_left)
|
|
||||||
node = node->_left;
|
|
||||||
}
|
|
||||||
return const_iterator(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator end() const {
|
|
||||||
return const_iterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator find(const Key &key) const {
|
|
||||||
Node *node = findNode(_root, key);
|
|
||||||
if (node)
|
|
||||||
return const_iterator(node);
|
|
||||||
return end();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/** Merge the content of the given tree into this tree. */
|
|
||||||
void merge(const Node *node) {
|
|
||||||
if (!node)
|
|
||||||
return;
|
|
||||||
(*this)[node->_key] = node->_value;
|
|
||||||
merge(node->_left);
|
|
||||||
merge(node->_right);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Find and return the node matching the given key, if any. */
|
|
||||||
Node *findNode(Node *node, const Key &key) const {
|
|
||||||
while (node) {
|
|
||||||
if (_cmp(key, node->_key))
|
|
||||||
node = node->_left;
|
|
||||||
else if (_cmp(node->_key, key))
|
|
||||||
node = node->_right;
|
|
||||||
else
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Node *findOrCreateNode(Node *node, const Key &key) {
|
|
||||||
Node *prevNode = 0;
|
|
||||||
bool left = true;
|
|
||||||
while (node) {
|
|
||||||
prevNode = node;
|
|
||||||
if (_cmp(key, node->_key)) {
|
|
||||||
left = true;
|
|
||||||
node = node->_left;
|
|
||||||
} else if (_cmp(node->_key, key)) {
|
|
||||||
left = false;
|
|
||||||
node = node->_right;
|
|
||||||
} else
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
node = new Node(key, prevNode);
|
|
||||||
_size++;
|
|
||||||
if (left) {
|
|
||||||
prevNode->_left = node;
|
|
||||||
} else {
|
|
||||||
prevNode->_right = node;
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearNodes(Node *node) {
|
|
||||||
if (!node)
|
|
||||||
return;
|
|
||||||
|
|
||||||
clearNodes(node->_left);
|
|
||||||
clearNodes(node->_right);
|
|
||||||
delete node;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // End of namespace Common
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
#include "common/file.h"
|
#include "common/file.h"
|
||||||
#include "common/md5.h"
|
#include "common/md5.h"
|
||||||
#include "common/map.h"
|
#include "common/hashmap.h"
|
||||||
#include "common/config-manager.h"
|
#include "common/config-manager.h"
|
||||||
#include "base/plugins.h"
|
#include "base/plugins.h"
|
||||||
#include "base/gameDetector.h"
|
#include "base/gameDetector.h"
|
||||||
|
@ -1508,10 +1508,10 @@ static int detectGame(const FSList *fslist, Common::Language language, Common::P
|
||||||
int gamesCount = ARRAYSIZE(gameDescriptions);
|
int gamesCount = ARRAYSIZE(gameDescriptions);
|
||||||
int filesCount;
|
int filesCount;
|
||||||
|
|
||||||
typedef Common::Map<Common::String, bool> StringSet;
|
typedef Common::HashMap<Common::String, bool> StringSet;
|
||||||
StringSet filesList;
|
StringSet filesList;
|
||||||
|
|
||||||
typedef Common::Map<Common::String, Common::String> StringMap;
|
typedef Common::HashMap<Common::String, Common::String> StringMap;
|
||||||
StringMap filesMD5;
|
StringMap filesMD5;
|
||||||
|
|
||||||
Common::String tstr;
|
Common::String tstr;
|
||||||
|
|
|
@ -951,7 +951,7 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {
|
||||||
char tempName[128];
|
char tempName[128];
|
||||||
SubstResFileNames subst = { 0, 0, kGenAsIs };
|
SubstResFileNames subst = { 0, 0, kGenAsIs };
|
||||||
|
|
||||||
typedef Common::Map<Common::String, bool> StringSet;
|
typedef Common::HashMap<Common::String, bool> StringSet;
|
||||||
StringSet fileSet;
|
StringSet fileSet;
|
||||||
|
|
||||||
for (g = scumm_settings; g->gameid; ++g) {
|
for (g = scumm_settings; g->gameid; ++g) {
|
||||||
|
|
|
@ -1253,10 +1253,10 @@ static int detectGame(const FSList *fslist, Common::Language language, Common::P
|
||||||
int gamesCount = ARRAYSIZE(gameDescriptions);
|
int gamesCount = ARRAYSIZE(gameDescriptions);
|
||||||
int filesCount;
|
int filesCount;
|
||||||
|
|
||||||
typedef Common::Map<Common::String, bool> StringSet;
|
typedef Common::HashMap<Common::String, bool> StringSet;
|
||||||
StringSet filesList;
|
StringSet filesList;
|
||||||
|
|
||||||
typedef Common::Map<Common::String, Common::String> StringMap;
|
typedef Common::HashMap<Common::String, Common::String> StringMap;
|
||||||
StringMap filesMD5;
|
StringMap filesMD5;
|
||||||
|
|
||||||
Common::String tstr, tstr2;
|
Common::String tstr, tstr2;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue