summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-11-05 12:15:34 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-11-05 12:15:34 +0900
commit7d68c40a7746121c9e709c173f738c64cfca7603 (patch)
tree65fbf7cdea4be59fbf0891684fdae1e550326cf6
parentd1d49036651012433595357ca31e6f65dbec3a6b (diff)
Made decoderawstring return pair of iterators, not string.
-rw-r--r--src/ValueBase.h11
-rw-r--r--src/bencode2.cc14
2 files changed, 19 insertions, 6 deletions
diff --git a/src/ValueBase.h b/src/ValueBase.h
index 763114d4..b7b340d9 100644
--- a/src/ValueBase.h
+++ b/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_;
diff --git a/src/bencode2.cc b/src/bencode2.cc
index 1db0ddbe..74198b0d 100644
--- a/src/bencode2.cc
+++ b/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;
}
}