summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/drivenum.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/drivenum.h')
-rw-r--r--src/emu/drivenum.h75
1 files changed, 38 insertions, 37 deletions
diff --git a/src/emu/drivenum.h b/src/emu/drivenum.h
index 3732915b46a..8db4fa9766c 100644
--- a/src/emu/drivenum.h
+++ b/src/emu/drivenum.h
@@ -8,10 +8,14 @@
***************************************************************************/
+#ifndef MAME_EMU_DRIVENUM_H
+#define MAME_EMU_DRIVENUM_H
+
#pragma once
-#ifndef __DRIVENUM_H__
-#define __DRIVENUM_H__
+#include <algorithm>
+#include <cassert>
+#include <memory>
//**************************************************************************
@@ -38,18 +42,18 @@ protected:
public:
// getters
- static int total() { return s_driver_count; }
+ static std::size_t total() { return s_driver_count; }
// any item by index
- static const game_driver &driver(int index) { assert(index >= 0 && index < s_driver_count); return *s_drivers_sorted[index]; }
- static int clone(int index) { return find(driver(index).parent); }
- static int non_bios_clone(int index) { int result = find(driver(index).parent); return (result != -1 && (driver(result).flags & MACHINE_IS_BIOS_ROOT) == 0) ? result : -1; }
- static int compatible_with(int index) { return find(driver(index).compatible_with); }
+ static const game_driver &driver(std::size_t index) { assert(index < total()); return *s_drivers_sorted[index]; }
+ static int clone(std::size_t index) { return find(driver(index).parent); }
+ static int non_bios_clone(std::size_t index) { int const result = find(driver(index).parent); return ((result >= 0) && !(driver(result).flags & MACHINE_IS_BIOS_ROOT)) ? result : -1; }
+ static int compatible_with(std::size_t index) { return find(driver(index).compatible_with); }
// any item by driver
- static int clone(const game_driver &driver) { int index = find(driver); assert(index != -1); return clone(index); }
- static int non_bios_clone(const game_driver &driver) { int index = find(driver); assert(index != -1); return non_bios_clone(index); }
- static int compatible_with(const game_driver &driver) { int index = find(driver); assert(index != -1); return compatible_with(index); }
+ static int clone(const game_driver &driver) { int const index = find(driver); assert(index >= 0); return clone(index); }
+ static int non_bios_clone(const game_driver &driver) { int const index = find(driver); assert(index >= 0); return non_bios_clone(index); }
+ static int compatible_with(const game_driver &driver) { int const index = find(driver); assert(index >= 0); return compatible_with(index); }
// general helpers
static int find(const char *name);
@@ -60,12 +64,8 @@ public:
static int penalty_compare(const char *source, const char *target);
protected:
- // internal helpers
- static int driver_sort_callback(const void *elem1, const void *elem2);
-
- // internal state
- static int s_driver_count;
- static const game_driver * const s_drivers_sorted[];
+ static std::size_t const s_driver_count;
+ static game_driver const * const s_drivers_sorted[];
};
@@ -84,13 +84,13 @@ public:
~driver_enumerator();
// getters
- int count() const { return m_filtered_count; }
+ std::size_t count() const { return m_filtered_count; }
int current() const { return m_current; }
emu_options &options() const { return m_options; }
// current item
const game_driver &driver() const { return driver_list::driver(m_current); }
- machine_config &config() const { return config(m_current, m_options); }
+ std::shared_ptr<machine_config> const &config() const { return config(m_current, m_options); }
int clone() const { return driver_list::clone(m_current); }
int non_bios_clone() const { return driver_list::non_bios_clone(m_current); }
int compatible_with() const { return driver_list::compatible_with(m_current); }
@@ -98,20 +98,20 @@ public:
void exclude() { exclude(m_current); }
// any item by index
- bool included(int index) const { assert(index >= 0 && index < s_driver_count); return m_included[index]; }
- bool excluded(int index) const { assert(index >= 0 && index < s_driver_count); return !m_included[index]; }
- machine_config &config(int index) const { return config(index,m_options); }
- machine_config &config(int index, emu_options &options) const;
- void include(int index) { assert(index >= 0 && index < s_driver_count); if (!m_included[index]) { m_included[index] = true; m_filtered_count++; } }
- void exclude(int index) { assert(index >= 0 && index < s_driver_count); if (m_included[index]) { m_included[index] = false; m_filtered_count--; } }
+ bool included(std::size_t index) const { assert(index < m_included.size()); return m_included[index]; }
+ bool excluded(std::size_t index) const { assert(index < m_included.size()); return !m_included[index]; }
+ std::shared_ptr<machine_config> const &config(std::size_t index) const { return config(index, m_options); }
+ std::shared_ptr<machine_config> const &config(std::size_t index, emu_options &options) const;
+ void include(std::size_t index) { assert(index < m_included.size()); if (!m_included[index]) { m_included[index] = true; m_filtered_count++; } }
+ void exclude(std::size_t index) { assert(index < m_included.size()); if (m_included[index]) { m_included[index] = false; m_filtered_count--; } }
using driver_list::driver;
using driver_list::clone;
using driver_list::non_bios_clone;
using driver_list::compatible_with;
// filtering/iterating
- int filter(const char *string = nullptr);
- int filter(const game_driver &driver);
+ std::size_t filter(const char *string = nullptr);
+ std::size_t filter(const game_driver &driver);
void include_all();
void exclude_all() { std::fill(m_included.begin(), m_included.end(), false); m_filtered_count = 0; }
void reset() { m_current = -1; }
@@ -119,22 +119,23 @@ public:
bool next_excluded();
// general helpers
- void set_current(int index) { assert(index >= -1 && index <= s_driver_count); m_current = index; }
- void find_approximate_matches(const char *string, int count, int *results);
+ void set_current(std::size_t index) { assert(index < s_driver_count); m_current = index; }
+ void find_approximate_matches(const char *string, std::size_t count, int *results);
private:
+ static constexpr std::size_t CONFIG_CACHE_COUNT = 100;
+
+ typedef util::lru_cache_map<std::size_t, std::shared_ptr<machine_config> > machine_config_cache;
+
// internal helpers
void release_current() const;
- static const int CONFIG_CACHE_COUNT = 100;
-
// internal state
- int m_current;
- int m_filtered_count;
- emu_options & m_options;
- std::vector<bool> m_included;
- mutable std::vector<std::unique_ptr<machine_config>> m_config;
- mutable std::vector<int> m_config_cache;
+ int m_current;
+ std::size_t m_filtered_count;
+ emu_options & m_options;
+ std::vector<bool> m_included;
+ mutable machine_config_cache m_config;
};
-#endif
+#endif // MAME_EMU_DRIVENUM_H