Fix unsplit(", ")
authorTom Jackson <tjackson@fb.com>
Wed, 13 Mar 2013 20:56:29 +0000 (13:56 -0700)
committerJordan DeLong <jdelong@fb.com>
Tue, 19 Mar 2013 00:09:10 +0000 (17:09 -0700)
Summary: Otherwise you get errors like `error: array used as initializer ./folly/experimental/StringGen-inl.h: In constructor â€˜folly::gen::detail::UnsplitBuffer<Delimiter, OutputBuffer>::UnsplitBuffer(const Delimiter&, OutputBuffer*) [with Delimiter = char [3] ...]`, since literal strings bind as reference to fixed-length character arrays. Providing an explicit overload for `const char*` fixes this.

Test Plan: Unit tests

Reviewed By: tulloch@fb.com

FB internal diff: D737117

folly/experimental/StringGen.h
folly/experimental/test/GenTest.cpp

index aed03c59d3a5111d5ef1ba3747d2c648d23d6d94..14e5115d12bd0598865b6088dd654a7654912054 100644 (file)
@@ -73,6 +73,12 @@ Unsplit unsplit(const Delimiter& delimiter) {
   return Unsplit(delimiter);
 }
 
+template<class Output = folly::fbstring,
+         class Unsplit = detail::Unsplit<fbstring, Output>>
+Unsplit unsplit(const char* delimiter) {
+  return Unsplit(delimiter);
+}
+
 /*
  * Joins a sequence of tokens into a string, appending them to the output
  * buffer.  If the output buffer is empty, an initial delimiter will not be
@@ -94,6 +100,12 @@ UnsplitBuffer unsplit(const Delimiter& delimiter, OutputBuffer* outputBuffer) {
   return UnsplitBuffer(delimiter, outputBuffer);
 }
 
+template<class OutputBuffer,
+         class UnsplitBuffer = detail::UnsplitBuffer<fbstring, OutputBuffer>>
+UnsplitBuffer unsplit(const char* delimiter, OutputBuffer* outputBuffer) {
+  return UnsplitBuffer(delimiter, outputBuffer);
+}
+
 }  // namespace gen
 }  // namespace folly
 
index 4e08fbd0af0335e6d454de84550e785565ba753a..651dc3954194e7c288544f1031ef3d4f7f34f578 100644 (file)
@@ -753,18 +753,27 @@ TEST(StringGen, Unsplit) {
     split(s, ',') | unsplit(',', &buffer);
     auto expected = folly::to<folly::fbstring>(
         "asdf", s.empty() ? "" : ",", s);
-    EXPECT_EQ(buffer, expected);
+    EXPECT_EQ(expected, buffer);
   };
 
   auto emptyBuffer = [](const StringPiece& s) {
     std::string buffer;
     split(s, ',') | unsplit(',', &buffer);
+    EXPECT_EQ(s, buffer);
+  };
+
+  auto stringDelim = [](const StringPiece& s) {
+    EXPECT_EQ(s, split(s, ',') | unsplit(","));
+    std::string buffer;
+    split(s, ',') | unsplit(",", &buffer);
     EXPECT_EQ(buffer, s);
   };
 
   runUnsplitSuite(basicFn);
   runUnsplitSuite(existingBuffer);
   runUnsplitSuite(emptyBuffer);
+  runUnsplitSuite(stringDelim);
+  EXPECT_EQ("1, 2, 3", seq(1, 3) | unsplit(", "));
 }
 
 TEST(FileGen, ByLine) {