summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/lib.lua1
-rw-r--r--src/emu/machine.cpp32
-rw-r--r--src/emu/video.cpp9
-rw-r--r--src/lib/util/tagmap.cpp20
-rw-r--r--src/lib/util/tagmap.h261
5 files changed, 7 insertions, 316 deletions
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua
index 8c9162ccd65..833504a92f7 100644
--- a/scripts/src/lib.lua
+++ b/scripts/src/lib.lua
@@ -86,7 +86,6 @@ project "utils"
MAME_DIR .. "src/lib/util/pool.h",
MAME_DIR .. "src/lib/util/sha1.cpp",
MAME_DIR .. "src/lib/util/sha1.h",
- MAME_DIR .. "src/lib/util/tagmap.cpp",
MAME_DIR .. "src/lib/util/tagmap.h",
MAME_DIR .. "src/lib/util/unicode.cpp",
MAME_DIR .. "src/lib/util/unicode.h",
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index 16b11f5a970..c2f0a2c85e3 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -354,11 +354,6 @@ int running_machine::run(bool firstrun)
// perform a soft reset -- this takes us to the running phase
soft_reset();
-#ifdef MAME_DEBUG
- g_tagmap_finds = 0;
- if (strcmp(config().m_gamedrv.name, "___empty") != 0)
- g_tagmap_counter_enabled = true;
-#endif
// handle initial load
if (m_saveload_schedule != SLS_NONE)
handle_saveload();
@@ -392,15 +387,6 @@ int running_machine::run(bool firstrun)
// and out via the exit phase
m_current_phase = MACHINE_PHASE_EXIT;
-#ifdef MAME_DEBUG
- if (g_tagmap_counter_enabled)
- {
- g_tagmap_counter_enabled = false;
- if (*(options().command()) == 0)
- osd_printf_info("%d tagmap lookups\n", g_tagmap_finds);
- }
-#endif
-
// save the NVRAM and configuration
sound().ui_mute(true);
nvram_save();
@@ -443,15 +429,6 @@ int running_machine::run(bool firstrun)
// in case we got here via exception
m_current_phase = MACHINE_PHASE_EXIT;
-#ifdef MAME_DEBUG
- if (g_tagmap_counter_enabled)
- {
- g_tagmap_counter_enabled = false;
- if (*(options().command()) == 0)
- osd_printf_info("%d tagmap lookups\n", g_tagmap_finds);
- }
-#endif
-
// call all exit callbacks registered
call_notifiers(MACHINE_NOTIFY_EXIT);
zip_file_cache_clear();
@@ -473,15 +450,6 @@ void running_machine::schedule_exit()
// if we're executing, abort out immediately
m_scheduler.eat_all_cycles();
-#ifdef MAME_DEBUG
- if (g_tagmap_counter_enabled)
- {
- g_tagmap_counter_enabled = false;
- if (*(options().command()) == 0)
- osd_printf_info("%d tagmap lookups\n", g_tagmap_finds);
- }
-#endif
-
// if we're autosaving on exit, schedule a save as well
if (options().autosave() && (m_system.flags & MACHINE_SUPPORTS_SAVE) && this->time() > attotime::zero)
schedule_save("auto");
diff --git a/src/emu/video.cpp b/src/emu/video.cpp
index ea50e8a662b..1d7c9096b3a 100644
--- a/src/emu/video.cpp
+++ b/src/emu/video.cpp
@@ -1037,15 +1037,6 @@ void video_manager::recompute_speed(const attotime &emutime)
// if we're past the "time-to-execute" requested, signal an exit
if (m_seconds_to_run != 0 && emutime.seconds() >= m_seconds_to_run)
{
-#ifdef MAME_DEBUG
- if (g_tagmap_counter_enabled)
- {
- g_tagmap_counter_enabled = false;
- if (*(machine().options().command()) == 0)
- osd_printf_info("%d tagmap lookups\n", g_tagmap_finds);
- }
-#endif
-
if (machine().first_screen() != nullptr)
{
// create a final screenshot
diff --git a/src/lib/util/tagmap.cpp b/src/lib/util/tagmap.cpp
deleted file mode 100644
index 7995b578314..00000000000
--- a/src/lib/util/tagmap.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/***************************************************************************
-
- tagmap.c
-
- tagmap counter
-
-***************************************************************************/
-
-#include <assert.h>
-
-#include "tagmap.h"
-
-#ifdef MAME_DEBUG
-/** @brief The tagmap finds. */
-INT32 g_tagmap_finds = 0;
-/** @brief true to enable, false to disable the tagmap counter. */
-bool g_tagmap_counter_enabled = false;
-#endif
diff --git a/src/lib/util/tagmap.h b/src/lib/util/tagmap.h
index 23bcdd30470..aa456c8ff5e 100644
--- a/src/lib/util/tagmap.h
+++ b/src/lib/util/tagmap.h
@@ -17,11 +17,7 @@
#include "coretmpl.h"
#include <string>
#include <utility>
-#ifdef MAME_DEBUG
-#include "eminline.h"
-#endif
-
-
+#include <unordered_map>
//**************************************************************************
// CONSTANTS
@@ -33,169 +29,6 @@ enum tagmap_error
TMERR_DUPLICATE
};
-
-#ifdef MAME_DEBUG
-extern INT32 g_tagmap_finds;
-extern bool g_tagmap_counter_enabled;
-#endif
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// generally used for small tables, though the hash size can be increased
-// as necessary; good primes are: 53, 97, 193, 389, 769, 1543, 3079, 6151, etc
-template<class _ElementType, int _HashSize = 53>
-class tagmap_t
-{
-private:
- // disable copying/assignment
- tagmap_t(const tagmap_t &);
- tagmap_t &operator=(const tagmap_t &);
-
-public:
- // an entry in the table
- class entry_t
- {
- friend class tagmap_t<_ElementType, _HashSize>;
-
- public:
- // construction/destruction
- entry_t(const char *tag, UINT32 fullhash, _ElementType object)
- : m_next(nullptr),
- m_fullhash(fullhash),
- m_tag(tag),
- m_object(std::move(object)) { }
-
- // accessors
- const std::string &tag() const { return m_tag; }
- _ElementType object() const { return m_object; }
-
- // setters
- void set_object(_ElementType object) { m_object = object; }
-
- private:
- // internal helpers
- entry_t *next() const { return m_next; }
- UINT32 fullhash() const { return m_fullhash; }
-
- // internal state
- entry_t * m_next;
- UINT32 m_fullhash;
- std::string m_tag;
- _ElementType m_object;
- };
-
- // construction/destruction
- tagmap_t() { memset(m_table, 0, sizeof(m_table)); }
- ~tagmap_t() { reset(); }
-
- // core hashing function
- UINT32 hash(const char *string) const
- {
- UINT32 result = *string++;
- for (UINT8 c = *string++; c != 0; c = *string++)
- result = (result*33) ^ c;
- return result;
- }
-
- // empty the list
- void reset()
- {
- for (auto & elem : m_table)
- while (elem != nullptr)
- remove_common(&elem);
- }
-
- // add/remove
- tagmap_error add(const char *tag, _ElementType object, bool replace_if_duplicate = false) { return add_common(tag, object, replace_if_duplicate, false); }
- tagmap_error add_unique_hash(const char *tag, _ElementType object, bool replace_if_duplicate = false) { return add_common(tag, object, replace_if_duplicate, true); }
-
- // remove by tag
- void remove(const char *tag)
- {
- UINT32 fullhash = hash(tag);
- for (entry_t **entryptr = &m_table[fullhash % ARRAY_LENGTH(m_table)]; *entryptr != nullptr; entryptr = &(*entryptr)->m_next)
- if ((*entryptr)->fullhash() == fullhash && (*entryptr)->tag() == tag)
- return remove_common(entryptr);
- }
-
- // remove by object
- void remove(_ElementType object)
- {
- for (auto & elem : m_table)
- for (entry_t **entryptr = &elem; *entryptr != nullptr; entryptr = &(*entryptr)->m_next)
- if ((*entryptr)->object() == object)
- return remove_common(entryptr);
- }
-
- // find by tag
- _ElementType find(const char *tag) const { return find(tag, hash(tag)); }
-
- // find by tag with precomputed hash
- _ElementType find(const char *tag, UINT32 fullhash) const
- {
-#ifdef MAME_DEBUG
- if (g_tagmap_counter_enabled)
- atomic_increment32(&g_tagmap_finds);
-#endif
- for (entry_t *entry = m_table[fullhash % ARRAY_LENGTH(m_table)]; entry != nullptr; entry = entry->next())
- if (entry->fullhash() == fullhash && entry->tag() == tag)
- return entry->object();
- return _ElementType(NULL);
- }
-
- // find by tag without checking anything but the hash
- _ElementType find_hash_only(const char *tag) const
- {
-#ifdef MAME_DEBUG
- if (g_tagmap_counter_enabled)
- atomic_increment32(&g_tagmap_finds);
-#endif
- UINT32 fullhash = hash(tag);
- for (entry_t *entry = m_table[fullhash % ARRAY_LENGTH(m_table)]; entry != nullptr; entry = entry->next())
- if (entry->fullhash() == fullhash)
- return entry->object();
- return nullptr;
- }
-
- // return first object in the table
- entry_t *first() const { return next(NULL); }
-
- // return next object in the table
- entry_t *next(entry_t *after) const
- {
- // if there's another item in this hash bucket, just return it
- if (after != NULL && after->next() != NULL)
- return after->next();
-
- // otherwise scan forward for the next bucket with an entry
- UINT32 firstindex = (after != NULL) ? (after->fullhash() % ARRAY_LENGTH(m_table) + 1) : 0;
- for (UINT32 hashindex = firstindex; hashindex < ARRAY_LENGTH(m_table); hashindex++)
- if (m_table[hashindex] != NULL)
- return m_table[hashindex];
-
- // all out
- return NULL;
- }
-
-private:
- // internal helpers
- tagmap_error add_common(const char *tag, _ElementType object, bool replace_if_duplicate, bool unique_hash);
-
- // remove an entry given a pointer to its pointer
- void remove_common(entry_t **entryptr)
- {
- entry_t *entry = *entryptr;
- *entryptr = entry->next();
- global_free(entry);
- }
-
- // internal state
- entry_t * m_table[_HashSize];
-};
-
-
// ======================> tagged_list
class add_exception
@@ -225,12 +58,12 @@ public:
int count() const { return m_list.count(); }
// remove (free) all objects in the list, leaving an empty list
- void reset() { m_list.reset(); m_map.reset(); }
+ void reset() { m_list.reset(); m_map.clear(); }
// add the given object to the head of the list
_ElementType &prepend(const char *tag, _ElementType &object)
{
- if (m_map.add_unique_hash(tag, &object, false) != TMERR_NONE)
+ if (!m_map.insert(std::make_pair(tag, &object)).second)
throw add_exception(tag);
return m_list.prepend(object);
}
@@ -238,100 +71,20 @@ public:
// add the given object to the tail of the list
_ElementType &append(const char *tag, _ElementType &object)
{
- if (m_map.add_unique_hash(tag, &object, false) != TMERR_NONE)
+ if (!m_map.insert(std::make_pair(tag, &object)).second)
throw add_exception(tag);
return m_list.append(object);
}
- // insert the given object after a particular object (NULL means prepend)
- _ElementType &insert_after(const char *tag, _ElementType &object, _ElementType *insert_after)
- {
- if (m_map.add_unique_hash(tag, &object, false) != TMERR_NONE)
- throw add_exception(tag);
- return m_list.insert_after(object, insert_after);
- }
-
- // replace an item in the list at the same location, and remove it
- _ElementType &replace_and_remove(const char *tag, _ElementType &object, _ElementType &toreplace)
- {
- m_map.remove(&toreplace);
- m_list.replace_and_remove(object, toreplace);
- if (m_map.add_unique_hash(tag, &object, false) != TMERR_NONE)
- throw add_exception(tag);
- return object;
- }
-
- // detach the given item from the list, but don't free its memory
- _ElementType &detach(_ElementType &object)
- {
- m_map.remove(&object);
- return m_list.detach(object);
- }
-
- // remove the given object and free its memory
- void remove(_ElementType &object)
- {
- m_map.remove(&object);
- return m_list.remove(object);
- }
-
- // find an object by index in the list
- _ElementType *find(int index) const
- {
- return m_list.find(index);
- }
-
- // return the index of the given object in the list
- int indexof(const _ElementType &object) const
- {
- return m_list.indexof(object);
- }
-
// operations by tag
- _ElementType &replace_and_remove(const char *tag, _ElementType &object) { _ElementType *existing = find(tag); return (existing == NULL) ? append(tag, object) : replace_and_remove(tag, object, *existing); }
- void remove(const char *tag) { _ElementType *object = find(tag); if (object != nullptr) remove(*object); }
- _ElementType *find(const char *tag) const { return m_map.find_hash_only(tag); }
- int indexof(const char *tag) const { _ElementType *object = find(tag); return (object != NULL) ? m_list.indexof(*object) : NULL; }
+ void remove(const char *tag) { auto search = m_map.find(tag); if (search != m_map.end()) m_list.remove(*search->second); }
+ _ElementType *find(const char *tag) const { auto search = m_map.find(tag); return (search == m_map.end()) ? nullptr : search->second; }
private:
// internal state
simple_list<_ElementType> m_list;
- tagmap_t<_ElementType *> m_map;
+ std::unordered_map<std::string,_ElementType *> m_map;
};
-
-//**************************************************************************
-// IMPLEMENTATION
-//**************************************************************************
-
-//-------------------------------------------------
-// add_common - core implementation of a tagmap
-// addition
-//-------------------------------------------------
-
-template<class _ElementType, int _HashSize>
-tagmap_error tagmap_t<_ElementType, _HashSize>::add_common(const char *tag, _ElementType object, bool replace_if_duplicate, bool unique_hash)
-{
- UINT32 fullhash = hash(tag);
- UINT32 hashindex = fullhash % ARRAY_LENGTH(m_table);
-
- // first make sure we don't have a duplicate
- for (entry_t *entry = m_table[hashindex]; entry != nullptr; entry = entry->next())
- if (entry->fullhash() == fullhash)
- if (unique_hash || entry->tag() == tag)
- {
- if (replace_if_duplicate)
- entry->set_object(object);
- return TMERR_DUPLICATE;
- }
-
- // now allocate a new entry and add to the head of the list
- auto entry = global_alloc(entry_t(tag, fullhash, object));
- entry->m_next = m_table[hashindex];
- m_table[hashindex] = entry;
- return TMERR_NONE;
-}
-
-
#endif /* __TAGMAP_H__ */