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
This commit is contained in:
Simon Marchi
2021-04-24 19:26:04 -04:00
parent 3886790f13
commit ec098003e2
2 changed files with 22 additions and 6 deletions

View 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.

View 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;
};