diff --git a/libc/src/stdio/printf_core/CMakeLists.txt b/libc/src/stdio/printf_core/CMakeLists.txt index 8cd6743a029ca..6d7a3be52bf28 100644 --- a/libc/src/stdio/printf_core/CMakeLists.txt +++ b/libc/src/stdio/printf_core/CMakeLists.txt @@ -21,6 +21,7 @@ add_object_library( libc.src.__support.str_to_integer libc.src.__support.CPP.bit libc.src.__support.CPP.string_view + libc.src.__support.CPP.type_traits ) add_object_library( diff --git a/libc/src/stdio/printf_core/parser.cpp b/libc/src/stdio/printf_core/parser.cpp index 6a2db74ecb6ed..0637eda28d31c 100644 --- a/libc/src/stdio/printf_core/parser.cpp +++ b/libc/src/stdio/printf_core/parser.cpp @@ -266,9 +266,9 @@ Parser::TypeDesc Parser::get_type_desc(size_t index) { ++local_pos; size_t width_index = parse_index(&local_pos); - set_type_desc(width_index, TYPE_DESC); + set_type_desc(width_index, get_type_desc()); if (width_index == index) - return TYPE_DESC; + return get_type_desc(); } else if (internal::isdigit(str[local_pos])) { while (internal::isdigit(str[local_pos])) @@ -282,9 +282,9 @@ Parser::TypeDesc Parser::get_type_desc(size_t index) { ++local_pos; size_t precision_index = parse_index(&local_pos); - set_type_desc(precision_index, TYPE_DESC); + set_type_desc(precision_index, get_type_desc()); if (precision_index == index) - return TYPE_DESC; + return get_type_desc(); } else if (internal::isdigit(str[local_pos])) { while (internal::isdigit(str[local_pos])) @@ -303,13 +303,13 @@ Parser::TypeDesc Parser::get_type_desc(size_t index) { continue; } - TypeDesc conv_size = TYPE_DESC; + TypeDesc conv_size = get_type_desc(); switch (str[local_pos]) { case ('%'): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; case ('c'): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; case ('d'): case ('i'): @@ -321,24 +321,24 @@ Parser::TypeDesc Parser::get_type_desc(size_t index) { case (LengthModifier::hh): case (LengthModifier::h): case (LengthModifier::none): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; case (LengthModifier::l): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; case (LengthModifier::ll): case (LengthModifier::L): // This isn't in the standard, but is in other // libc implementations. - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; case (LengthModifier::j): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; case (LengthModifier::z): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; case (LengthModifier::t): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; } break; @@ -352,9 +352,9 @@ Parser::TypeDesc Parser::get_type_desc(size_t index) { case ('g'): case ('G'): if (lm != LengthModifier::L) - conv_size = TYPE_DESC; + conv_size = get_type_desc(); else - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; #endif // LLVM_LIBC_PRINTF_DISABLE_FLOAT #ifndef LLVM_LIBC_PRINTF_DISABLE_WRITE_INT @@ -362,10 +362,10 @@ Parser::TypeDesc Parser::get_type_desc(size_t index) { #endif // LLVM_LIBC_PRINTF_DISABLE_WRITE_INT case ('p'): case ('s'): - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; default: - conv_size = TYPE_DESC; + conv_size = get_type_desc(); break; } @@ -381,7 +381,7 @@ Parser::TypeDesc Parser::get_type_desc(size_t index) { // If there is no size for the requested index, then just guess that it's an // int. - return TYPE_DESC; + return get_type_desc(); } void Parser::args_to_index(size_t index) { @@ -391,26 +391,26 @@ void Parser::args_to_index(size_t index) { } while (args_index < index) { - Parser::TypeDesc cur_type_desc = TYPE_DESC; + Parser::TypeDesc cur_type_desc = get_type_desc(); if (args_index <= DESC_ARR_LEN) cur_type_desc = desc_arr[args_index - 1]; - if (cur_type_desc == TYPE_DESC) + if (cur_type_desc == get_type_desc()) cur_type_desc = get_type_desc(args_index); - if (cur_type_desc == TYPE_DESC) + if (cur_type_desc == get_type_desc()) args_cur.next_var(); - else if (cur_type_desc == TYPE_DESC) + else if (cur_type_desc == get_type_desc()) args_cur.next_var(); #ifndef LLVM_LIBC_PRINTF_DISABLE_FLOAT // Floating point numbers are stored separately from the other arguments. - else if (cur_type_desc == TYPE_DESC) + else if (cur_type_desc == get_type_desc()) args_cur.next_var(); - else if (cur_type_desc == TYPE_DESC) + else if (cur_type_desc == get_type_desc()) args_cur.next_var(); #endif // LLVM_LIBC_PRINTF_DISABLE_FLOAT // pointers may be stored separately from normal values. - else if (cur_type_desc == TYPE_DESC) + else if (cur_type_desc == get_type_desc()) args_cur.next_var(); else args_cur.next_var(); diff --git a/libc/src/stdio/printf_core/parser.h b/libc/src/stdio/printf_core/parser.h index 16cfd9ec3d45a..7829914a78aeb 100644 --- a/libc/src/stdio/printf_core/parser.h +++ b/libc/src/stdio/printf_core/parser.h @@ -9,6 +9,7 @@ #ifndef LLVM_LIBC_SRC_STDIO_PRINTF_CORE_PARSER_H #define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_PARSER_H +#include "src/__support/CPP/type_traits.h" #include "src/__support/arg_list.h" #include "src/stdio/printf_core/core_structs.h" #include "src/stdio/printf_core/printf_config.h" @@ -103,19 +104,18 @@ class Parser { // local_pos. size_t parse_index(size_t *local_pos); - template - static constexpr TypeDesc TYPE_DESC{sizeof(T), PrimaryType::Integer}; - template <> - static constexpr TypeDesc TYPE_DESC{sizeof(double), - PrimaryType::Float}; - template <> - static constexpr TypeDesc TYPE_DESC{sizeof(long double), - PrimaryType::Float}; - template <> - static constexpr TypeDesc TYPE_DESC{sizeof(void *), - PrimaryType::Pointer}; - template <> - static constexpr TypeDesc TYPE_DESC{0, PrimaryType::Integer}; + template static constexpr TypeDesc get_type_desc() { + if constexpr (cpp::is_same_v) { + return TypeDesc{0, PrimaryType::Integer}; + } else { + constexpr bool isPointer = cpp::is_same_v; + constexpr bool isFloat = + cpp::is_same_v || cpp::is_same_v; + return TypeDesc{sizeof(T), isPointer ? PrimaryType::Pointer + : isFloat ? PrimaryType::Float + : PrimaryType::Integer}; + } + } void inline set_type_desc(size_t index, TypeDesc value) { if (index != 0 && index <= DESC_ARR_LEN) @@ -129,7 +129,7 @@ class Parser { if (!(index == 0 || index == args_index)) args_to_index(index); - set_type_desc(index, TYPE_DESC); + set_type_desc(index, get_type_desc()); ++args_index; return get_next_arg_value();