Gabriel B. has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/67653?usp=email )

Change subject: sim: Define a new MemberEventWrapper event class
......................................................................

sim: Define a new MemberEventWrapper event class

This new event class simplifies the use of EventWrapper and aims at
superseeding it. EventWrapper has been redefined in terms of
MemberEventWrapper.

MemberEventWrapper makes use of the new type traits to simplify
template parameterization and encourage its use over SimpleEvent that
often wraps a lambda that merely calls a member function.

Change-Id: Ie59e4c51705b9c2b2faa27097678d7d85f5b99c6
---
M src/sim/eventq.hh
1 file changed, 42 insertions(+), 21 deletions(-)



diff --git a/src/sim/eventq.hh b/src/sim/eventq.hh
index 62495bf..3eefbd3 100644
--- a/src/sim/eventq.hh
+++ b/src/sim/eventq.hh
@@ -46,7 +46,9 @@

 #include "base/debug.hh"
 #include "base/flags.hh"
+#include "base/named.hh"
 #include "base/trace.hh"
+#include "base/type_traits.hh"
 #include "base/types.hh"
 #include "base/uncontended_mutex.hh"
 #include "debug/Event.hh"
@@ -1071,38 +1073,40 @@
     void setCurTick(Tick newVal) { eventq->setCurTick(newVal); }
 };

-template <class T, void (T::* F)()>
-class EventWrapper : public Event
+template <auto F>
+class MemberEventWrapper: public Event, public Named
 {
-  private:
-    T *object;
+    using T = MemberFunctionClass_t<F>;
+    using R = MemberFunctionReturn_t<F>;
+    static_assert(std::is_same_v<void, R>);
+ static_assert(std::is_same_v<MemberFunctionArgsTuple_t<F>, std::tuple<>>);

-  public:
-    EventWrapper(T *obj, bool del = false, Priority p = Default_Pri)
-        : Event(p), object(obj)
+public:
+ MemberEventWrapper(T *object, bool del = false, Priority p = Default_Pri):
+        Event(p),
+        Named(object->name() + ".wrapped_event"),
+        mObject(object)
     {
-        if (del)
-            setFlags(AutoDelete);
+        if (del) setFlags(AutoDelete);
     }

-    EventWrapper(T &obj, bool del = false, Priority p = Default_Pri)
-        : Event(p), object(&obj)
-    {
-        if (del)
-            setFlags(AutoDelete);
-    }
+ MemberEventWrapper(T &object, bool del = false, Priority p = Default_Pri):
+        MemberEventWrapper(&object, del, p)
+    {}

-    void process() { (object->*F)(); }
-
-    const std::string
-    name() const
-    {
-        return object->name() + ".wrapped_event";
+    void process() {
+        gem5_assert(mObject);
+        (mObject->*F)();
     }

     const char *description() const { return "EventWrapped"; }
+private:
+    T *mObject = nullptr;
 };

+template <class T, void (T::* F)()>
+using EventWrapper = MemberEventWrapper<F>;
+
 class EventFunctionWrapper : public Event
 {
   private:

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/67653?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Ie59e4c51705b9c2b2faa27097678d7d85f5b99c6
Gerrit-Change-Number: 67653
Gerrit-PatchSet: 1
Gerrit-Owner: Gabriel B. <gabriel.bus...@arteris.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to