diff options
-rw-r--r-- | source/blender/blenlib/BLI_string_ref.hh | 10 | ||||
-rw-r--r-- | tests/gtests/blenlib/BLI_string_ref_test.cc | 24 |
2 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_string_ref.hh b/source/blender/blenlib/BLI_string_ref.hh index 8ed923068a8..073137fe175 100644 --- a/source/blender/blenlib/BLI_string_ref.hh +++ b/source/blender/blenlib/BLI_string_ref.hh @@ -230,6 +230,16 @@ class StringRef : public StringRefBase { } /** + * Create a StringRef from a start and end pointer. This invokes undefined behavior when the + * second point points to a smaller address than the first one. + */ + StringRef(const char *begin, const char *one_after_end) + : StringRefBase(begin, (uint)(one_after_end - begin)) + { + BLI_assert(begin <= one_after_end); + } + + /** * Reference a std::string. Remember that when the std::string is destructed, the StringRef * will point to uninitialized memory. */ diff --git a/tests/gtests/blenlib/BLI_string_ref_test.cc b/tests/gtests/blenlib/BLI_string_ref_test.cc index 6823a79da06..5bb0c396288 100644 --- a/tests/gtests/blenlib/BLI_string_ref_test.cc +++ b/tests/gtests/blenlib/BLI_string_ref_test.cc @@ -36,6 +36,30 @@ TEST(string_ref, DefaultConstructor) EXPECT_EQ(ref.size(), 0); } +TEST(string_ref, StartEndConstructor) +{ + const char *text = "hello world"; + StringRef ref(text, text + 5); + EXPECT_EQ(ref.size(), 5); + EXPECT_TRUE(ref == "hello"); + EXPECT_FALSE(ref == "hello "); +} + +TEST(string_ref, StartEndConstructorNullptr) +{ + StringRef ref(nullptr, nullptr); + EXPECT_EQ(ref.size(), 0); + EXPECT_TRUE(ref == ""); +} + +TEST(string_ref, StartEndConstructorSame) +{ + const char *text = "hello world"; + StringRef ref(text, text); + EXPECT_EQ(ref.size(), 0); + EXPECT_TRUE(ref == ""); +} + TEST(string_ref, CStringConstructor) { const char *str = "Test"; |