diff --git a/conversion/stringbuilder.h b/conversion/stringbuilder.h index d66ba92..932b8e3 100644 --- a/conversion/stringbuilder.h +++ b/conversion/stringbuilder.h @@ -70,6 +70,9 @@ constexpr std::size_t computeTupleElementSize(IntegralType number, typename Stri return size; } +template , std::tuple>> * = nullptr> +constexpr std::size_t computeTupleElementSize(TupleType &&tuple, typename StringType::value_type base = 10); + template > * = nullptr> inline void append(StringType &target, const StringType *str) { target.append(*str); @@ -134,6 +137,9 @@ inline void append(StringType &target, IntegralType number, typename StringType: } while (number); } +template , std::tuple>> * = nullptr> +constexpr void append(StringType &target, TupleType &&tuple, typename StringType::value_type base = 10); + template struct TupleToString { static inline std::size_t precomputeSize(const Tuple &tuple) { @@ -158,6 +164,19 @@ template struct TupleToString(tuple)); } }; + +template , std::tuple>> *> +constexpr std::size_t computeTupleElementSize(TupleType &&tuple, typename StringType::value_type base) +{ + return TupleToString>>::precomputeSize(std::forward(tuple)); +} + +template , std::tuple>> *> +constexpr void append(StringType &target, TupleType &&tuple, typename StringType::value_type base) +{ + return TupleToString>>::append(std::forward(tuple), target); +} + } // namespace Helper /// \endcond diff --git a/tests/conversiontests.cpp b/tests/conversiontests.cpp index eda98b3..8bf707f 100644 --- a/tests/conversiontests.cpp +++ b/tests/conversiontests.cpp @@ -386,6 +386,7 @@ void ConversionTests::testStringBuilder() CPPUNIT_ASSERT_EQUAL("string1string21234string3"s, tupleToString(tuple)); CPPUNIT_ASSERT_EQUAL("foobarfoo2bar2"s, tupleToString("foo"s % "bar" % "foo2"s % "bar2")); CPPUNIT_ASSERT_EQUAL("v2.3.0"s, argsToString("v2.", 3, '.', 0)); + CPPUNIT_ASSERT_EQUAL("v2.3.0"s, argsToString('v', make_tuple(2, '.', 3, '.', 0))); // construction of string-tuple and final conversion to string works CPPUNIT_ASSERT_EQUAL_MESSAGE("result can be passed to any function taking a std::string"s, "123456789"s, "12" % string("34") % '5' % 67 + "89");