Skip to content

Commit ec77d1f

Browse files
committed
[lldb] Simplify predicates of find_if in BroadcastManager
We had some custom classes that were used as the predicate for `std::find_if`. It would be a lot simpler if we used lambdas instead. Differential Revision: https://reviews.llvm.org/D150168
1 parent aa32655 commit ec77d1f

File tree

2 files changed

+44
-112
lines changed

2 files changed

+44
-112
lines changed

lldb/include/lldb/Utility/Broadcaster.h

Lines changed: 0 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -112,103 +112,6 @@ class BroadcasterManager
112112
listener_collection m_listeners;
113113

114114
mutable std::recursive_mutex m_manager_mutex;
115-
116-
// A couple of comparator classes for find_if:
117-
118-
class BroadcasterClassMatches {
119-
public:
120-
BroadcasterClassMatches(const ConstString &broadcaster_class)
121-
: m_broadcaster_class(broadcaster_class) {}
122-
123-
~BroadcasterClassMatches() = default;
124-
125-
bool operator()(const event_listener_key &input) const {
126-
return (input.first.GetBroadcasterClass() == m_broadcaster_class);
127-
}
128-
129-
private:
130-
ConstString m_broadcaster_class;
131-
};
132-
133-
class BroadcastEventSpecMatches {
134-
public:
135-
BroadcastEventSpecMatches(const BroadcastEventSpec &broadcaster_spec)
136-
: m_broadcaster_spec(broadcaster_spec) {}
137-
138-
~BroadcastEventSpecMatches() = default;
139-
140-
bool operator()(const event_listener_key &input) const {
141-
return (input.first.IsContainedIn(m_broadcaster_spec));
142-
}
143-
144-
private:
145-
BroadcastEventSpec m_broadcaster_spec;
146-
};
147-
148-
class ListenerMatchesAndSharedBits {
149-
public:
150-
explicit ListenerMatchesAndSharedBits(
151-
const BroadcastEventSpec &broadcaster_spec,
152-
const lldb::ListenerSP &listener_sp)
153-
: m_broadcaster_spec(broadcaster_spec), m_listener_sp(listener_sp) {}
154-
155-
~ListenerMatchesAndSharedBits() = default;
156-
157-
bool operator()(const event_listener_key &input) const {
158-
return (input.first.GetBroadcasterClass() ==
159-
m_broadcaster_spec.GetBroadcasterClass() &&
160-
(input.first.GetEventBits() &
161-
m_broadcaster_spec.GetEventBits()) != 0 &&
162-
input.second == m_listener_sp);
163-
}
164-
165-
private:
166-
BroadcastEventSpec m_broadcaster_spec;
167-
const lldb::ListenerSP m_listener_sp;
168-
};
169-
170-
class ListenerMatches {
171-
public:
172-
explicit ListenerMatches(const lldb::ListenerSP &in_listener_sp)
173-
: m_listener_sp(in_listener_sp) {}
174-
175-
~ListenerMatches() = default;
176-
177-
bool operator()(const event_listener_key &input) const {
178-
if (input.second == m_listener_sp)
179-
return true;
180-
181-
return false;
182-
}
183-
184-
private:
185-
const lldb::ListenerSP m_listener_sp;
186-
};
187-
188-
class ListenerMatchesPointer {
189-
public:
190-
ListenerMatchesPointer(const Listener *in_listener)
191-
: m_listener(in_listener) {}
192-
193-
~ListenerMatchesPointer() = default;
194-
195-
bool operator()(const event_listener_key &input) const {
196-
if (input.second.get() == m_listener)
197-
return true;
198-
199-
return false;
200-
}
201-
202-
bool operator()(const lldb::ListenerSP &input) const {
203-
if (input.get() == m_listener)
204-
return true;
205-
206-
return false;
207-
}
208-
209-
private:
210-
const Listener *m_listener;
211-
};
212115
};
213116

214117
/// \class Broadcaster Broadcaster.h "lldb/Utility/Broadcaster.h" An event

