mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-23 02:11:38 +00:00
a27285f117
svn-id: r38842
96 lines
2.8 KiB
C++
96 lines
2.8 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* 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 SCI_ENGINE_INTMAP_H
|
|
#define SCI_ENGINE_INTMAP_H
|
|
|
|
#include "common/scummsys.h"
|
|
|
|
namespace Sci {
|
|
|
|
|
|
|
|
|
|
// Assumes that the ints are relatively evenly distributed
|
|
enum {
|
|
DCS_INT_HASH_MAX = 256
|
|
};
|
|
|
|
/**
|
|
* Defines a map from arbitrary integers to "small" integers, useable as index
|
|
* into small arrays. This class is somewhat like a hashmap, but not quite:
|
|
* Unlike a hashmap, it generates the values associated to each key. It does
|
|
* not try to be very clever about it, either, e.g. using a linked list of
|
|
* values to keep track of what is mapped where.
|
|
* Another important feature is that it reclaims unused values when they
|
|
* are removed.
|
|
*
|
|
* All in all, this implementation is not very elegant, and wastes memory.
|
|
* But it does the job. Any rewrite of this class would have to provide a
|
|
* way to load the old savegames made using the current implementation.
|
|
*/
|
|
struct IntMapper {
|
|
|
|
struct Node {
|
|
int key;
|
|
int idx;
|
|
Node *next;
|
|
};
|
|
|
|
int base_value; // Starts at zero, counts upwards
|
|
Node *nodes[DCS_INT_HASH_MAX];
|
|
Node *holes; /* List of freed entries to minimize
|
|
** memory operations and modifications
|
|
** to base_value */
|
|
|
|
void free_node_recursive(Node *node);
|
|
|
|
public:
|
|
IntMapper();
|
|
~IntMapper();
|
|
|
|
/**
|
|
* Checks whether a key is in the map, adds it if neccessary.
|
|
* @param value The key to check for/add
|
|
* @param add Whether to add the key if it's not in there
|
|
* @param was_added Set to non-zero if and only if the key is new, ignored if NULL.
|
|
* @return The new (or old) index, or -1 if add was zero and
|
|
* the key couldn't be found
|
|
*/
|
|
int checkKey(int key, bool add, bool *wasAdded = 0);
|
|
|
|
/**
|
|
* Removes a key from the map.
|
|
* @param key The key to remove
|
|
* @return The index of the key, or -1 if it wasn't present
|
|
*/
|
|
int removeKey(int key);
|
|
|
|
};
|
|
|
|
} // End of namespace Sci
|
|
|
|
#endif // SCI_ENGINE_INTMAP_H
|