diff options
author | Vas Crabb <vas@vastheman.com> | 2016-08-30 01:31:23 +1000 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2016-08-30 01:31:23 +1000 |
commit | 46bf1ce04bf75f7e5e613a993ac0cf1859b068ec (patch) | |
tree | 8e071c12fb7edfd77494d3cd97fbf154a87087c5 | |
parent | 7c6a527e2630f9317e2941ea991e8d7df1282544 (diff) |
More cleanup on the back of Osso's fix for a7e393b36b57cead61978f332135a509b2ddc82a (nw)
* Make iterators actually meet requirements of ForwardIterator (and by consequence, ForwardIterator, Iterator and EqualityComparable)
* Don't use function statics if they can be avoided - it isn't thread-safe
* Remove leftover crud from when dynamic_buffer and friends were templates in lib/util
It's still dangerous that the const behaviour of iterators doesn't match STL.
Also, simple_list members with similar functionality to STL container members should be renamed.
-rw-r--r-- | src/emu/device.h | 38 | ||||
-rw-r--r-- | src/emu/emumem.cpp | 2 | ||||
-rw-r--r-- | src/emu/render.h | 2 | ||||
-rw-r--r-- | src/emu/rendlay.cpp | 4 | ||||
-rw-r--r-- | src/lib/util/coretmpl.h | 51 |
5 files changed, 66 insertions, 31 deletions
diff --git a/src/emu/device.h b/src/emu/device.h index 6f2db9b6785..eedfebc0d91 100644 --- a/src/emu/device.h +++ b/src/emu/device.h @@ -111,7 +111,7 @@ class device_t : public delegate_late_bind friend class device_t; friend class machine_config; -public: + public: // construction/destruction subdevice_list() { } @@ -125,7 +125,7 @@ public: auto_iterator begin() const { return m_list.begin(); } auto_iterator end() const { return m_list.end(); } -private: + private: // private helpers device_t *find(const std::string &name) const { @@ -149,19 +149,28 @@ private: friend class device_state_interface; friend class device_execute_interface; -public: + public: class auto_iterator { -public: + public: + typedef std::ptrdiff_t difference_type; + typedef device_interface value_type; + typedef device_interface *pointer; + typedef device_interface &reference; + typedef std::forward_iterator_tag iterator_category; + // construction/destruction auto_iterator(device_interface *intf) : m_current(intf) { } - // required operator overrides + // required operator overloads + bool operator==(const auto_iterator &iter) const { return m_current == iter.m_current; } bool operator!=(const auto_iterator &iter) const { return m_current != iter.m_current; } device_interface &operator*() const { return *m_current; } - const auto_iterator &operator++(); + device_interface *operator->() const { return m_current; } + auto_iterator &operator++(); + auto_iterator operator++(int); -private: + private: // private state device_interface *m_current; }; @@ -176,8 +185,8 @@ private: auto_iterator begin() const { return auto_iterator(m_head); } auto_iterator end() const { return auto_iterator(nullptr); } -private: - device_interface * m_head; // head of interface list + private: + device_interface *m_head; // head of interface list device_execute_interface *m_execute; // pre-cached pointer to execute interface device_memory_interface *m_memory; // pre-cached pointer to memory interface device_state_interface *m_state; // pre-cached pointer to state interface @@ -768,12 +777,19 @@ inline device_t *device_t::siblingdevice(const char *tag) const } -// this operator requires device_interface to be a complete type -inline const device_t::interface_list::auto_iterator &device_t::interface_list::auto_iterator::operator++() +// these operators requires device_interface to be a complete type +inline device_t::interface_list::auto_iterator &device_t::interface_list::auto_iterator::operator++() { m_current = m_current->interface_next(); return *this; } +inline device_t::interface_list::auto_iterator device_t::interface_list::auto_iterator::operator++(int) +{ + auto_iterator result(*this); + m_current = m_current->interface_next(); + return result; +} + #endif /* __DEVICE_H__ */ diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp index 8ac780cb598..b761409ce42 100644 --- a/src/emu/emumem.cpp +++ b/src/emu/emumem.cpp @@ -4038,7 +4038,7 @@ memory_block::memory_block(address_space &space, offs_t bytestart, offs_t byteen m_byteend(byteend), m_data(reinterpret_cast<UINT8 *>(memory)) { - offs_t length = byteend + 1 - bytestart; + offs_t const length = byteend + 1 - bytestart; VPRINTF(("block_allocate('%s',%s,%08X,%08X,%p)\n", space.device().tag(), space.name(), bytestart, byteend, memory)); // allocate a block if needed diff --git a/src/emu/render.h b/src/emu/render.h index 77f8d418522..069ae534a32 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -1041,6 +1041,8 @@ private: simple_list<item> m_bezel_list; // list of bezel items simple_list<item> m_cpanel_list; // list of marquee items simple_list<item> m_marquee_list; // list of marquee items + + static const simple_list<item> s_null_list; }; diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index 4608897be5c..5a8b5dd3531 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -2208,6 +2208,8 @@ void layout_element::component::apply_skew(bitmap_argb32 &dest, int skewwidth) // LAYOUT VIEW //************************************************************************** +const simple_list<layout_view::item> layout_view::s_null_list; + //------------------------------------------------- // layout_view - constructor //------------------------------------------------- @@ -2270,8 +2272,6 @@ layout_view::~layout_view() const simple_list<layout_view::item> &layout_view::items(item_layer layer) const { - static simple_list<item> s_null_list; - switch (layer) { case ITEM_LAYER_BACKDROP: return m_backdrop_list; diff --git a/src/lib/util/coretmpl.h b/src/lib/util/coretmpl.h index c285f818b6a..b0e283378ed 100644 --- a/src/lib/util/coretmpl.h +++ b/src/lib/util/coretmpl.h @@ -16,14 +16,10 @@ #include "osdcore.h" #include "corealloc.h" +#include <iterator> +#include <utility> #include <vector> -// TEMPORARY helper to catch is_pod assertions in the debugger -#if 0 -#undef assert -#define assert(x) do { if (!(x)) { fprintf(stderr, "Assert: %s\n", #x); osd_break_into_debugger("Assertion failed"); } } while (0) -#endif - typedef std::vector<UINT8> dynamic_buffer; @@ -38,32 +34,53 @@ class simple_list final public: class auto_iterator { -public: + public: + typedef int difference_type; + typedef _ElementType value_type; + typedef _ElementType *pointer; + typedef _ElementType &reference; + typedef std::forward_iterator_tag iterator_category; + // construction/destruction + auto_iterator() noexcept : m_current(nullptr) { } auto_iterator(_ElementType *ptr) noexcept : m_current(ptr) { } - // required operator overrides + // required operator overloads + bool operator==(const auto_iterator &iter) const noexcept { return m_current == iter.m_current; } bool operator!=(const auto_iterator &iter) const noexcept { return m_current != iter.m_current; } _ElementType &operator*() const noexcept { return *m_current; } + _ElementType *operator->() const noexcept { return m_current; } // note that _ElementType::next() must not return a const ptr - const auto_iterator &operator++() noexcept { m_current = m_current->next(); return *this; } + auto_iterator &operator++() noexcept { m_current = m_current->next(); return *this; } + auto_iterator operator++(int) noexcept { auto_iterator result(*this); m_current = m_current->next(); return result; } -private: + private: // private state _ElementType *m_current; }; + // construction/destruction + simple_list() noexcept + : m_head(nullptr) + , m_tail(nullptr) + , m_count(0) + { + } + ~simple_list() noexcept { reset(); } + // we don't support deep copying simple_list(const simple_list &) = delete; simple_list &operator=(const simple_list &) = delete; - // construction/destruction - simple_list() noexcept - : m_head(nullptr), - m_tail(nullptr), - m_count(0) { } - - ~simple_list() noexcept { reset(); } + // but we do support cheap swap/move + simple_list(simple_list &&list) : simple_list() { operator=(std::move(list)); } + simple_list &operator=(simple_list &&list) + { + using std::swap; + swap(m_head, list.m_head); + swap(m_tail, list.m_tail); + swap(m_count, list.m_count); + } // simple getters _ElementType *first() const noexcept { return m_head; } |