lldb/source/Utility/Broadcaster.cpp

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -336,10 +336,13 @@ uint32_t BroadcasterManager::RegisterListenerForEvents(
336336
collection::iterator iter = m_event_map.begin(), end_iter = m_event_map.end();
337337
uint32_t available_bits = event_spec.GetEventBits();
338338

339+
auto class_matches = [&event_spec](const event_listener_key &input) -> bool {
340+
return input.first.GetBroadcasterClass() ==
341+
event_spec.GetBroadcasterClass();
342+
};
343+
339344
while (iter != end_iter &&
340-
(iter = find_if(iter, end_iter,
341-
BroadcasterClassMatches(
342-
event_spec.GetBroadcasterClass()))) != end_iter) {
345+
(iter = find_if(iter, end_iter, class_matches)) != end_iter) {
343346
available_bits &= ~((*iter).first.GetEventBits());
344347
iter++;
345348
}
@@ -362,15 +365,22 @@ bool BroadcasterManager::UnregisterListenerForEvents(
362365
if (m_listeners.erase(listener_sp) == 0)
363366
return false;
364367

365-
ListenerMatchesAndSharedBits predicate(event_spec, listener_sp);
368+
auto listener_matches_and_shared_bits =
369+
[&listener_sp, &event_spec](const event_listener_key &input) -> bool {
370+
return input.first.GetBroadcasterClass() ==
371+
event_spec.GetBroadcasterClass() &&
372+
(input.first.GetEventBits() & event_spec.GetEventBits()) != 0 &&
373+
input.second == listener_sp;
374+
};
366375
std::vector<BroadcastEventSpec> to_be_readded;
367376
uint32_t event_bits_to_remove = event_spec.GetEventBits();
368377

369378
// Go through the map and delete the exact matches, and build a list of
370379
// matches that weren't exact to re-add:
371380
while (true) {
372381
collection::iterator iter, end_iter = m_event_map.end();
373-
iter = find_if(m_event_map.begin(), end_iter, predicate);
382+
iter = find_if(m_event_map.begin(), end_iter,
383+
listener_matches_and_shared_bits);
374384
if (iter == end_iter) {
375385
break;
376386
}
@@ -397,9 +407,13 @@ ListenerSP BroadcasterManager::GetListenerForEventSpec(
397407
const BroadcastEventSpec &event_spec) const {
398408
std::lock_guard<std::recursive_mutex> guard(m_manager_mutex);
399409

410+
auto event_spec_matches =
411+
[&event_spec](const event_listener_key &input) -> bool {
412+
return input.first.IsContainedIn(event_spec);
413+
};
414+
400415
collection::const_iterator iter, end_iter = m_event_map.end();
401-
iter = find_if(m_event_map.begin(), end_iter,
402-
BroadcastEventSpecMatches(event_spec));
416+
iter = find_if(m_event_map.begin(), end_iter, event_spec_matches);
403417
if (iter != end_iter)
404418
return (*iter).second;
405419

@@ -408,17 +422,25 @@ ListenerSP BroadcasterManager::GetListenerForEventSpec(
408422

409423
void BroadcasterManager::RemoveListener(Listener *listener) {
410424
std::lock_guard<std::recursive_mutex> guard(m_manager_mutex);
411-
ListenerMatchesPointer predicate(listener);
425+
auto listeners_predicate =
426+
[&listener](const lldb::ListenerSP &input) -> bool {
427+
return input.get() == listener;
428+
};
429+
412430
listener_collection::iterator iter = m_listeners.begin(),
413431
end_iter = m_listeners.end();
414432

415-
iter = std::find_if(iter, end_iter, predicate);
433+
iter = std::find_if(iter, end_iter, listeners_predicate);
416434
if (iter != end_iter)
417435
m_listeners.erase(iter);
418436

419437
while (true) {
438+
auto events_predicate =
439+
[&listener](const event_listener_key &input) -> bool {
440+
return input.second.get() == listener;
441+
};
420442
collection::iterator iter, end_iter = m_event_map.end();
421-
iter = find_if(m_event_map.begin(), end_iter, predicate);
443+
iter = find_if(m_event_map.begin(), end_iter, events_predicate);
422444
if (iter == end_iter)
423445
break;
424446

@@ -428,14 +450,18 @@ void BroadcasterManager::RemoveListener(Listener *listener) {
428450

429451
void BroadcasterManager::RemoveListener(const lldb::ListenerSP &listener_sp) {
430452
std::lock_guard<std::recursive_mutex> guard(m_manager_mutex);
431-
ListenerMatches predicate(listener_sp);
453+
454+
auto listener_matches =
455+
[&listener_sp](const event_listener_key &input) -> bool {
456+
return input.second == listener_sp;
457+
};
432458

433459
if (m_listeners.erase(listener_sp) == 0)
434460
return;
435461

436462
while (true) {
437463
collection::iterator iter, end_iter = m_event_map.end();
438-
iter = find_if(m_event_map.begin(), end_iter, predicate);
464+
iter = find_if(m_event_map.begin(), end_iter, listener_matches);
439465
if (iter == end_iter)
440466
break;
441467

@@ -449,10 +475,13 @@ void BroadcasterManager::SignUpListenersForBroadcaster(
449475

450476
collection::iterator iter = m_event_map.begin(), end_iter = m_event_map.end();
451477

478+
auto class_matches = [&broadcaster](const event_listener_key &input) -> bool {
479+
return input.first.GetBroadcasterClass() ==
480+
broadcaster.GetBroadcasterClass();
481+
};
482+
452483
while (iter != end_iter &&
453-
(iter = find_if(iter, end_iter,
454-
BroadcasterClassMatches(
455-
broadcaster.GetBroadcasterClass()))) != end_iter) {
484+
(iter = find_if(iter, end_iter, class_matches)) != end_iter) {
456485
(*iter).second->StartListeningForEvents(&broadcaster,
457486
(*iter).first.GetEventBits());
458487
iter++;

0 commit comments

Comments
 (0)