diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2019-06-18 19:49:34 -0400 |
|---|---|---|
| committer | Tim Foley <tfoleyNV@users.noreply.github.com> | 2019-06-18 16:49:34 -0700 |
| commit | 7c9298d8b10b5f4e69e24e3eb933e93e0d92fc37 (patch) | |
| tree | ab5293052f7e5271fd379b02e2168217aa86c4bc /source/core/slang-string.h | |
| parent | e213e394d5008cb7bf08bbf875acd494259f5847 (diff) | |
StringUtil::extractLine (#989)
* Added extractLine line parsing to StringUtil. Use for matching lines instead of calcLines. calcLines uses extractLine to extract lines.
Fixed problems found in output of some tests- due to how a how final line is handled. Now a final line has a \r or \n\r combination, but nothing else after it, it is considered the last line (not the line after it).
* Use StringUtil::extractLine in slang-generate.
* Improved comment on extractLine
* Remove test code from StringUtil::extractLine
* Made StringUtil::extractLine act as if line terminators are 'separators'.
Added unit-test-string.cpp - to check behavior.
* Adding LineParser - not entirely necessary, but slightly easier to use.
* Improved LineParser::Iterator end testing.
Added improved tests for LineParser.
* Move line comparson after termination case - to fix problem with gcc release build.
* Make UnownedStringSlice handle comparison when begin is nullptr - as it uses memcmp and passing nullptr to memcmp is undefined, leading to optimizer being able to do some unfortunate optimizations on gcc.
Diffstat (limited to 'source/core/slang-string.h')
| -rw-r--r-- | source/core/slang-string.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/source/core/slang-string.h b/source/core/slang-string.h index 4975e9ec6..8a9e83cd1 100644 --- a/source/core/slang-string.h +++ b/source/core/slang-string.h @@ -119,8 +119,25 @@ namespace Slang bool operator==(UnownedStringSlice const& other) const { - return size() == other.size() - && memcmp(begin(), other.begin(), size()) == 0; + // Note that memcmp is undefined when passed in null ptrs, so if we want to handle + // we need to cover that case. + // Can only be nullptr if size is 0. + auto thisSize = size(); + auto otherSize = other.size(); + + if (thisSize != otherSize) + { + return false; + } + + const char*const thisChars = begin(); + const char*const otherChars = other.begin(); + if (thisChars == otherChars || thisSize == 0) + { + return true; + } + SLANG_ASSERT(thisChars && otherChars); + return memcmp(thisChars, otherChars, thisSize) == 0; } bool operator==(char const* str) const |
