Support string builder operator '%' for std::string_view
This commit is contained in:
parent
8e3aa84780
commit
b8a60a0cd4
|
@ -22,6 +22,13 @@ template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = null
|
||||||
return str.size();
|
return str.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class StringType, class ViewType,
|
||||||
|
Traits::EnableIf<std::is_same<ViewType, std::basic_string_view<typename StringType::value_type>>> * = nullptr>
|
||||||
|
inline std::size_t computeTupleElementSize(const ViewType *str)
|
||||||
|
{
|
||||||
|
return str->size();
|
||||||
|
}
|
||||||
|
|
||||||
template <class StringType, class ViewType,
|
template <class StringType, class ViewType,
|
||||||
Traits::EnableIf<std::is_same<ViewType, std::basic_string_view<typename StringType::value_type>>> * = nullptr>
|
Traits::EnableIf<std::is_same<ViewType, std::basic_string_view<typename StringType::value_type>>> * = nullptr>
|
||||||
inline std::size_t computeTupleElementSize(ViewType str)
|
inline std::size_t computeTupleElementSize(ViewType str)
|
||||||
|
@ -73,6 +80,13 @@ template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = null
|
||||||
target.append(str);
|
target.append(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class StringType, class ViewType,
|
||||||
|
Traits::EnableIf<std::is_same<ViewType, std::basic_string_view<typename StringType::value_type>>> * = nullptr>
|
||||||
|
inline void append(StringType &target, const ViewType *str)
|
||||||
|
{
|
||||||
|
target.append(*str);
|
||||||
|
}
|
||||||
|
|
||||||
template <class StringType, class ViewType,
|
template <class StringType, class ViewType,
|
||||||
Traits::EnableIf<std::is_same<ViewType, std::basic_string_view<typename StringType::value_type>>> * = nullptr>
|
Traits::EnableIf<std::is_same<ViewType, std::basic_string_view<typename StringType::value_type>>> * = nullptr>
|
||||||
inline void append(StringType &target, ViewType str)
|
inline void append(StringType &target, ViewType str)
|
||||||
|
@ -166,7 +180,10 @@ template <class StringType = std::string, class... Args> inline StringType argsT
|
||||||
/*!
|
/*!
|
||||||
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
||||||
*/
|
*/
|
||||||
template <class Tuple> constexpr auto operator%(const Tuple &lhs, const std::string &rhs) -> decltype(std::tuple_cat(lhs, std::make_tuple(&rhs)))
|
template <class Tuple, class StringType,
|
||||||
|
Traits::EnableIfAny<Traits::IsSpecializationOf<StringType, std::basic_string>, Traits::IsSpecializationOf<StringType, std::basic_string_view>>
|
||||||
|
* = nullptr>
|
||||||
|
constexpr auto operator%(const Tuple &lhs, const StringType &rhs) -> decltype(std::tuple_cat(lhs, std::make_tuple(&rhs)))
|
||||||
{
|
{
|
||||||
return std::tuple_cat(lhs, std::make_tuple(&rhs));
|
return std::tuple_cat(lhs, std::make_tuple(&rhs));
|
||||||
}
|
}
|
||||||
|
@ -191,7 +208,10 @@ constexpr auto operator%(const Tuple &lhs, IntegralType rhs) -> decltype(std::tu
|
||||||
/*!
|
/*!
|
||||||
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
||||||
*/
|
*/
|
||||||
constexpr auto operator%(const std::string &lhs, const std::string &rhs) -> decltype(std::make_tuple(&lhs, &rhs))
|
template <class StringType,
|
||||||
|
Traits::EnableIfAny<Traits::IsSpecializationOf<StringType, std::basic_string>, Traits::IsSpecializationOf<StringType, std::basic_string_view>>
|
||||||
|
* = nullptr>
|
||||||
|
constexpr auto operator%(const StringType &lhs, const StringType &rhs) -> decltype(std::make_tuple(&lhs, &rhs))
|
||||||
{
|
{
|
||||||
return std::make_tuple(&lhs, &rhs);
|
return std::make_tuple(&lhs, &rhs);
|
||||||
}
|
}
|
||||||
|
@ -199,7 +219,10 @@ constexpr auto operator%(const std::string &lhs, const std::string &rhs) -> decl
|
||||||
/*!
|
/*!
|
||||||
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
||||||
*/
|
*/
|
||||||
constexpr auto operator%(const char *lhs, const std::string &rhs) -> decltype(std::make_tuple(lhs, &rhs))
|
template <class StringType,
|
||||||
|
Traits::EnableIfAny<Traits::IsSpecializationOf<StringType, std::basic_string>, Traits::IsSpecializationOf<StringType, std::basic_string_view>>
|
||||||
|
* = nullptr>
|
||||||
|
constexpr auto operator%(const char *lhs, const StringType &rhs) -> decltype(std::make_tuple(lhs, &rhs))
|
||||||
{
|
{
|
||||||
return std::make_tuple(lhs, &rhs);
|
return std::make_tuple(lhs, &rhs);
|
||||||
}
|
}
|
||||||
|
@ -207,7 +230,10 @@ constexpr auto operator%(const char *lhs, const std::string &rhs) -> decltype(st
|
||||||
/*!
|
/*!
|
||||||
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
||||||
*/
|
*/
|
||||||
constexpr auto operator%(const std::string &lhs, const char *rhs) -> decltype(std::make_tuple(&lhs, rhs))
|
template <class StringType,
|
||||||
|
Traits::EnableIfAny<Traits::IsSpecializationOf<StringType, std::basic_string>, Traits::IsSpecializationOf<StringType, std::basic_string_view>>
|
||||||
|
* = nullptr>
|
||||||
|
constexpr auto operator%(const StringType &lhs, const char *rhs) -> decltype(std::make_tuple(&lhs, rhs))
|
||||||
{
|
{
|
||||||
return std::make_tuple(&lhs, rhs);
|
return std::make_tuple(&lhs, rhs);
|
||||||
}
|
}
|
||||||
|
@ -215,7 +241,10 @@ constexpr auto operator%(const std::string &lhs, const char *rhs) -> decltype(st
|
||||||
/*!
|
/*!
|
||||||
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
||||||
*/
|
*/
|
||||||
constexpr auto operator%(const std::string &lhs, char rhs) -> decltype(std::make_tuple(&lhs, rhs))
|
template <class StringType,
|
||||||
|
Traits::EnableIfAny<Traits::IsSpecializationOf<StringType, std::basic_string>, Traits::IsSpecializationOf<StringType, std::basic_string_view>>
|
||||||
|
* = nullptr>
|
||||||
|
constexpr auto operator%(const StringType &lhs, char rhs) -> decltype(std::make_tuple(&lhs, rhs))
|
||||||
{
|
{
|
||||||
return std::make_tuple(&lhs, rhs);
|
return std::make_tuple(&lhs, rhs);
|
||||||
}
|
}
|
||||||
|
@ -223,7 +252,10 @@ constexpr auto operator%(const std::string &lhs, char rhs) -> decltype(std::make
|
||||||
/*!
|
/*!
|
||||||
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
* \brief Allows construction of string-tuples via %-operator, eg. string1 % "string2" % string3.
|
||||||
*/
|
*/
|
||||||
constexpr auto operator%(char lhs, const std::string &rhs) -> decltype(std::make_tuple(lhs, &rhs))
|
template <class StringType,
|
||||||
|
Traits::EnableIfAny<Traits::IsSpecializationOf<StringType, std::basic_string>, Traits::IsSpecializationOf<StringType, std::basic_string_view>>
|
||||||
|
* = nullptr>
|
||||||
|
constexpr auto operator%(char lhs, const StringType &rhs) -> decltype(std::make_tuple(lhs, &rhs))
|
||||||
{
|
{
|
||||||
return std::make_tuple(lhs, &rhs);
|
return std::make_tuple(lhs, &rhs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -394,5 +394,5 @@ void ConversionTests::testStringBuilder()
|
||||||
"velocity: " % numberToString(velocityExample) % " km/h (" % numberToString(velocityExample / 3.6) + " m/s)");
|
"velocity: " % numberToString(velocityExample) % " km/h (" % numberToString(velocityExample / 3.6) + " m/s)");
|
||||||
CPPUNIT_ASSERT_EQUAL_MESSAGE(
|
CPPUNIT_ASSERT_EQUAL_MESSAGE(
|
||||||
"regular + operator still works (no problems with ambiguity)"s, "regular + still works"s, "regular"s + " + still works");
|
"regular + operator still works (no problems with ambiguity)"s, "regular + still works"s, "regular"s + " + still works");
|
||||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("using string_view", "foobar123"s, argsToString("foo"sv, "bar"sv, 123));
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("using string_view", "foobar123"s, "foo"sv % "bar"sv + 123);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue