|
5 | 5 | // | |\ | (_| | | | | | | __/ (_) | | | |____|_| |_| |
6 | 6 | // |_| \_|\__,_|_| |_| |_|\___|\___/|_| \_____| |
7 | 7 | // https://github.com/Neargye/nameof |
8 | | -// vesion 0.9.0 |
| 8 | +// vesion 0.9.1 |
9 | 9 | // |
10 | 10 | // Licensed under the MIT License <http://opensource.org/licenses/MIT>. |
11 | 11 | // SPDX-License-Identifier: MIT |
|
40 | 40 | #include <type_traits> |
41 | 41 | #include <utility> |
42 | 42 |
|
| 43 | +// Checks nameof_type compiler compatibility. |
| 44 | +#if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER) |
| 45 | +# define NAMEOF_TYPE_SUPPORTED 1 |
| 46 | +#endif |
| 47 | + |
| 48 | +// Checks nameof_enum compiler compatibility. |
| 49 | +#if defined(__clang__) || defined(__GNUC__) && __GNUC__>= 9 || defined(_MSC_VER) |
| 50 | +# define NAMEOF_ENUM_SUPPORTED 1 |
| 51 | +#endif |
| 52 | + |
43 | 53 | // Enum value must be greater or equals than NAMEOF_ENUM_RANGE_MIN. By default NAMEOF_ENUM_RANGE_MIN = -128. |
44 | 54 | // If need another min range for all enum types by default, redefine the macro NAMEOF_ENUM_RANGE_MIN. |
45 | 55 | #if !defined(NAMEOF_ENUM_RANGE_MIN) |
@@ -82,15 +92,15 @@ struct identity final { |
82 | 92 |
|
83 | 93 | template <typename... T> |
84 | 94 | struct nameof_type_supported final |
85 | | -#if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER) || defined(NAMEOF_TYPE_NO_CHECK_SUPPORT) |
| 95 | +#if defined(NAMEOF_TYPE_SUPPORTED) && NAMEOF_TYPE_SUPPORTED |
86 | 96 | : std::true_type {}; |
87 | 97 | #else |
88 | 98 | : std::false_type {}; |
89 | 99 | #endif |
90 | 100 |
|
91 | 101 | template <typename T> |
92 | 102 | struct nameof_enum_supported final |
93 | | -#if defined(__clang__) || defined(__GNUC__) && __GNUC__>= 9 || defined(_MSC_VER) || defined(NAMEOF_ENUM_NO_CHECK_SUPPORT) |
| 103 | +#if defined(NAMEOF_ENUM_SUPPORTED) && NAMEOF_ENUM_SUPPORTED |
94 | 104 | : std::true_type {}; |
95 | 105 | #else |
96 | 106 | : std::false_type {}; |
@@ -320,18 +330,17 @@ constexpr std::string_view pretty_name(std::string_view name, bool remove_templa |
320 | 330 | template <typename E, E V> |
321 | 331 | constexpr auto n() noexcept { |
322 | 332 | static_assert(is_enum_v<E>, "nameof::detail::n requires enum type."); |
323 | | -#if defined(__clang__) || defined(__GNUC__) |
| 333 | +#if defined(NAMEOF_ENUM_SUPPORTED) && NAMEOF_ENUM_SUPPORTED |
| 334 | +# if defined(__clang__) || defined(__GNUC__) && __GNUC__>= 9 |
324 | 335 | constexpr auto name = pretty_name({__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 2}); |
325 | | -#elif defined(_MSC_VER) |
| 336 | +# elif defined(_MSC_VER) |
326 | 337 | constexpr auto name = pretty_name({__FUNCSIG__, sizeof(__FUNCSIG__) - 17}); |
| 338 | +# endif |
| 339 | + return static_string<name.size()>{name}; |
| 340 | +#else |
| 341 | + static_assert(nameof_enum_supported<E>::value, "nameof::nameof_enum: Unsupported compiler (https://github.com/Neargye/nameof#compiler-compatibility)."); |
| 342 | + return std::string_view{}; // Unsupported compiler. |
327 | 343 | #endif |
328 | | - |
329 | | - if constexpr (nameof_enum_supported<E>::value) { |
330 | | - return static_string<name.size()>{name}; |
331 | | - } else { |
332 | | - static_assert(nameof_enum_supported<E>::value, "nameof::nameof_enum: Unsupported compiler (https://github.com/Neargye/nameof#compiler-compatibility)."); |
333 | | - return std::string_view{}; // Unsupported compiler. |
334 | | - } |
335 | 344 | } |
336 | 345 |
|
337 | 346 | template <typename E, E V> |
@@ -465,7 +474,7 @@ constexpr auto strings() noexcept { |
465 | 474 | static_assert(is_enum_v<E>, "nameof::detail::strings requires enum type."); |
466 | 475 |
|
467 | 476 | if constexpr (sparsity_v<E>) { |
468 | | - return strings<E>(std::make_index_sequence<count_v<E>>{}); |
| 477 | + return strings<E>(sequence_v<E>); |
469 | 478 | } else { |
470 | 479 | return strings<E>(range_v<E>); |
471 | 480 | } |
@@ -502,20 +511,19 @@ class enum_traits final { |
502 | 511 |
|
503 | 512 | template <typename... T> |
504 | 513 | constexpr auto n() noexcept { |
505 | | -#if defined(__clang__) |
| 514 | +#if defined(NAMEOF_TYPE_SUPPORTED) && NAMEOF_TYPE_SUPPORTED |
| 515 | +# if defined(__clang__) |
506 | 516 | constexpr std::string_view name{__PRETTY_FUNCTION__ + 31, sizeof(__PRETTY_FUNCTION__) - 34}; |
507 | | -#elif defined(__GNUC__) |
| 517 | +# elif defined(__GNUC__) |
508 | 518 | constexpr std::string_view name{__PRETTY_FUNCTION__ + 46, sizeof(__PRETTY_FUNCTION__) - 49}; |
509 | | -#elif defined(_MSC_VER) |
| 519 | +# elif defined(_MSC_VER) |
510 | 520 | constexpr std::string_view name{__FUNCSIG__ + 63, sizeof(__FUNCSIG__) - 81 - (__FUNCSIG__[sizeof(__FUNCSIG__) - 19] == ' ' ? 1 : 0)}; |
| 521 | +# endif |
| 522 | + return static_string<name.size()>{name}; |
| 523 | +#else |
| 524 | + static_assert(nameof_type_supported<T...>::value, "nameof::nameof_type: Unsupported compiler (https://github.com/Neargye/nameof#compiler-compatibility)."); |
| 525 | + return std::string_view{}; // Unsupported compiler. |
511 | 526 | #endif |
512 | | - |
513 | | - if constexpr (nameof_type_supported<T...>::value) { |
514 | | - return static_string<name.size()>{name}; |
515 | | - } else { |
516 | | - static_assert(nameof_type_supported<T...>::value, "nameof::nameof_type: Unsupported compiler (https://github.com/Neargye/nameof#compiler-compatibility)."); |
517 | | - return std::string_view{}; // Unsupported compiler. |
518 | | - } |
519 | 527 | } |
520 | 528 |
|
521 | 529 | } // namespace nameof::detail |
|
0 commit comments