ソースを参照

Made decoderawstring return pair of iterators, not string.

Tatsuhiro Tsujikawa 14 年 前
コミット
7d68c40a77
2 ファイル変更19 行追加6 行削除
  1. 11 0
      src/ValueBase.h
  2. 8 6
      src/bencode2.cc

+ 11 - 0
src/ValueBase.h

@@ -86,6 +86,11 @@ public:
 
   String(const unsigned char* data, size_t length);
 
+  template<typename InputIterator>
+  String(InputIterator first, InputIterator last)
+    : str_(first, last)
+  {}
+
   String();
 
   ~String();
@@ -104,6 +109,12 @@ public:
 
   static SharedHandle<String> g(const unsigned char* data, size_t length);
 
+  template<typename InputIterator>
+  static SharedHandle<String> g(InputIterator first, InputIterator last)
+  {
+    return SharedHandle<String>(new String(first, last));
+  }
+
   virtual void accept(ValueBaseVisitor& visitor) const;
 private:
   ValueType str_;

+ 8 - 6
src/bencode2.cc

@@ -57,7 +57,7 @@ decodeiter
 
 namespace {
 template<typename InputIterator>
-std::pair<std::string, InputIterator>
+std::pair<std::pair<InputIterator, InputIterator>, InputIterator>
 decoderawstring(InputIterator first, InputIterator last)
 {
   InputIterator i = first;
@@ -77,7 +77,7 @@ decoderawstring(InputIterator first, InputIterator last)
            len, static_cast<int>(last-i)),
        error_code::BENCODE_PARSE_ERROR);
   }
-  return std::make_pair(std::string(i, i+len), i+len);
+  return std::make_pair(std::make_pair(i, i+len), i+len);
 }
 } // namespace
 
@@ -86,8 +86,9 @@ template<typename InputIterator>
 std::pair<SharedHandle<ValueBase>, InputIterator>
 decodestring(InputIterator first, InputIterator last)
 {
-  std::pair<std::string, InputIterator> r = decoderawstring(first, last);
-  return std::make_pair(String::g(r.first), r.second);
+  std::pair<std::pair<InputIterator, InputIterator>, InputIterator> r =
+    decoderawstring(first, last);
+  return std::make_pair(String::g(r.first.first, r.first.second), r.second);
 }
 } // namespace
 
@@ -121,10 +122,11 @@ decodedict
     if(*first == 'e') {
       return std::make_pair(dict, ++first);
     } else {
-      std::pair<std::string, InputIterator> keyp = decoderawstring(first, last);
+      std::pair<std::pair<InputIterator, InputIterator>, InputIterator> keyp =
+        decoderawstring(first, last);
       std::pair<SharedHandle<ValueBase>, InputIterator> r =
         decodeiter(keyp.second, last, depth);
-      dict->put(keyp.first, r.first);
+      dict->put(std::string(keyp.first.first, keyp.first.second), r.first);
       first = r.second;
     }
   }