Merge "String16 is moveable (noexcept)" am: 3551e457ca am: 32ceaa1299

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1749261

Change-Id: Ia658a7b6ad2c21c83ef109230a4c5f0a7d02068a
This commit is contained in:
Treehugger Robot 2021-06-30 01:48:14 +00:00 committed by Automerger Merge Worker
commit dcd1cacbbb
3 changed files with 40 additions and 2 deletions

View file

@ -96,6 +96,12 @@ String16::String16(const String16& o)
acquire();
}
String16::String16(String16&& o) noexcept
: mString(o.mString)
{
o.mString = getEmptyString();
}
String16::String16(const String16& o, size_t len, size_t begin)
: mString(getEmptyString())
{
@ -126,6 +132,13 @@ String16::~String16()
release();
}
String16& String16::operator=(String16&& other) noexcept {
release();
mString = other.mString;
other.mString = getEmptyString();
return *this;
}
size_t String16::size() const
{
if (isStaticString()) {

View file

@ -64,6 +64,13 @@ TEST(String16Test, Move) {
EXPECT_STR16EQ(u"Verify me", another);
}
TEST(String16Test, MoveAssign) {
String16 tmp("Verify me");
String16 another;
another = std::move(tmp);
EXPECT_STR16EQ(u"Verify me", another);
}
TEST(String16Test, Size) {
String16 tmp("Verify me");
EXPECT_EQ(9U, tmp.size());
@ -123,6 +130,10 @@ TEST(String16Test, StaticStringMove) {
String16 another(std::move(tmp));
EXPECT_STR16EQ(u"Verify me", another);
EXPECT_TRUE(another.isStaticString());
// move/copy from StaticString16 is specialized (just copy the handle).
// no extra actions required.
EXPECT_STR16EQ(u"Verify me", tmp);
EXPECT_TRUE(tmp.isStaticString());
}
TEST(String16Test, StaticStringSize) {
@ -174,10 +185,16 @@ TEST(String16Test, StringSetToStaticString) {
EXPECT_STR16EQ(u"Verify me", another);
}
TEST(String16Test, StringMoveFromStaticString) {
TEST(String16Test, StringMoveAssignFromStaticString) {
StaticString16 tmp(u"Verify me");
String16 another(std::move(tmp));
String16 another(u"nonstatic");
another = std::move(tmp);
EXPECT_STR16EQ(u"Verify me", another);
EXPECT_TRUE(another.isStaticString());
// move/copy from StaticString16 is specialized (just copy handle).
// no extra actions required.
EXPECT_STR16EQ(u"Verify me", tmp);
EXPECT_TRUE(tmp.isStaticString());
}
TEST(String16Test, EmptyStringIsStatic) {

View file

@ -41,6 +41,7 @@ class String16
public:
String16();
String16(const String16& o);
String16(String16&& o) noexcept;
String16(const String16& o,
size_t len,
size_t begin=0);
@ -69,6 +70,7 @@ public:
status_t append(const char16_t* other, size_t len);
inline String16& operator=(const String16& other);
String16& operator=(String16&& other) noexcept;
inline String16& operator+=(const String16& other);
inline String16 operator+(const String16& other) const;
@ -176,6 +178,12 @@ protected:
public:
template <size_t N>
explicit constexpr String16(const StaticString16<N>& s) : mString(s.mString) {}
template <size_t N>
constexpr String16& operator=(const StaticString16<N>& s) {
release();
mString = s.mString;
return *this;
}
};
// String16 can be trivially moved using memcpy() because moving does not