This commit is contained in:
Neargye 2018-08-29 16:57:35 +05:00
parent 828b29e8e6
commit 8b07a431aa

View file

@ -41,7 +41,7 @@
# define NAMEOF_HAS_CONSTEXPR14 1 # define NAMEOF_HAS_CONSTEXPR14 1
# define NAMEOF_CONSTEXPR14 constexpr # define NAMEOF_CONSTEXPR14 constexpr
#else #else
# define NAMEOF_CONSTEXPR14 /*constexpr*/ # define NAMEOF_CONSTEXPR14 inline
#endif #endif
#if (defined(__clang__) || defined(_MSC_VER)) || (defined(__GNUC__) && __GNUC__ >= 5) #if (defined(__clang__) || defined(_MSC_VER)) || (defined(__GNUC__) && __GNUC__ >= 5)
@ -51,13 +51,6 @@
# define NAMEOF_TYPE_CONSTEXPR inline # define NAMEOF_TYPE_CONSTEXPR inline
#endif #endif
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
# define NAMEOF_HAS_CONSTEXPR17 1
# define NAMEOF_CONSTEXPR17 constexpr
#else
# define NAMEOF_CONSTEXPR17 /*constexpr*/
#endif
namespace nameof { namespace nameof {
namespace detail { namespace detail {
@ -72,15 +65,12 @@ struct identity {
} // namespace nstd } // namespace nstd
constexpr bool StrEquals(const char* lhs, const char* rhs, std::size_t size) { constexpr bool StrEquals(const char* lhs, const char* rhs, std::size_t size) {
#if defined(NAMEOF_HAS_CONSTEXPR17) #if defined(NAMEOF_HAS_CONSTEXPR14)
return std::char_traits<char>::compare(lhs, rhs, size) == 0;
#elif defined(NAMEOF_HAS_CONSTEXPR14)
for (std::size_t i = 0; i < size; ++i) { for (std::size_t i = 0; i < size; ++i) {
if (lhs[i] != rhs[i]) { if (lhs[i] != rhs[i]) {
return false; return false;
} }
} }
return true; return true;
#else #else
return (size == 0) ? (lhs[0] == rhs[0]) : (lhs[size - 1] == rhs[size - 1] && StrEquals(lhs, rhs, size - 1)); return (size == 0) ? (lhs[0] == rhs[0]) : (lhs[size - 1] == rhs[size - 1] && StrEquals(lhs, rhs, size - 1));
@ -88,16 +78,12 @@ constexpr bool StrEquals(const char* lhs, const char* rhs, std::size_t size) {
} }
constexpr std::size_t StrLen(const char* str, std::size_t size = 0) { constexpr std::size_t StrLen(const char* str, std::size_t size = 0) {
#if defined(NAMEOF_HAS_CONSTEXPR17) #if defined(NAMEOF_HAS_CONSTEXPR14)
(void)size;
return std::char_traits<char>::length(str);
#elif defined(NAMEOF_HAS_CONSTEXPR14)
for (; str != nullptr; ++size) { for (; str != nullptr; ++size) {
if (str[size] == '\0') { if (str[size] == '\0') {
return size; return size;
} }
} }
return size; return size;
#else #else
return (str[size] == '\0') ? size : StrLen(str, size + 1); return (str[size] == '\0') ? size : StrLen(str, size + 1);
@ -172,7 +158,7 @@ class cstring final {
constexpr cstring substr(std::size_t pos, std::size_t n) const { return {str_ + pos, n}; } constexpr cstring substr(std::size_t pos, std::size_t n) const { return {str_ + pos, n}; }
NAMEOF_CONSTEXPR17 int compare(cstring other) const { int compare(cstring other) const {
if (const auto result = std::char_traits<char>::compare(str_, other.str_, other.size_ < size_ ? other.size_ : size_)) if (const auto result = std::char_traits<char>::compare(str_, other.str_, other.size_ < size_ ? other.size_ : size_))
return result; return result;