From 17f1b653c38a2f9478aaf9d6d762d0c8dd9e6f6f Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Sun, 21 Jul 2019 00:04:29 +0200 Subject: Simplify similar specializations of AutoConversion and FormatConvert using base structs --- cxxformat.hpp | 98 ++++++++++++++--------------------------------------------- main.cpp | 18 ++--------- 2 files changed, 25 insertions(+), 91 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 struct FormatConvert {}; -template -struct FormatConvert && std::is_integral_v>> +template +struct ImplicitConversion { - static constexpr std::intmax_t convert(From from) + static constexpr To convert(From from) { return from; } }; template -struct FormatConvert && std::is_integral_v && (sizeof(From) < sizeof(std::intmax_t))>> -{ - static constexpr std::intmax_t convert(From from) - { - return from; - } -}; +struct FormatConvert && std::is_integral_v>> : ImplicitConversion {}; template -struct FormatConvert && std::is_integral_v>> -{ - static constexpr std::uintmax_t convert(From from) - { - return from; - } -}; +struct FormatConvert && std::is_integral_v && (sizeof(From) < sizeof(std::intmax_t))>> : ImplicitConversion {}; + +template +struct FormatConvert && std::is_integral_v>> : ImplicitConversion {}; template -struct FormatConvert>> -{ - static constexpr std::string_view convert(const String &str) - { - return str; - } -}; +struct FormatConvert>> : ImplicitConversion {}; template -struct FormatConvert && !std::is_integral_v>> -{ - static constexpr double convert(const From& val) - { - return val; - } -}; +struct FormatConvert && !std::is_integral_v>> : ImplicitConversion {}; template -struct FormatConvert && !std::is_array_v> && !std::is_same_v, char>>> -{ - static constexpr const void *convert(const Pointer* pointer) - { - return pointer; - } -}; +struct FormatConvert && !std::is_array_v> && !std::is_same_v, char>>> : ImplicitConversion {}; template -struct FormatConvert && std::is_array_v>>> -{ - static constexpr const void *convert(const Pointer pointer) - { - return pointer; - } -}; +struct FormatConvert && std::is_array_v>>> : ImplicitConversion {}; template struct AutoConversion @@ -99,50 +66,29 @@ struct AutoConversion } }; -template -struct AutoConversion && std::is_unsigned_v>> +template +struct SimpleAutoConversion { static std::string conversion(const From &) { - return "u"; + return std::string{Conversion}; } }; template -struct AutoConversion && std::is_signed_v>> -{ - static std::string conversion(const From &) - { - return "d"; - } -}; +struct AutoConversion && std::is_unsigned_v>> : SimpleAutoConversion<'u', From> {}; template -struct AutoConversion && !std::is_integral_v>> -{ - static std::string conversion(const From &) - { - return "G"; - } -}; +struct AutoConversion && std::is_signed_v>> : SimpleAutoConversion<'d', From> {}; template -struct AutoConversion>> -{ - static std::string conversion(const From &) - { - return "s"; - } -}; +struct AutoConversion && !std::is_integral_v>> : SimpleAutoConversion<'G', From> {}; + +template +struct AutoConversion>> : SimpleAutoConversion<'s', From> {}; template<> -struct AutoConversion -{ - static std::string conversion(const char) - { - return "c"; - } -}; +struct AutoConversion : SimpleAutoConversion<'c', const char> {}; namespace detail { diff --git a/main.cpp b/main.cpp index 7a0ccd0..d7fb862 100644 --- a/main.cpp +++ b/main.cpp @@ -28,29 +28,17 @@ struct format::FormatConvert struct format::FormatConvert> { - static std::string convert(const std::array& from) + static std::string convert(const std::array &from) { return format::FormatConvert::convert(from.data()); } }; template -struct format::AutoConversion> -{ - static std::string conversion(const std::array&) - { - return "s"; - } -}; +struct format::AutoConversion> : format::SimpleAutoConversion<'s', const std::array &> {}; template -struct format::AutoConversion, char>>> -{ - static std::string conversion(const T(&)[N]) - { - return "s"; - } -}; +struct format::AutoConversion, char>>> : format::SimpleAutoConversion<'s', const T(&)[N]> {}; int main(int argc, char *argv[]) { -- cgit v1.2.3-54-g00ecf