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

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

Change-Id: Ia50fc76500c60ead9386f950aeb2f4369c006730
This commit is contained in:
Treehugger Robot 2021-06-30 01:33:26 +00:00 committed by Automerger Merge Worker
commit 32ceaa1299
3 changed files with 40 additions and 2 deletions

View File

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

View File

@ -64,6 +64,13 @@ TEST(String16Test, Move) {
EXPECT_STR16EQ(u"Verify me", another); 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) { TEST(String16Test, Size) {
String16 tmp("Verify me"); String16 tmp("Verify me");
EXPECT_EQ(9U, tmp.size()); EXPECT_EQ(9U, tmp.size());
@ -123,6 +130,10 @@ TEST(String16Test, StaticStringMove) {
String16 another(std::move(tmp)); String16 another(std::move(tmp));
EXPECT_STR16EQ(u"Verify me", another); EXPECT_STR16EQ(u"Verify me", another);
EXPECT_TRUE(another.isStaticString()); 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) { TEST(String16Test, StaticStringSize) {
@ -174,10 +185,16 @@ TEST(String16Test, StringSetToStaticString) {
EXPECT_STR16EQ(u"Verify me", another); EXPECT_STR16EQ(u"Verify me", another);
} }
TEST(String16Test, StringMoveFromStaticString) { TEST(String16Test, StringMoveAssignFromStaticString) {
StaticString16 tmp(u"Verify me"); 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_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) { TEST(String16Test, EmptyStringIsStatic) {

View File

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