add movable String interface Reflection
diff --git a/src/google/protobuf/extension_set.h b/src/google/protobuf/extension_set.h
index 81de4a4..70d416f 100644
--- a/src/google/protobuf/extension_set.h
+++ b/src/google/protobuf/extension_set.h
@@ -269,6 +269,7 @@
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);
@@ -332,6 +333,7 @@
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);
@@ -345,6 +347,7 @@
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);
@@ -862,16 +865,29 @@
const FieldDescriptor* descriptor) {
MutableString(number, type, descriptor)->assign(value);
}
+inline void ExtensionSet::SetString(int number, FieldType type,
+ std::string&& value,
+ const FieldDescriptor* descriptor) {
+ *MutableString(number, type, descriptor) = std::move(value);
+}
inline void ExtensionSet::SetRepeatedString(int number, int index,
const std::string& value) {
MutableRepeatedString(number, index)->assign(value);
}
+inline void ExtensionSet::SetRepeatedString(int number, int index,
+ std::string&& value) {
+ *MutableRepeatedString(number, index) = std::move(value);
+}
inline void ExtensionSet::AddString(int number, FieldType type,
const std::string& value,
const FieldDescriptor* descriptor) {
AddString(number, type, descriptor)->assign(value);
}
-
+inline void ExtensionSet::AddString(int number, FieldType type,
+ std::string&& value,
+ const FieldDescriptor* descriptor) {
+ *AddString(number, type, descriptor) = std::move(value);
+}
// ===================================================================
// Glue for generated extension accessors
diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc
index c421b23..e987d74 100644
--- a/src/google/protobuf/generated_message_reflection.cc
+++ b/src/google/protobuf/generated_message_reflection.cc
@@ -1224,11 +1224,11 @@
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.
@@ -1247,7 +1247,7 @@
->UnsafeSetDefault(default_ptr);
}
*(MutableField<ArenaStringPtr>(message, field)
- ->Mutable(default_ptr, GetArena(message))) = value;
+ ->Mutable(default_ptr, GetArena(message))) = std::move(value);
break;
}
}
@@ -1304,6 +1304,23 @@
}
+void Reflection::SetRepeatedString(Message* message,
+ const FieldDescriptor* field, int index,
+ std::string&& value) const {
+ USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
+ if (field->is_extension()) {
+ MutableExtensionSet(message)->SetRepeatedString(field->number(), index,
+ std::move(value));
+ } else {
+ switch (field->options().ctype()) {
+ default: // TODO(kenton): Support other string reps.
+ case FieldOptions::STRING:
+ *MutableRepeatedField<std::string>(message, field, index) = std::move(value);
+ break;
+ }
+ }
+}
+
void Reflection::AddString(Message* message, const FieldDescriptor* field,
const std::string& value) const {
USAGE_CHECK_ALL(AddString, REPEATED, STRING);
@@ -1321,6 +1338,22 @@
}
+void Reflection::AddString(Message* message, const FieldDescriptor* field,
+ std::string&& value) const {
+ USAGE_CHECK_ALL(AddString, REPEATED, STRING);
+ if (field->is_extension()) {
+ MutableExtensionSet(message)->AddString(field->number(), field->type(),
+ std::move(value), field);
+ } else {
+ switch (field->options().ctype()) {
+ default: // TODO(kenton): Support other string reps.
+ case FieldOptions::STRING:
+ *AddField<std::string>(message, field) = std::move(value);
+ break;
+ }
+ }
+}
+
// -------------------------------------------------------------------
const EnumValueDescriptor* Reflection::GetEnum(
diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h
index df61341..4ff91ae 100644
--- a/src/google/protobuf/message.h
+++ b/src/google/protobuf/message.h
@@ -541,7 +541,7 @@
void SetString(Message* message, const FieldDescriptor* field,
const std::string& 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.
@@ -642,6 +642,8 @@
int index, bool value) const;
void SetRepeatedString(Message* message, const FieldDescriptor* field,
int index, const std::string& value) const;
+ void SetRepeatedString(Message* message, const FieldDescriptor* field,
+ 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.
@@ -679,6 +681,8 @@
bool value) const;
void AddString(Message* message, const FieldDescriptor* field,
const std::string& value) const;
+ void AddString(Message* message, const FieldDescriptor* field,
+ 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