diff options
author | tsepez <tsepez@chromium.org> | 2016-04-11 18:01:13 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-04-11 18:01:13 -0700 |
commit | e09c1e4db92e28a332f55aa3c80ceb44f4b74287 (patch) | |
tree | 2ba0b13dadf379f7673317fdd2909db21cce9412 /core/fxcrt/fx_basic_bstring_unittest.cpp | |
parent | 24a48881c5407651a58cfd6547ac9b6a9823a63e (diff) | |
download | pdfium-e09c1e4db92e28a332f55aa3c80ceb44f4b74287.tar.xz |
Make CFX_{Byte,Wide}String::Remove() no-touch if possible
Don't try to copy the string until we are sure we need to
change it.
Review URL: https://codereview.chromium.org/1877993002
Diffstat (limited to 'core/fxcrt/fx_basic_bstring_unittest.cpp')
-rw-r--r-- | core/fxcrt/fx_basic_bstring_unittest.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/core/fxcrt/fx_basic_bstring_unittest.cpp b/core/fxcrt/fx_basic_bstring_unittest.cpp index 8c72b2a054..ea7e17f1f1 100644 --- a/core/fxcrt/fx_basic_bstring_unittest.cpp +++ b/core/fxcrt/fx_basic_bstring_unittest.cpp @@ -333,6 +333,35 @@ TEST(fxcrt, ByteStringRemove) { EXPECT_EQ("", empty); } +TEST(fxcrt, ByteStringRemoveCopies) { + CFX_ByteString freed("FREED"); + const FX_CHAR* old_buffer = freed.c_str(); + + // No change with single reference - no copy. + freed.Remove('Q'); + EXPECT_EQ("FREED", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + + // Change with single reference - no copy. + freed.Remove('E'); + EXPECT_EQ("FRD", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + + // No change with multiple references - no copy. + CFX_ByteString shared(freed); + freed.Remove('Q'); + EXPECT_EQ("FRD", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + EXPECT_EQ(old_buffer, shared.c_str()); + + // Change with multiple references -- must copy. + freed.Remove('D'); + EXPECT_EQ("FR", freed); + EXPECT_NE(old_buffer, freed.c_str()); + EXPECT_EQ("FRD", shared); + EXPECT_EQ(old_buffer, shared.c_str()); +} + TEST(fxcrt, ByteStringReplace) { CFX_ByteString fred("FRED"); fred.Replace("FR", "BL"); |