summaryrefslogtreecommitdiffstats
path: root/cxxformat.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'cxxformat.hpp')
-rw-r--r--cxxformat.hpp37
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> {};