[binutils-gdb] gdbsupport: introduce struct observer

Simon Marchi simark@sourceware.org
Sat Apr 24 23:33:43 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ec098003e27d67bca9e9880320e26ab8ad30fe31

commit ec098003e27d67bca9e9880320e26ab8ad30fe31
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Sat Apr 24 19:26:04 2021 -0400

    gdbsupport: introduce struct observer
    
    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

Diff:
---
 gdbsupport/ChangeLog    |  6 ++++++
 gdbsupport/observable.h | 22 ++++++++++++++++------
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/gdbsupport/ChangeLog b/gdbsupport/ChangeLog
index 3ceeb3dab49..bfbd152ae8c 100644
--- a/gdbsupport/ChangeLog
+++ b/gdbsupport/ChangeLog
@@ -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.
diff --git a/gdbsupport/observable.h b/gdbsupport/observable.h
index 0532500dd5f..1d19429ac4f 100644
--- a/gdbsupport/observable.h
+++ b/gdbsupport/observable.h
@@ -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;
 };


More information about the Gdb-cvs mailing list