Bladeren bron

Use SegList<int> instead of IntSequence in Metalink2RequestGroup.

Tatsuhiro Tsujikawa 14 jaren geleden
bovenliggende
commit
95586f594f
1 gewijzigde bestanden met toevoegingen van 26 en 21 verwijderingen
  1. 26 21
      src/Metalink2RequestGroup.cc

+ 26 - 21
src/Metalink2RequestGroup.cc

@@ -56,6 +56,7 @@
 #include "a2functional.h"
 #include "download_helper.h"
 #include "fmt.h"
+#include "SegList.h"
 #ifdef ENABLE_BITTORRENT
 # include "BtDependency.h"
 # include "download_helper.h"
@@ -153,9 +154,6 @@ Metalink2RequestGroup::createRequestGroup
     A2_LOG_NOTICE(EX_NO_RESULT_WITH_YOUR_PREFS);
     return;
   }
-  std::vector<int32_t> selectIndexes =
-    util::parseIntRange(optionTemplate->get(PREF_SELECT_FILE)).flush();
-  std::sort(selectIndexes.begin(), selectIndexes.end());
   std::vector<std::string> locations;
   if(optionTemplate->defined(PREF_METALINK_LOCATION)) {
     util::split(util::toLower(optionTemplate->get(PREF_METALINK_LOCATION)),
@@ -165,25 +163,32 @@ Metalink2RequestGroup::createRequestGroup
   if(optionTemplate->get(PREF_METALINK_PREFERRED_PROTOCOL) != V_NONE) {
     preferredProtocol = optionTemplate->get(PREF_METALINK_PREFERRED_PROTOCOL);
   }
+  for(std::vector<SharedHandle<MetalinkEntry> >::const_iterator i =
+        entries.begin(), eoi = entries.end(); i != eoi; ++i) {
+    (*i)->dropUnsupportedResource();
+    if((*i)->resources.empty() && (*i)->metaurls.empty()) {
+      continue;
+    }
+    (*i)->setLocationPriority
+      (locations, -MetalinkResource::getLowestPriority());
+    if(!preferredProtocol.empty()) {
+      (*i)->setProtocolPriority
+        (preferredProtocol, -MetalinkResource::getLowestPriority());
+    }
+  }
   std::vector<SharedHandle<MetalinkEntry> > selectedEntries;
-  selectedEntries.reserve(entries.size());
-  {
-    int32_t count = 1;
-    for(std::vector<SharedHandle<MetalinkEntry> >::const_iterator i =
-          entries.begin(), eoi = entries.end(); i != eoi; ++i, ++count) {
-      (*i)->dropUnsupportedResource();
-      if((*i)->resources.empty() && (*i)->metaurls.empty()) {
-        continue;
-      }
-      (*i)->setLocationPriority
-        (locations, -MetalinkResource::getLowestPriority());
-      if(!preferredProtocol.empty()) {
-        (*i)->setProtocolPriority
-          (preferredProtocol, -MetalinkResource::getLowestPriority());
-      }
-      if(selectIndexes.empty() ||
-         std::binary_search(selectIndexes.begin(), selectIndexes.end(), count)){
-        selectedEntries.push_back(*i);
+  SegList<int> sgl;
+  util::parseIntSegments(sgl, optionTemplate->get(PREF_SELECT_FILE));
+  sgl.normalize();
+  if(!sgl.hasNext()) {
+    selectedEntries.assign(entries.begin(), entries.end());
+  } else {
+    selectedEntries.reserve(entries.size());
+    for(size_t i = 0, len = entries.size(); i < len && sgl.hasNext(); ++i) {
+      size_t j = sgl.peek()-1;
+      if(i == j) {
+        selectedEntries.push_back(entries[i]);
+        sgl.next();
       }
     }
   }