From aff1262d92fbb91ce6075a5f1a5c6039ac12d8bd Mon Sep 17 00:00:00 2001 From: Marc Celani Date: Mon, 5 May 2014 17:58:40 -0700 Subject: [PATCH] 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 --- folly/String-inl.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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, -- 2.34.1