Skip to content

Commit

Permalink
Fix erroneous typename for multidimensional c-style arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
winwinashwin authored and sharkdp committed Jan 17, 2023
1 parent 3c755ee commit 4880b9b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 6 deletions.
27 changes: 21 additions & 6 deletions dbg.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ template <typename T>
struct type_tag {};

template <int&... ExplicitArgumentBarrier, typename T>
std::string get_type_name(type_tag<T>) {
typename std::enable_if<(std::rank<T>::value == 0), std::string>::type
get_type_name(type_tag<T>) {
namespace pf = pretty_function;

std::string type = type_name_impl<T>();
Expand Down Expand Up @@ -221,14 +222,28 @@ inline std::string get_type_name(type_tag<std::string>) {
return "std::string";
}

template <typename T, size_t N>
std::string get_type_name(type_tag<std::array<T, N>>) {
return "std::array<" + type_name<T>() + ", " + std::to_string(N) + ">";
template <typename T>
typename std::enable_if<(std::rank<T>::value == 1), std::string>::type
get_dim() {
return "[" + std::to_string(std::extent<T>::value) + "]";
}

template <typename T>
typename std::enable_if<(std::rank<T>::value > 1), std::string>::type
get_dim() {
return "[" + std::to_string(std::extent<T>::value) + "]" +
get_dim<typename std::remove_extent<T>::type>();
}

template <typename T>
typename std::enable_if<(std::rank<T>::value > 0), std::string>::type
get_type_name(type_tag<T>) {
return type_name<typename std::remove_all_extents<T>::type>() + " " + get_dim<T>();
}

template <typename T, size_t N>
std::string get_type_name(type_tag<T[N]>) {
return type_name<T>() + " [" + std::to_string(N) + "]";
std::string get_type_name(type_tag<std::array<T, N>>) {
return "std::array<" + type_name<T>() + ", " + std::to_string(N) + ">";
}

template <typename T>
Expand Down
8 changes: 8 additions & 0 deletions tests/basic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,14 @@ TEST_CASE("type_name") {
CHECK(type_name<float>() == "float");
}

SECTION("C-style arrays") {
CHECK(type_name<int[3]>() ==
(std::is_same<int, int32_t>::value ? "int32_t [3]" : "int [3]"));
CHECK(type_name<char[1][2][3]>() == "char [1][2][3]");
double a[] = {5, 4, 3, 2, 1};
CHECK(type_name<decltype(a)>() == "double [5]");
}

SECTION("const and volatile") {
CHECK(type_name<const char>() == "const char");
CHECK(type_name<volatile char>() == "volatile char");
Expand Down

0 comments on commit 4880b9b

Please sign in to comment.