From 3c6b49898baf0a2134468509d1bd9a98cb089d4b Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 8 Jun 2020 03:08:31 +0200 Subject: netlist: ppmf simplification. (nw) --- src/lib/netlist/plib/ppmf.h | 89 ++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 57 deletions(-) diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h index f957ff54a4a..f83e4620861 100644 --- a/src/lib/netlist/plib/ppmf.h +++ b/src/lib/netlist/plib/ppmf.h @@ -105,12 +105,6 @@ #pragma GCC diagnostic ignored "-Wpmf-conversions" #endif -#if 0 -#if defined(__GNUC__) && (__GNUC__ > 6) -#pragma GCC diagnostic ignored "-Wnoexcept-type" -#endif -#endif - namespace plib { /// @@ -226,7 +220,7 @@ namespace plib { }; template - struct mfp_helper<0, 0, R, Targs...> + struct mfp_helper { template using specific_member_function = R (C::*)(Targs...); @@ -253,7 +247,7 @@ namespace plib { }; template - struct mfp_helper<1, 0, R, Targs...> + struct mfp_helper { template using specific_member_function = R (C::*)(Targs...); @@ -278,11 +272,11 @@ namespace plib { } }; - template + template class pmfp_base { public: - using helper = mfp_helper; + using helper = mfp_helper; template using specific_member_function = typename helper::template specific_member_function; @@ -302,6 +296,32 @@ namespace plib { std::fill(s, s + sizeof(m_resolved), 0); } + template + pmfp_base(specific_member_function mftp, O *object) + : m_obj(nullptr) + { + auto *s = reinterpret_cast(&m_resolved); + std::fill(s, s + sizeof(m_resolved), 0); + bind(object, &mftp); + } + + bool is_set() const noexcept { return m_resolved != nullptr; } + + generic_class *object() const noexcept { return m_obj; } + bool has_object() const noexcept { return m_obj != nullptr; } + + template + void set(specific_member_function mftp, O *object) + { + bind(object, &mftp); + } + + inline R operator()(Targs... args) const noexcept(true) + { + return this->call(std::forward(args)...); + } + + private: template void bind(O * object, MF *fraw) { @@ -326,65 +346,21 @@ namespace plib { obj, std::forward(args)...); } - bool is_set() const noexcept { return m_resolved != nullptr; } - - generic_class *object() const noexcept { return m_obj; } - bool has_object() const noexcept { return m_obj != nullptr; } - R call(Targs&&... args) const noexcept(true) { return helper::call(reinterpret_cast *>(&m_resolved), m_obj, std::forward(args)...); } - protected: - template - void set_base(MemberFunctionType mftp, O *object) - { - //auto raw = reinterpret_cast>(mftp); - //bind(object, &raw); - bind(object, &mftp); - } - - private: generic_function_storage m_resolved; generic_class *m_obj; }; template - class pmfp : public pmfp_base - { - public: - - using base_type = pmfp_base; - - template - using specific_member_function = typename base_type::template specific_member_function; // noexcept(true) --> c++-17 - - using generic_member_function = typename base_type::generic_member_function; - pmfp() : pmfp_base() {} - - template - pmfp(specific_member_function mftp, O *object) - : pmfp_base() - { - this->set_base(mftp, object); - } - - template - void set(specific_member_function mftp, O *object) - { - this->set_base(mftp, object); - } - - inline R operator()(Targs... args) const noexcept(true) - { - return this->call(std::forward(args)...); - } + using pmfp = pmfp_base; - private: - }; + /// /// \brief Class to support delegate late binding /// /// When constructing delegates in constructors AND the referenced function @@ -441,7 +417,6 @@ namespace plib { return return_type(*p, o); } - generic_member_function m_raw; static_creator m_creator; }; -- cgit v1.2.3