Merge string make_value overloads

This commit is contained in:
Victor Zverovich
2019-06-06 08:29:16 -07:00
parent a38b99a188
commit f5f3ffac59

View File

@ -795,17 +795,27 @@ FMT_MAKE_VALUE(cstring_type, typename C::char_type*,
const typename C::char_type*) const typename C::char_type*)
FMT_MAKE_VALUE(cstring_type, const typename C::char_type*, FMT_MAKE_VALUE(cstring_type, const typename C::char_type*,
const typename C::char_type*) const typename C::char_type*)
FMT_MAKE_VALUE(cstring_type, signed char*, const signed char*) FMT_MAKE_VALUE(cstring_type, signed char*, const signed char*)
FMT_MAKE_VALUE_SAME(cstring_type, const signed char*) FMT_MAKE_VALUE_SAME(cstring_type, const signed char*)
FMT_MAKE_VALUE(cstring_type, unsigned char*, const unsigned char*) FMT_MAKE_VALUE(cstring_type, unsigned char*, const unsigned char*)
FMT_MAKE_VALUE_SAME(cstring_type, const unsigned char*) FMT_MAKE_VALUE_SAME(cstring_type, const unsigned char*)
FMT_MAKE_VALUE_SAME(string_type, basic_string_view<typename C::char_type>)
FMT_MAKE_VALUE(string_type, template <typename C, typename S, FMT_ENABLE_IF(internal::is_string<S>::value)>
typename basic_string_view<typename C::char_type>::type, FMT_CONSTEXPR11 init<C, basic_string_view<typename C::char_type>, string_type>
basic_string_view<typename C::char_type>) make_value(const S& val) {
FMT_MAKE_VALUE(string_type, const std::basic_string<typename C::char_type>&, static_assert(std::is_same<typename C::char_type, char_t<S>>::value,
basic_string_view<typename C::char_type>) "mismatch between char-types of context and argument");
return to_string_view(val);
}
template <
typename C, typename T, typename Char = typename C::char_type,
FMT_ENABLE_IF(std::is_constructible<basic_string_view<Char>, T>::value &&
!internal::is_string<T>::value)>
inline init<C, basic_string_view<Char>, string_type> make_value(const T& val) {
return basic_string_view<Char>(val);
}
FMT_MAKE_VALUE(pointer_type, void*, const void*) FMT_MAKE_VALUE(pointer_type, void*, const void*)
FMT_MAKE_VALUE_SAME(pointer_type, const void*) FMT_MAKE_VALUE_SAME(pointer_type, const void*)
FMT_MAKE_VALUE(pointer_type, std::nullptr_t, const void*) FMT_MAKE_VALUE(pointer_type, std::nullptr_t, const void*)
@ -827,14 +837,6 @@ inline init<C, int, int_type> make_value(const T& val) {
return static_cast<int>(val); return static_cast<int>(val);
} }
template <
typename C, typename T, typename Char = typename C::char_type,
FMT_ENABLE_IF(std::is_constructible<basic_string_view<Char>, T>::value &&
!internal::is_string<T>::value)>
inline init<C, basic_string_view<Char>, string_type> make_value(const T& val) {
return basic_string_view<Char>(val);
}
// Implicit conversion to std::string is disallowed because it would be unsafe: // Implicit conversion to std::string is disallowed because it would be unsafe:
// https://github.com/fmtlib/fmt/issues/729 // https://github.com/fmtlib/fmt/issues/729
template < template <
@ -857,15 +859,6 @@ init<C, const void*, named_arg_type> make_value(
return static_cast<const void*>(&val); return static_cast<const void*>(&val);
} }
template <typename C, typename S, FMT_ENABLE_IF(internal::is_string<S>::value)>
FMT_CONSTEXPR11 init<C, basic_string_view<typename C::char_type>, string_type>
make_value(const S& val) {
// Handle adapted strings.
static_assert(std::is_same<typename C::char_type, char_t<S>>::value,
"mismatch between char-types of context and argument");
return to_string_view(val);
}
// Maximum number of arguments with packed types. // Maximum number of arguments with packed types.
enum { max_packed_args = 15 }; enum { max_packed_args = 15 };
enum : unsigned long long { is_unpacked_bit = 1ull << 63 }; enum : unsigned long long { is_unpacked_bit = 1ull << 63 };
@ -1313,11 +1306,9 @@ template <typename T, typename Char> struct named_arg : named_arg_base<Char> {
: named_arg_base<Char>(name), value(val) {} : named_arg_base<Char>(name), value(val) {}
}; };
template <typename... Args, typename S, template <typename..., typename S, FMT_ENABLE_IF(!is_compile_string<S>::value)>
FMT_ENABLE_IF(!is_compile_string<S>::value)>
inline void check_format_string(const S&) {} inline void check_format_string(const S&) {}
template <typename... Args, typename S, template <typename..., typename S, FMT_ENABLE_IF(is_compile_string<S>::value)>
FMT_ENABLE_IF(is_compile_string<S>::value)>
void check_format_string(S); void check_format_string(S);
template <typename S, typename... Args, typename Char = char_t<S>> template <typename S, typename... Args, typename Char = char_t<S>>