gdbsupport: introduce struct observer
authorSimon Marchi <simon.marchi@polymtl.ca>
Sat, 24 Apr 2021 23:26:04 +0000 (19:26 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Sat, 24 Apr 2021 23:26:41 +0000 (19:26 -0400)
Instead of using a pair.  This allows keeping more data per observer in
a structured way, and using field names is clearer than first/second.

gdbsupport/ChangeLog:

* observable.h (class observable) <struct observer>: New.
<detach, notify>: Update.
<m_observers>: Change type to vector of observers.

Change-Id: Iadf7d1fa25049cfb089e6b1b429ddebc548825ab

gdbsupport/ChangeLog
gdbsupport/observable.h

index 3ceeb3dab49e8820aab29863eb14ff1c7352ed9f..bfbd152ae8c97aefeac62f2d05f9aa1912801584 100644 (file)
@@ -1,3 +1,9 @@
+2021-04-24  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * observable.h (class observable) <struct observer>: New.
+       <detach, notify>: Update.
+       <m_observers>: Change type to vector of observers.
+
 2021-04-23  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * observable.h (observer_debug): Change to bool.
index 0532500dd5fa4549860a091c216589903dca7fec..1d19429ac4f5a8d89e6021a4a63a56adc4fcc04e 100644 (file)
@@ -56,9 +56,20 @@ template<typename... T>
 class observable
 {
 public:
-
   typedef std::function<void (T...)> func_type;
 
+private:
+  struct observer
+  {
+    observer (const struct token *token, func_type func)
+      : token (token), func (func)
+    {}
+
+    const struct token *token;
+    func_type func;
+  };
+
+public:
   explicit observable (const char *name)
     : m_name (name)
   {
@@ -87,10 +98,9 @@ public:
   {
     auto iter = std::remove_if (m_observers.begin (),
                                m_observers.end (),
-                               [&] (const std::pair<const token *,
-                                    func_type> &e)
+                               [&] (const observer &o)
                                {
-                                 return e.first == &t;
+                                 return o.token == &t;
                                });
 
     m_observers.erase (iter, m_observers.end ());
@@ -103,12 +113,12 @@ public:
       fprintf_unfiltered (gdb_stdlog, "observable %s notify() called\n",
                          m_name);
     for (auto &&e : m_observers)
-      e.second (args...);
+      e.func (args...);
   }
 
 private:
 
-  std::vector<std::pair<const token *, func_type>> m_observers;
+  std::vector<observer> m_observers;
   const char *m_name;
 };