From 427f1e4c658379e434f78f6e29c9f1ffff83cda0 Mon Sep 17 00:00:00 2001 From: Tudor Bosman Date: Sat, 20 Apr 2013 13:07:39 -0700 Subject: [PATCH] toAppendDelimited, toDelimited Test Plan: test added Reviewed By: delong.j@fb.com FB internal diff: D783100 --- folly/Conv.h | 44 +++++++++++++++++++++++++++++++++++++++++ folly/test/ConvTest.cpp | 21 ++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/folly/Conv.h b/folly/Conv.h index c8360a6d..4d14a559 100644 --- a/folly/Conv.h +++ b/folly/Conv.h @@ -476,6 +476,38 @@ typename std::enable_if::value>::type toAppend(Tgt* result) { } +/** + * Variadic base case: do nothing. + */ +template +typename std::enable_if::value>::type +toAppendDelim(const Delimiter& delim, Tgt* result) { +} + +/** + * 1 element: same as toAppend. + */ +template +typename std::enable_if::value>::type +toAppendDelim(const Delimiter& delim, const T& v, Tgt* tgt) { + toAppend(v, tgt); +} + +/** + * Append to string with a delimiter in between elements. + */ +template +typename std::enable_if= 2 + && detail::IsSomeString< + typename std::remove_pointer< + typename std::tuple_element< + sizeof...(Ts) - 1, std::tuple + >::type>::type>::value>::type +toAppendDelim(const Delimiter& delim, const T& v, const Ts&... vs) { + toAppend(v, delim, detail::getLastElement(vs...)); + toAppendDelim(delim, vs...); +} + /** * to(v1, v2, ...) uses toAppend() (see below) as back-end * for all types. @@ -488,6 +520,18 @@ to(const Ts&... vs) { return result; } +/** + * toDelim(delim, v1, v2, ...) uses toAppendDelim() as + * back-end for all types. + */ +template +typename std::enable_if::value, Tgt>::type +toDelim(const Delim& delim, const Ts&... vs) { + Tgt result; + toAppendDelim(delim, vs..., &result); + return result; +} + /******************************************************************************* * Conversions from string types to integral types. ******************************************************************************/ diff --git a/folly/test/ConvTest.cpp b/folly/test/ConvTest.cpp index 7dd6d0a4..f48c69c3 100644 --- a/folly/test/ConvTest.cpp +++ b/folly/test/ConvTest.cpp @@ -403,6 +403,22 @@ void testVariadicTo() { EXPECT_EQ(s, "Lorem ipsum 1234 dolor amet 567.89."); } +template +void testVariadicToDelim() { + String s; + toAppendDelim(":", &s); + toAppendDelim( + ":", "Lorem ipsum ", 1234, String(" dolor amet "), 567.89, '!', &s); + EXPECT_EQ(s, "Lorem ipsum :1234: dolor amet :567.89:!"); + + s = toDelim(':'); + EXPECT_TRUE(s.empty()); + + s = toDelim( + ":", "Lorem ipsum ", nullptr, 1234, " dolor amet ", 567.89, '.'); + EXPECT_EQ(s, "Lorem ipsum ::1234: dolor amet :567.89:."); +} + TEST(Conv, NullString) { string s1 = to((char *) NULL); EXPECT_TRUE(s1.empty()); @@ -415,6 +431,11 @@ TEST(Conv, VariadicTo) { testVariadicTo(); } +TEST(Conv, VariadicToDelim) { + testVariadicToDelim(); + testVariadicToDelim(); +} + template void testDoubleToString() { EXPECT_EQ(to(0.0), "0"); -- 2.34.1