summaryrefslogtreecommitdiffstats
path: root/cxxformat.hpp
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2019-07-21 00:04:29 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2019-07-21 00:09:09 +0200
commit17f1b653c38a2f9478aaf9d6d762d0c8dd9e6f6f (patch)
treea687ffe513a430a9733d2b1d8f690f2a6d24e0d5 /cxxformat.hpp
parent14d7e7275eb54efdfe59ba3ce3b53634286c3d05 (diff)
downloadcxxformat-17f1b653c38a2f9478aaf9d6d762d0c8dd9e6f6f.tar.gz
cxxformat-17f1b653c38a2f9478aaf9d6d762d0c8dd9e6f6f.zip
Simplify similar specializations of AutoConversion and FormatConvert using base structs
Diffstat (limited to 'cxxformat.hpp')
-rw-r--r--cxxformat.hpp98
1 files changed, 22 insertions, 76 deletions
diff --git a/cxxformat.hpp b/cxxformat.hpp
index d4e8dfd..b02fe4f 100644
--- a/cxxformat.hpp
+++ b/cxxformat.hpp
@@ -27,68 +27,35 @@ using FormatException = std::invalid_argument;
template<typename To, typename From, typename Enable = void>
struct FormatConvert {};
-template<typename From>
-struct FormatConvert<std::intmax_t, From, std::enable_if_t<std::is_signed_v<From> && std::is_integral_v<From>>>
+template<typename To, typename From>
+struct ImplicitConversion
{
- static constexpr std::intmax_t convert(From from)
+ static constexpr To convert(From from)
{
return 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))>>
-{
- static constexpr std::intmax_t convert(From from)
- {
- return 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<typename From>
-struct FormatConvert<std::uintmax_t, From, std::enable_if_t<std::is_unsigned_v<From> && std::is_integral_v<From>>>
-{
- static constexpr std::uintmax_t convert(From from)
- {
- return 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<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<typename String>
-struct FormatConvert<std::string_view, String, std::enable_if_t<std::is_convertible_v<String, std::string_view>>>
-{
- static constexpr std::string_view convert(const String &str)
- {
- return str;
- }
-};
+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<typename From>
-struct FormatConvert<double, From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<From>>>
-{
- static constexpr double convert(const From& val)
- {
- return val;
- }
-};
+struct FormatConvert<double, From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<From>>> : ImplicitConversion<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>> && !std::is_same_v<std::remove_pointer_t<Pointer>, char>>>
-{
- static constexpr const void *convert(const Pointer* pointer)
- {
- return pointer;
- }
-};
+struct FormatConvert<const void *, Pointer, std::enable_if_t<std::is_pointer_v<Pointer> && !std::is_array_v<std::remove_pointer_t<Pointer>> && !std::is_same_v<std::remove_pointer_t<Pointer>, char>>> : ImplicitConversion<const void *, const Pointer *> {};
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>>>>
-{
- static constexpr const void *convert(const Pointer pointer)
- {
- return 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> {};
template<typename From, typename Enable = void>
struct AutoConversion
@@ -99,50 +66,29 @@ struct AutoConversion
}
};
-template<typename From>
-struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_unsigned_v<From>>>
+template<char Conversion, typename From>
+struct SimpleAutoConversion
{
static std::string conversion(const From &)
{
- return "u";
+ return std::string{Conversion};
}
};
template<typename From>
-struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_signed_v<From>>>
-{
- static std::string conversion(const From &)
- {
- return "d";
- }
-};
+struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_unsigned_v<From>>> : SimpleAutoConversion<'u', From> {};
template<typename From>
-struct AutoConversion<From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<From>>>
-{
- static std::string conversion(const From &)
- {
- return "G";
- }
-};
+struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_signed_v<From>>> : SimpleAutoConversion<'d', From> {};
template<typename From>
-struct AutoConversion<From, std::enable_if_t<std::is_convertible_v<From, std::string_view>>>
-{
- static std::string conversion(const From &)
- {
- return "s";
- }
-};
+struct AutoConversion<From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<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<>
-struct AutoConversion<char>
-{
- static std::string conversion(const char)
- {
- return "c";
- }
-};
+struct AutoConversion<char> : SimpleAutoConversion<'c', const char> {};
namespace detail
{