Browse Source

Use std::remove_if

Tatsuhiro Tsujikawa 12 years ago
parent
commit
704eebfac6
2 changed files with 27 additions and 14 deletions
  1. 24 12
      src/UTMetadataRequestTracker.cc
  2. 3 2
      src/UTMetadataRequestTracker.h

+ 24 - 12
src/UTMetadataRequestTracker.cc

@@ -65,22 +65,34 @@ void UTMetadataRequestTracker::remove(size_t index)
   }
 }
 
-std::vector<size_t> UTMetadataRequestTracker::removeTimeoutEntry()
-{
-  std::vector<size_t> indexes;
-  const time_t TIMEOUT = 20;
-  for(std::vector<RequestEntry>::iterator i = trackedRequests_.begin(),
-        eoi = trackedRequests_.end(); i != eoi;) {
-    if((*i).elapsed(TIMEOUT)) {
+namespace {
+struct RemoveTimeoutEntry {
+  RemoveTimeoutEntry(std::vector<size_t>& indexes)
+    : indexes(indexes)
+  {}
+  bool operator()(const UTMetadataRequestTracker::RequestEntry& ent) const
+  {
+    if(ent.elapsed(TIMEOUT)) {
       A2_LOG_DEBUG(fmt("ut_metadata request timeout. index=%lu",
-                       static_cast<unsigned long>((*i).index_)));
-      indexes.push_back((*i).index_);
-      i = trackedRequests_.erase(i);
-      eoi = trackedRequests_.end();
+                       static_cast<unsigned long>(ent.index_)));
+      indexes.push_back(ent.index_);
+      return true;
     } else {
-      ++i;
+      return false;
     }
   }
+  std::vector<size_t>& indexes;
+  static const time_t TIMEOUT = 20;
+};
+} // namespace
+
+std::vector<size_t> UTMetadataRequestTracker::removeTimeoutEntry()
+{
+  std::vector<size_t> indexes;
+  trackedRequests_.erase(std::remove_if(trackedRequests_.begin(),
+                                        trackedRequests_.end(),
+                                        RemoveTimeoutEntry(indexes)),
+                         trackedRequests_.end());
   return indexes;
 }
 

+ 3 - 2
src/UTMetadataRequestTracker.h

@@ -45,7 +45,8 @@
 namespace aria2 {
 
 class UTMetadataRequestTracker {
-private:
+public:
+  // Made public so that unnamed functor can access it
   struct RequestEntry {
     size_t index_;
     Timer dispatchedTime_;
@@ -62,7 +63,7 @@ private:
       return index_ == e.index_;
     }
   };
-
+private:
   std::vector<RequestEntry> trackedRequests_;
 public:
   UTMetadataRequestTracker();