Explorar o código

Use std::remove_if

Tatsuhiro Tsujikawa %!s(int64=12) %!d(string=hai) anos
pai
achega
7f805df4f0
Modificáronse 2 ficheiros con 23 adicións e 12 borrados
  1. 20 10
      src/DHTMessageTracker.cc
  2. 3 2
      src/DHTMessageTracker.h

+ 20 - 10
src/DHTMessageTracker.cc

@@ -135,19 +135,29 @@ void DHTMessageTracker::handleTimeoutEntry
   }
 }
 
-void DHTMessageTracker::handleTimeout()
-{
-  for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::iterator i =
-        entries_.begin(), eoi = entries_.end(); i != eoi;) {
-    if((*i)->isTimeout()) {
-        SharedHandle<DHTMessageTrackerEntry> entry = *i;
-        i = entries_.erase(i);
-        eoi = entries_.end();
-        handleTimeoutEntry(entry);
+namespace {
+struct HandleTimeout {
+  HandleTimeout(DHTMessageTracker* tracker)
+  : tracker(tracker)
+  {}
+  bool operator()(const SharedHandle<DHTMessageTrackerEntry>& ent) const
+  {
+    if(ent->isTimeout()) {
+      tracker->handleTimeoutEntry(ent);
+      return true;
     } else {
-      ++i;
+      return false;
     }
   }
+  DHTMessageTracker* tracker;
+};
+} // namespace
+
+void DHTMessageTracker::handleTimeout()
+{
+  entries_.erase(std::remove_if(entries_.begin(), entries_.end(),
+                                HandleTimeout(this)),
+                 entries_.end());
 }
 
 SharedHandle<DHTMessageTrackerEntry>

+ 3 - 2
src/DHTMessageTracker.h

@@ -60,8 +60,6 @@ private:
   SharedHandle<DHTRoutingTable> routingTable_;
 
   SharedHandle<DHTMessageFactory> factory_;
-
-  void handleTimeoutEntry(const SharedHandle<DHTMessageTrackerEntry>& entry);
 public:
   DHTMessageTracker();
 
@@ -78,6 +76,9 @@ public:
 
   void handleTimeout();
 
+  // Made public to make unnamed functor can access it
+  void handleTimeoutEntry(const SharedHandle<DHTMessageTrackerEntry>& entry);
+
   SharedHandle<DHTMessageTrackerEntry> getEntryFor
   (const SharedHandle<DHTMessage>& message) const;