diff options
Diffstat (limited to 'src/emu/drivenum.h')
-rw-r--r-- | src/emu/drivenum.h | 75 |
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 |