diff options
author | Josaphat Valdivia <jos@choosecase.com> | 2016-10-17 15:41:24 -0400 |
---|---|---|
committer | Neil MacIntosh <neilmac@microsoft.com> | 2016-10-17 12:41:24 -0700 |
commit | a14f27474f09e2c2b5360cb07d777b0ca6ee68b3 (patch) | |
tree | 3d565a0e2c27235f7a2b5a958c573c376ec4474a | |
parent | 1287e624cd3e23c7a3edc036de59690d733815d3 (diff) | |
download | platform_external_Microsoft-GSL-a14f27474f09e2c2b5360cb07d777b0ca6ee68b3.tar.gz platform_external_Microsoft-GSL-a14f27474f09e2c2b5360cb07d777b0ca6ee68b3.tar.bz2 platform_external_Microsoft-GSL-a14f27474f09e2c2b5360cb07d777b0ca6ee68b3.zip |
[#391] string_length: Remove use of strnlen and use consistent length type.
* Removes reference to strnlen as per #391
* Use ptrdiff for string_length interfaces for #391
-rw-r--r-- | gsl/string_span | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/gsl/string_span b/gsl/string_span index 768bfd5..fb943dc 100644 --- a/gsl/string_span +++ b/gsl/string_span @@ -56,10 +56,6 @@ #endif // _MSC_VER <= 1800 #endif // _MSC_VER -#ifndef __CYGWIN__ -#define GSL_PLATFORM_HAS_STRNLEN -#endif - // In order to test the library, we need it to throw exceptions that we can catch #ifdef GSL_THROW_ON_CONTRACT_VIOLATION @@ -101,40 +97,32 @@ using wzstring = basic_zstring<wchar_t, Extent>; namespace details { - inline std::size_t string_length(const char *str, std::size_t n) + inline std::ptrdiff_t string_length(const char *str, std::ptrdiff_t n) { -#ifdef GSL_PLATFORM_HAS_STRNLEN - return strnlen(str, n); -#else - if (str == nullptr || n == 0) + if (str == nullptr || n <= 0) return 0; - std::size_t len = 0; span<const char> str_span{str, n}; + std::ptrdiff_t len = 0; while (len < n && str_span[len]) len++; return len; -#endif } - inline std::size_t wstring_length(const wchar_t *str, std::size_t n) + inline std::ptrdiff_t wstring_length(const wchar_t *str, std::ptrdiff_t n) { -#ifdef GSL_PLATFORM_HAS_STRNLEN - return wcsnlen(str, n); -#else - if (str == nullptr || n == 0) + if (str == nullptr || n <= 0) return 0; - std::size_t len = 0; span<const wchar_t> str_span{str, n}; + std::ptrdiff_t len = 0; while (len < n && str_span[len]) len++; return len; -#endif } } @@ -170,30 +158,30 @@ inline span<T, dynamic_extent> ensure_z(T* const& sz, std::ptrdiff_t max = PTRDI // overloads to share an implementation inline span<char, dynamic_extent> ensure_z(char* const& sz, std::ptrdiff_t max) { - auto len = details::string_length(sz, narrow_cast<size_t>(max)); + auto len = details::string_length(sz, max); Ensures(sz[len] == 0); - return {sz, static_cast<std::ptrdiff_t>(len)}; + return {sz, len}; } inline span<const char, dynamic_extent> ensure_z(const char* const& sz, std::ptrdiff_t max) { - auto len = details::string_length(sz, narrow_cast<size_t>(max)); + auto len = details::string_length(sz, max); Ensures(sz[len] == 0); - return {sz, static_cast<std::ptrdiff_t>(len)}; + return {sz, len}; } inline span<wchar_t, dynamic_extent> ensure_z(wchar_t* const& sz, std::ptrdiff_t max) { - auto len = details::wstring_length(sz, narrow_cast<size_t>(max)); + auto len = details::wstring_length(sz, max); Ensures(sz[len] == 0); - return {sz, static_cast<std::ptrdiff_t>(len)}; + return {sz, len}; } inline span<const wchar_t, dynamic_extent> ensure_z(const wchar_t* const& sz, std::ptrdiff_t max) { - auto len = details::wstring_length(sz, narrow_cast<size_t>(max)); + auto len = details::wstring_length(sz, max); Ensures(sz[len] == 0); - return {sz, static_cast<std::ptrdiff_t>(len)}; + return {sz, len}; } template <typename T, size_t N> @@ -239,7 +227,7 @@ namespace details { std::ptrdiff_t operator()(char* const ptr, std::ptrdiff_t length) noexcept { - return narrow_cast<std::ptrdiff_t>(details::string_length(ptr, narrow_cast<size_t>(length))); + return details::string_length(ptr, length); } }; @@ -248,7 +236,7 @@ namespace details { std::ptrdiff_t operator()(wchar_t* const ptr, std::ptrdiff_t length) noexcept { - return narrow_cast<std::ptrdiff_t>(details::wstring_length(ptr, narrow_cast<size_t>(length))); + return details::wstring_length(ptr, length); } }; @@ -257,7 +245,7 @@ namespace details { std::ptrdiff_t operator()(const char* const ptr, std::ptrdiff_t length) noexcept { - return narrow_cast<std::ptrdiff_t>(details::string_length(ptr, narrow_cast<size_t>(length))); + return details::string_length(ptr, length); } }; @@ -266,7 +254,7 @@ namespace details { std::ptrdiff_t operator()(const wchar_t* const ptr, std::ptrdiff_t length) noexcept { - return narrow_cast<std::ptrdiff_t>(details::wstring_length(ptr, narrow_cast<size_t>(length))); + return details::wstring_length(ptr, length); } }; } |