diff options
Diffstat (limited to 'cxxformat.hpp')
| -rw-r--r-- | cxxformat.hpp | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/cxxformat.hpp b/cxxformat.hpp index 61a800e..47c0cd7 100644 --- a/cxxformat.hpp +++ b/cxxformat.hpp @@ -19,6 +19,7 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN #include <cstring> #include <stdexcept> #include <cstdint> +#include <concepts> namespace format { @@ -36,20 +37,20 @@ struct ImplicitConversion } }; -template<typename From> -struct FormatConvert<std::intmax_t, From, std::enable_if_t<std::is_signed_v<From> && std::is_integral_v<From>>> : ImplicitConversion<std::intmax_t, From> {}; +template<std::signed_integral From> +struct FormatConvert<std::intmax_t, From> : ImplicitConversion<std::intmax_t, From> {}; -template<typename From> -struct FormatConvert<std::intmax_t, From, std::enable_if_t<std::is_unsigned_v<From> && std::is_integral_v<From> && (sizeof(From) < sizeof(std::intmax_t))>> : ImplicitConversion<std::intmax_t, From> {}; +template<std::unsigned_integral From> +struct FormatConvert<std::intmax_t, From, std::enable_if_t<(sizeof(From) < sizeof(std::intmax_t))>> : ImplicitConversion<std::intmax_t, From> {}; -template<typename From> -struct FormatConvert<std::uintmax_t, From, std::enable_if_t<std::is_unsigned_v<From> && std::is_integral_v<From>>> : ImplicitConversion<std::uintmax_t, From> {}; +template<std::unsigned_integral From> +struct FormatConvert<std::uintmax_t, From> : ImplicitConversion<std::uintmax_t, From> {}; -template<typename String> -struct FormatConvert<std::string_view, String, std::enable_if_t<std::is_convertible_v<String, std::string_view>>> : ImplicitConversion<std::string_view, const String &> {}; +template<std::convertible_to<std::string_view> String> +struct FormatConvert<std::string_view, String> : ImplicitConversion<std::string_view, const String &> {}; -template<typename From> -struct FormatConvert<double, From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<From>>> : ImplicitConversion<double, const From &> {}; +template<std::floating_point From> +struct FormatConvert<long double, From> : ImplicitConversion<long double, const From &> {}; template<typename Pointer> struct FormatConvert<const void *, Pointer, std::enable_if_t<std::is_pointer_v<Pointer> && !std::is_array_v<std::remove_pointer_t<Pointer>>>> : ImplicitConversion<const void *, const Pointer> {}; @@ -75,17 +76,17 @@ struct SimpleAutoConversion } }; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_unsigned_v<From>>> : SimpleAutoConversion<'u', From> {}; +template<std::unsigned_integral From> +struct AutoConversion<From> : SimpleAutoConversion<'u', From> {}; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_signed_v<From>>> : SimpleAutoConversion<'d', From> {}; +template<std::signed_integral From> +struct AutoConversion<From> : SimpleAutoConversion<'d', From> {}; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<From>>> : SimpleAutoConversion<'G', From> {}; +template<std::floating_point From> +struct AutoConversion<From> : SimpleAutoConversion<'G', From> {}; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_convertible_v<From, std::string_view>>> : SimpleAutoConversion<'s', From> {}; +template<std::convertible_to<std::string_view> From> +struct AutoConversion<From> : SimpleAutoConversion<'s', From> {}; template<> struct AutoConversion<char> : SimpleAutoConversion<'c', const char> {}; |
