Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C++ Add move constructor for Reflection's SetString #6477

Merged
merged 4 commits into from Aug 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions python/google/protobuf/pyext/message.cc
Expand Up @@ -788,11 +788,11 @@ bool CheckAndSetString(

string value_string(value, value_len);
if (append) {
reflection->AddString(message, descriptor, value_string);
reflection->AddString(message, descriptor, std::move(value_string));
} else if (index < 0) {
reflection->SetString(message, descriptor, value_string);
reflection->SetString(message, descriptor, std::move(value_string));
} else {
reflection->SetRepeatedString(message, descriptor, index, value_string);
reflection->SetRepeatedString(message, descriptor, index, std::move(value_string));
}
return true;
}
Expand Down
19 changes: 9 additions & 10 deletions src/google/protobuf/extension_set.h
Expand Up @@ -268,7 +268,7 @@ class PROTOBUF_EXPORT ExtensionSet {
void SetDouble(int number, FieldType type, double value, desc);
void SetBool(int number, FieldType type, bool value, desc);
void SetEnum(int number, FieldType type, int value, desc);
void SetString(int number, FieldType type, const std::string& value, desc);
void SetString(int number, FieldType type, std::string value, desc);
std::string* MutableString(int number, FieldType type, desc);
MessageLite* MutableMessage(int number, FieldType type,
const MessageLite& prototype, desc);
Expand Down Expand Up @@ -331,7 +331,7 @@ class PROTOBUF_EXPORT ExtensionSet {
void SetRepeatedDouble(int number, int index, double value);
void SetRepeatedBool(int number, int index, bool value);
void SetRepeatedEnum(int number, int index, int value);
void SetRepeatedString(int number, int index, const std::string& value);
void SetRepeatedString(int number, int index, std::string value);
std::string* MutableRepeatedString(int number, int index);
MessageLite* MutableRepeatedMessage(int number, int index);

Expand All @@ -344,7 +344,7 @@ class PROTOBUF_EXPORT ExtensionSet {
void AddDouble(int number, FieldType type, bool packed, double value, desc);
void AddBool(int number, FieldType type, bool packed, bool value, desc);
void AddEnum(int number, FieldType type, bool packed, int value, desc);
void AddString(int number, FieldType type, const std::string& value, desc);
void AddString(int number, FieldType type, std::string value, desc);
std::string* AddString(int number, FieldType type, desc);
MessageLite* AddMessage(int number, FieldType type,
const MessageLite& prototype, desc);
Expand Down Expand Up @@ -858,20 +858,19 @@ class PROTOBUF_EXPORT ExtensionSet {

// These are just for convenience...
inline void ExtensionSet::SetString(int number, FieldType type,
const std::string& value,
std::string value,
const FieldDescriptor* descriptor) {
MutableString(number, type, descriptor)->assign(value);
MutableString(number, type, descriptor)->assign(std::move(value));
}
inline void ExtensionSet::SetRepeatedString(int number, int index,
const std::string& value) {
MutableRepeatedString(number, index)->assign(value);
std::string value) {
MutableRepeatedString(number, index)->assign(std::move(value));
}
inline void ExtensionSet::AddString(int number, FieldType type,
const std::string& value,
std::string value,
const FieldDescriptor* descriptor) {
AddString(number, type, descriptor)->assign(value);
AddString(number, type, descriptor)->assign(std::move(value));
}

// ===================================================================
// Glue for generated extension accessors

Expand Down
21 changes: 10 additions & 11 deletions src/google/protobuf/generated_message_reflection.cc
Expand Up @@ -1191,18 +1191,18 @@ const std::string& Reflection::GetStringReference(const Message& message,


void Reflection::SetString(Message* message, const FieldDescriptor* field,
const std::string& value) const {
std::string value) const {
USAGE_CHECK_ALL(SetString, SINGULAR, STRING);
if (field->is_extension()) {
return MutableExtensionSet(message)->SetString(field->number(),
field->type(), value, field);
field->type(), std::move(value), field);
} else {
switch (field->options().ctype()) {
default: // TODO(kenton): Support other string reps.
case FieldOptions::STRING: {
if (IsInlined(field)) {
MutableField<InlinedStringField>(message, field)
->SetNoArena(nullptr, value);
->SetNoArena(nullptr, std::move(value));
break;
}

Expand All @@ -1214,8 +1214,7 @@ void Reflection::SetString(Message* message, const FieldDescriptor* field,
->UnsafeSetDefault(default_ptr);
}
MutableField<ArenaStringPtr>(message, field)
->Mutable(default_ptr, GetArena(message))
->assign(value);
->Mutable(default_ptr, GetArena(message))->assign(std::move(value));
break;
}
}
Expand Down Expand Up @@ -1256,33 +1255,33 @@ const std::string& Reflection::GetRepeatedStringReference(

void Reflection::SetRepeatedString(Message* message,
const FieldDescriptor* field, int index,
const std::string& value) const {
std::string value) const {
USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
if (field->is_extension()) {
MutableExtensionSet(message)->SetRepeatedString(field->number(), index,
value);
std::move(value));
} else {
switch (field->options().ctype()) {
default: // TODO(kenton): Support other string reps.
case FieldOptions::STRING:
*MutableRepeatedField<std::string>(message, field, index) = value;
MutableRepeatedField<std::string>(message, field, index)->assign(std::move(value));
break;
}
}
}


void Reflection::AddString(Message* message, const FieldDescriptor* field,
const std::string& value) const {
std::string value) const {
USAGE_CHECK_ALL(AddString, REPEATED, STRING);
if (field->is_extension()) {
MutableExtensionSet(message)->AddString(field->number(), field->type(),
value, field);
std::move(value), field);
} else {
switch (field->options().ctype()) {
default: // TODO(kenton): Support other string reps.
case FieldOptions::STRING:
*AddField<std::string>(message, field) = value;
AddField<std::string>(message, field)->assign(std::move(value));
break;
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/google/protobuf/message.h
Expand Up @@ -539,7 +539,7 @@ class PROTOBUF_EXPORT Reflection final {
void SetBool(Message* message, const FieldDescriptor* field,
bool value) const;
void SetString(Message* message, const FieldDescriptor* field,
const std::string& value) const;
std::string value) const;
void SetEnum(Message* message, const FieldDescriptor* field,
const EnumValueDescriptor* value) const;
// Set an enum field's value with an integer rather than EnumValueDescriptor.
Expand Down Expand Up @@ -639,7 +639,7 @@ class PROTOBUF_EXPORT Reflection final {
void SetRepeatedBool(Message* message, const FieldDescriptor* field,
int index, bool value) const;
void SetRepeatedString(Message* message, const FieldDescriptor* field,
int index, const std::string& value) const;
int index, std::string value) const;
void SetRepeatedEnum(Message* message, const FieldDescriptor* field,
int index, const EnumValueDescriptor* value) const;
// Set an enum field's value with an integer rather than EnumValueDescriptor.
Expand Down Expand Up @@ -676,7 +676,7 @@ class PROTOBUF_EXPORT Reflection final {
void AddBool(Message* message, const FieldDescriptor* field,
bool value) const;
void AddString(Message* message, const FieldDescriptor* field,
const std::string& value) const;
std::string value) const;
void AddEnum(Message* message, const FieldDescriptor* field,
const EnumValueDescriptor* value) const;
// Add an integer value to a repeated enum field rather than
Expand Down