summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/util/delegate.h64
1 files changed, 32 insertions, 32 deletions
diff --git a/src/lib/util/delegate.h b/src/lib/util/delegate.h
index 6b3101f5afa..39cc5eb3d00 100644
--- a/src/lib/util/delegate.h
+++ b/src/lib/util/delegate.h
@@ -79,9 +79,9 @@
// standard C++ includes
#include <cstring>
+#include <functional>
#include <typeinfo>
#include <utility>
-#include <functional>
//**************************************************************************
@@ -310,7 +310,7 @@ public:
// comparison helpers
bool operator==(const delegate_mfp &rhs) const { return (m_function == rhs.m_function && m_this_delta == rhs.m_this_delta); }
- bool isnull() const { return (m_function == 0 && m_this_delta==0); }
+ bool isnull() const { return (m_function == 0 && m_this_delta == 0); }
// getters
static delegate_generic_class *real_object(delegate_generic_class *original) { return original; }
@@ -412,7 +412,6 @@ class delegate_base
public:
// define our traits
template <class FunctionClass> using traits = delegate_traits<FunctionClass, ReturnType, Params...>;
- using functional_type = std::function<ReturnType (Params...)>;
using generic_static_func = typename traits<delegate_generic_class>::static_func_type;
typedef MEMBER_ABI generic_static_func generic_member_func;
@@ -422,7 +421,6 @@ public:
, m_object(nullptr)
, m_latebinder(nullptr)
, m_raw_function(nullptr)
- , m_std_func(nullptr)
{ }
// copy constructor
@@ -432,7 +430,6 @@ public:
, m_latebinder(src.m_latebinder)
, m_raw_function(src.m_raw_function)
, m_raw_mfp(src.m_raw_mfp)
- , m_std_func(src.m_std_func)
{
bind(src.object());
}
@@ -444,7 +441,6 @@ public:
, m_latebinder(src.m_latebinder)
, m_raw_function(src.m_raw_function)
, m_raw_mfp(src.m_raw_mfp)
- , m_std_func(src.m_std_func)
{
late_bind(object);
}
@@ -457,7 +453,6 @@ public:
, m_latebinder(&late_bind_helper<FunctionClass>)
, m_raw_function(nullptr)
, m_raw_mfp(funcptr, object, static_cast<ReturnType *>(nullptr), static_cast<generic_static_func>(nullptr))
- , m_std_func(nullptr)
{
bind(reinterpret_cast<delegate_generic_class *>(object));
}
@@ -469,7 +464,6 @@ public:
, m_latebinder(&late_bind_helper<FunctionClass>)
, m_raw_function(nullptr)
, m_raw_mfp(funcptr, object, static_cast<ReturnType *>(nullptr), static_cast<generic_static_func>(nullptr))
- , m_std_func(nullptr)
{
bind(reinterpret_cast<delegate_generic_class *>(object));
}
@@ -481,21 +475,10 @@ public:
, m_object(nullptr)
, m_latebinder(&late_bind_helper<FunctionClass>)
, m_raw_function(reinterpret_cast<generic_static_func>(funcptr))
- , m_std_func(nullptr)
{
bind(reinterpret_cast<delegate_generic_class *>(object));
}
- // construct from static reference function with object reference
- delegate_base(functional_type funcptr)
- : m_function(nullptr)
- , m_object(nullptr)
- , m_latebinder(nullptr)
- , m_raw_function(nullptr)
- , m_std_func(funcptr)
- {
- }
-
// copy operator
delegate_base &operator=(const delegate_base &src)
{
@@ -506,7 +489,6 @@ public:
m_latebinder = src.m_latebinder;
m_raw_function = src.m_raw_function;
m_raw_mfp = src.m_raw_mfp;
- m_std_func = src.m_std_func;
bind(src.object());
}
@@ -516,7 +498,7 @@ public:
// comparison helper
bool operator==(const delegate_base &rhs) const
{
- return (m_raw_function == rhs.m_raw_function && object() == rhs.object() && m_raw_mfp == rhs.m_raw_mfp && m_std_func.target_type().name() == rhs.m_std_func.target_type().name());
+ return (m_raw_function == rhs.m_raw_function && object() == rhs.object() && m_raw_mfp == rhs.m_raw_mfp);
}
@@ -525,17 +507,15 @@ public:
{
if (is_mfp() && (HAS_DIFFERENT_ABI))
return (*reinterpret_cast<generic_member_func>(m_function)) (m_object, std::forward<Params>(args)...);
- else if (m_std_func)
- return m_std_func(std::forward<Params>(args)...);
else
return (*m_function) (m_object, std::forward<Params>(args)...);
}
// getters
- bool has_object() const { return (object() != nullptr) || m_std_func; }
+ bool has_object() const { return (object() != nullptr); }
// helpers
- bool isnull() const { return (m_raw_function == nullptr && m_raw_mfp.isnull() && !m_std_func); }
+ bool isnull() const { return (m_raw_function == nullptr && m_raw_mfp.isnull()); }
bool is_mfp() const { return !m_raw_mfp.isnull(); }
// late binding
@@ -575,7 +555,6 @@ protected:
late_bind_func m_latebinder; // late binding helper
generic_static_func m_raw_function; // raw static function pointer
delegate_mfp m_raw_mfp; // raw member function pointer
- functional_type m_std_func; // std::function pointer
};
@@ -585,14 +564,16 @@ protected:
//**************************************************************************
// declare the base template
-template <typename Signature>
-class delegate;
+template <typename Signature> class delegate;
template <typename ReturnType, typename... Params>
class delegate<ReturnType (Params...)> : public delegate_base<ReturnType, Params...>
{
private:
using basetype = delegate_base<ReturnType, Params...>;
+ using functional_type = std::function<ReturnType (Params...)>;
+
+ functional_type m_std_func;
protected:
template <class FunctionClass> using traits = typename basetype::template traits<FunctionClass>;
@@ -603,13 +584,32 @@ protected:
public:
// create a standard set of constructors
delegate() : basetype() { }
- explicit delegate(const basetype &src) : basetype(src) { }
- delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { }
+ delegate(delegate const &src) : basetype(src.m_std_func ? basetype(&functional_type::operator(), &m_std_func) : static_cast<basetype const &>(src)), m_std_func(src.m_std_func) { }
+ delegate(delegate &&src) : basetype(src.m_std_func ? basetype(&functional_type::operator(), &m_std_func) : std::move(static_cast<basetype &>(src))), m_std_func(std::move(src.m_std_func)) { }
+ delegate(delegate const &src, delegate_late_bind &object) : basetype(src.m_std_func ? basetype(&functional_type::operator(), &m_std_func) : basetype(src, object)), m_std_func(src.m_std_func) { }
template <class FunctionClass> delegate(member_func_type<FunctionClass> funcptr, FunctionClass *object) : basetype(funcptr, object) { }
template <class FunctionClass> delegate(const_member_func_type<FunctionClass> funcptr, FunctionClass *object) : basetype(funcptr, object) { }
- explicit delegate(std::function<ReturnType (Params...)> funcptr) : basetype(funcptr) { }
+ explicit delegate(functional_type &&functoid) : basetype(&functional_type::operator(), &m_std_func), m_std_func(std::move(functoid)) { }
template <class FunctionClass> delegate(static_ref_func_type<FunctionClass> funcptr, FunctionClass *object) : basetype(funcptr, object) { }
- delegate &operator=(const basetype &src) { *static_cast<basetype *>(this) = src; return *this; }
+
+ delegate &operator=(delegate const &src)
+ {
+ if (src.m_std_func)
+ basetype::operator=(basetype(&functional_type::operator(), &m_std_func));
+ else
+ basetype::operator=(src);
+ m_std_func = src.m_std_func;
+ return *this;
+ }
+ delegate &operator=(delegate &&src)
+ {
+ if (src.m_std_func)
+ basetype::operator=(basetype(&functional_type::operator(), &m_std_func));
+ else
+ basetype::operator=(std::move(src));
+ m_std_func = std::move(src.m_std_func);
+ return *this;
+ }
};
#endif // MAME_UTIL_DELEGATE_H