summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2016-06-16 17:35:02 +1000
committer Vas Crabb <vas@vastheman.com>2016-06-16 17:35:02 +1000
commit523b8d1de854cd74741b396cb9dd6c10427785fb (patch)
tree69baadf2910f06e85e4118758e1d9291d1cbf7ce /src/emu
parent2300f993118950ea50d93aced4701556cea3e314 (diff)
Fix GCC6 warnings
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/addrmap.h2
-rw-r--r--src/emu/emucore.h58
2 files changed, 26 insertions, 34 deletions
diff --git a/src/emu/addrmap.h b/src/emu/addrmap.h
index b9c1be94941..3bcea1a3f47 100644
--- a/src/emu/addrmap.h
+++ b/src/emu/addrmap.h
@@ -316,7 +316,6 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, device_t &device) \
typedef write##_bits##_delegate write_delegate ATTR_UNUSED; \
address_map_entry##_bits *curentry = nullptr; \
(void)curentry; \
- assert(&device != nullptr); \
map.configure(_space, _bits); \
typedef _class drivdata_class ATTR_UNUSED;
#define DEVICE_ADDRESS_MAP_START(_name, _bits, _class) \
@@ -326,7 +325,6 @@ void _class :: _name(::address_map &map, device_t &device) \
typedef write##_bits##_delegate write_delegate ATTR_UNUSED; \
address_map_entry##_bits *curentry = nullptr; \
(void)curentry; \
- assert(&device != nullptr); \
map.configure(AS_PROGRAM, _bits); \
typedef _class drivdata_class ATTR_UNUSED;
#define ADDRESS_MAP_END \
diff --git a/src/emu/emucore.h b/src/emu/emucore.h
index c8c95c1af48..530fb92dd12 100644
--- a/src/emu/emucore.h
+++ b/src/emu/emucore.h
@@ -28,6 +28,7 @@
// standard C++ includes
#include <exception>
+#include <type_traits>
#include <typeinfo>
// core system includes
@@ -312,48 +313,41 @@ class device_t;
void report_bad_cast(const std::type_info &src_type, const std::type_info &dst_type);
void report_bad_device_cast(const device_t *dev, const std::type_info &src_type, const std::type_info &dst_type);
+template <typename Dest, typename Source>
+inline std::enable_if_t<std::is_base_of<device_t, Source>::value> report_bad_cast(Source *const src)
+{
+ if (src) report_bad_device_cast(src, typeid(Source), typeid(Dest));
+ else report_bad_cast(typeid(Source), typeid(Dest));
+}
+
+template <typename Dest, typename Source>
+inline std::enable_if_t<!std::is_base_of<device_t, Source>::value> report_bad_cast(Source *const src)
+{
+ device_t const *dev(dynamic_cast<device_t const *>(src));
+ if (dev) report_bad_device_cast(dev, typeid(Source), typeid(Dest));
+ else report_bad_cast(typeid(Source), typeid(Dest));
+}
+
// template function for casting from a base class to a derived class that is checked
// in debug builds and fast in release builds
-template<class _Dest, class _Source>
-inline _Dest downcast(_Source *src)
+template <typename Dest, typename Source>
+inline Dest downcast(Source *src)
{
#if defined(MAME_DEBUG) && !defined(MAME_DEBUG_FAST)
- try {
- if (dynamic_cast<_Dest>(src) != src)
- {
- if (dynamic_cast<const device_t *>(src) != nullptr)
- report_bad_device_cast(dynamic_cast<const device_t *>(src), typeid(src), typeid(_Dest));
- else
- report_bad_cast(typeid(src), typeid(_Dest));
- }
- }
- catch (std::bad_cast &)
- {
- report_bad_cast(typeid(src), typeid(_Dest));
- }
+ Dest const chk(dynamic_cast<Dest>(src));
+ if (!chk || (chk != src)) report_bad_cast<std::remove_pointer_t<Dest>, Source>(src);
#endif
- return static_cast<_Dest>(src);
+ return static_cast<Dest>(src);
}
-template<class _Dest, class _Source>
-inline _Dest downcast(_Source &src)
+template<class Dest, class Source>
+inline Dest downcast(Source &src)
{
#if defined(MAME_DEBUG) && !defined(MAME_DEBUG_FAST)
- try {
- if (&dynamic_cast<_Dest>(src) != &src)
- {
- if (dynamic_cast<const device_t *>(&src) != nullptr)
- report_bad_device_cast(dynamic_cast<const device_t *>(&src), typeid(src), typeid(_Dest));
- else
- report_bad_cast(typeid(src), typeid(_Dest));
- }
- }
- catch (std::bad_cast &)
- {
- report_bad_cast(typeid(src), typeid(_Dest));
- }
+ std::remove_reference_t<Dest> *const chk(dynamic_cast<std::remove_reference_t<Dest> *>(&src));
+ if (!chk || (chk != &src)) report_bad_cast<std::remove_reference_t<Dest>, Source>(&src);
#endif
- return static_cast<_Dest>(src);
+ return static_cast<Dest>(src);
}