diff --git a/Source/cmStringAlgorithms.h b/Source/cmStringAlgorithms.h index 6508069889..81667db47d 100644 --- a/Source/cmStringAlgorithms.h +++ b/Source/cmStringAlgorithms.h @@ -33,6 +33,13 @@ inline bool cmNonempty(std::string const* str) return str && !str->empty(); } +/** Returns length of a literal string. */ +template +constexpr size_t cmStrLen(const char (&/*str*/)[N]) +{ + return N - 1; +} + /** Callable string comparison struct. */ struct cmStrCmp { diff --git a/Tests/CMakeLib/testStringAlgorithms.cxx b/Tests/CMakeLib/testStringAlgorithms.cxx index 63826cf287..c2706c1f92 100644 --- a/Tests/CMakeLib/testStringAlgorithms.cxx +++ b/Tests/CMakeLib/testStringAlgorithms.cxx @@ -226,5 +226,15 @@ int testStringAlgorithms(int /*unused*/, char* /*unused*/ []) "cmStrToULong rejects trailing content."); } + // ---------------------------------------------------------------------- + // Test cmStrLen + { + constexpr auto len = cmStrLen("Hello world!"); + assert_ok(len == 12, + "cmStrLen returns length of non-empty literal string"); + assert_ok(cmStrLen("") == 0, + "cmStrLen returns length of empty literal string"); + } + return failed; }