From: Marc Celani Date: Tue, 6 May 2014 00:58:40 +0000 (-0700) Subject: folly::join takes advantage of StringPiece::size() X-Git-Tag: v0.22.0~563 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=aff1262d92fbb91ce6075a5f1a5c6039ac12d8bd;p=folly.git folly::join takes advantage of StringPiece::size() Summary: folly::join should take advantage of StringPiece::size() when joining StringPieces. This avoids unnecessary resizes when appending values to the output string. Test Plan: Reran folly unit tests for strings Reviewed By: philipp@fb.com FB internal diff: D1313009 @override-unit-failures --- diff --git a/folly/String-inl.h b/folly/String-inl.h index e680473b..52b665c7 100644 --- a/folly/String-inl.h +++ b/folly/String-inl.h @@ -450,9 +450,20 @@ split(const Delim& delimiter, namespace detail { +/* + * If a type can have its string size determined cheaply, we can more + * efficiently append it in a loop (see internalJoinAppend). Note that the + * struct need not conform to the std::string api completely (ex. does not need + * to implement append()). + */ +template struct IsSizableString { + enum { value = IsSomeString::value + || std::is_same::value }; +}; + template -struct IsStringContainerIterator : - IsSomeString::value_type> { +struct IsSizableStringContainerIterator : + IsSizableString::value_type> { }; template @@ -473,7 +484,7 @@ void internalJoinAppend(Delim delimiter, } template -typename std::enable_if::value>::type +typename std::enable_if::value>::type internalJoin(Delim delimiter, Iterator begin, Iterator end, @@ -493,7 +504,8 @@ internalJoin(Delim delimiter, } template -typename std::enable_if::value>::type +typename +std::enable_if::value>::type internalJoin(Delim delimiter, Iterator begin, Iterator end,