Skip to content

Commit 218df03

Browse files
reed-lauacozzette
authored andcommitted
add movable String interface Reflection
1 parent 6e0a6d1 commit 218df03

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

src/google/protobuf/extension_set.h

+17-1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ class PROTOBUF_EXPORT ExtensionSet {
269269
void SetBool(int number, FieldType type, bool value, desc);
270270
void SetEnum(int number, FieldType type, int value, desc);
271271
void SetString(int number, FieldType type, const std::string& value, desc);
272+
void SetString(int number, FieldType type, std::string&& value, desc);
272273
std::string* MutableString(int number, FieldType type, desc);
273274
MessageLite* MutableMessage(int number, FieldType type,
274275
const MessageLite& prototype, desc);
@@ -332,6 +333,7 @@ class PROTOBUF_EXPORT ExtensionSet {
332333
void SetRepeatedBool(int number, int index, bool value);
333334
void SetRepeatedEnum(int number, int index, int value);
334335
void SetRepeatedString(int number, int index, const std::string& value);
336+
void SetRepeatedString(int number, int index, std::string&& value);
335337
std::string* MutableRepeatedString(int number, int index);
336338
MessageLite* MutableRepeatedMessage(int number, int index);
337339

@@ -345,6 +347,7 @@ class PROTOBUF_EXPORT ExtensionSet {
345347
void AddBool(int number, FieldType type, bool packed, bool value, desc);
346348
void AddEnum(int number, FieldType type, bool packed, int value, desc);
347349
void AddString(int number, FieldType type, const std::string& value, desc);
350+
void AddString(int number, FieldType type, std::string&& value, desc);
348351
std::string* AddString(int number, FieldType type, desc);
349352
MessageLite* AddMessage(int number, FieldType type,
350353
const MessageLite& prototype, desc);
@@ -862,16 +865,29 @@ inline void ExtensionSet::SetString(int number, FieldType type,
862865
const FieldDescriptor* descriptor) {
863866
MutableString(number, type, descriptor)->assign(value);
864867
}
868+
inline void ExtensionSet::SetString(int number, FieldType type,
869+
std::string&& value,
870+
const FieldDescriptor* descriptor) {
871+
*MutableString(number, type, descriptor) = std::move(value);
872+
}
865873
inline void ExtensionSet::SetRepeatedString(int number, int index,
866874
const std::string& value) {
867875
MutableRepeatedString(number, index)->assign(value);
868876
}
877+
inline void ExtensionSet::SetRepeatedString(int number, int index,
878+
std::string&& value) {
879+
*MutableRepeatedString(number, index) = std::move(value);
880+
}
869881
inline void ExtensionSet::AddString(int number, FieldType type,
870882
const std::string& value,
871883
const FieldDescriptor* descriptor) {
872884
AddString(number, type, descriptor)->assign(value);
873885
}
874-
886+
inline void ExtensionSet::AddString(int number, FieldType type,
887+
std::string&& value,
888+
const FieldDescriptor* descriptor) {
889+
*AddString(number, type, descriptor) = std::move(value);
890+
}
875891
// ===================================================================
876892
// Glue for generated extension accessors
877893

src/google/protobuf/generated_message_reflection.cc

+36-3
Original file line numberDiff line numberDiff line change
@@ -1224,11 +1224,11 @@ void Reflection::SetString(Message* message, const FieldDescriptor* field,
12241224

12251225

12261226
void Reflection::SetString(Message* message, const FieldDescriptor* field,
1227-
const std::string&& value) const {
1227+
std::string&& value) const {
12281228
USAGE_CHECK_ALL(SetString, SINGULAR, STRING);
12291229
if (field->is_extension()) {
12301230
return MutableExtensionSet(message)->SetString(field->number(),
1231-
field->type(), value, field);
1231+
field->type(), std::move(value), field);
12321232
} else {
12331233
switch (field->options().ctype()) {
12341234
default: // TODO(kenton): Support other string reps.
@@ -1247,7 +1247,7 @@ void Reflection::SetString(Message* message, const FieldDescriptor* field,
12471247
->UnsafeSetDefault(default_ptr);
12481248
}
12491249
*(MutableField<ArenaStringPtr>(message, field)
1250-
->Mutable(default_ptr, GetArena(message))) = value;
1250+
->Mutable(default_ptr, GetArena(message))) = std::move(value);
12511251
break;
12521252
}
12531253
}
@@ -1304,6 +1304,23 @@ void Reflection::SetRepeatedString(Message* message,
13041304
}
13051305

13061306

1307+
void Reflection::SetRepeatedString(Message* message,
1308+
const FieldDescriptor* field, int index,
1309+
std::string&& value) const {
1310+
USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
1311+
if (field->is_extension()) {
1312+
MutableExtensionSet(message)->SetRepeatedString(field->number(), index,
1313+
std::move(value));
1314+
} else {
1315+
switch (field->options().ctype()) {
1316+
default: // TODO(kenton): Support other string reps.
1317+
case FieldOptions::STRING:
1318+
*MutableRepeatedField<std::string>(message, field, index) = std::move(value);
1319+
break;
1320+
}
1321+
}
1322+
}
1323+
13071324
void Reflection::AddString(Message* message, const FieldDescriptor* field,
13081325
const std::string& value) const {
13091326
USAGE_CHECK_ALL(AddString, REPEATED, STRING);
@@ -1321,6 +1338,22 @@ void Reflection::AddString(Message* message, const FieldDescriptor* field,
13211338
}
13221339

13231340

1341+
void Reflection::AddString(Message* message, const FieldDescriptor* field,
1342+
std::string&& value) const {
1343+
USAGE_CHECK_ALL(AddString, REPEATED, STRING);
1344+
if (field->is_extension()) {
1345+
MutableExtensionSet(message)->AddString(field->number(), field->type(),
1346+
std::move(value), field);
1347+
} else {
1348+
switch (field->options().ctype()) {
1349+
default: // TODO(kenton): Support other string reps.
1350+
case FieldOptions::STRING:
1351+
*AddField<std::string>(message, field) = std::move(value);
1352+
break;
1353+
}
1354+
}
1355+
}
1356+
13241357
// -------------------------------------------------------------------
13251358

13261359
const EnumValueDescriptor* Reflection::GetEnum(

src/google/protobuf/message.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ class PROTOBUF_EXPORT Reflection final {
541541
void SetString(Message* message, const FieldDescriptor* field,
542542
const std::string& value) const;
543543
void SetString(Message* message, const FieldDescriptor* field,
544-
const std::string&& value) const;
544+
std::string&& value) const;
545545
void SetEnum(Message* message, const FieldDescriptor* field,
546546
const EnumValueDescriptor* value) const;
547547
// Set an enum field's value with an integer rather than EnumValueDescriptor.
@@ -642,6 +642,8 @@ class PROTOBUF_EXPORT Reflection final {
642642
int index, bool value) const;
643643
void SetRepeatedString(Message* message, const FieldDescriptor* field,
644644
int index, const std::string& value) const;
645+
void SetRepeatedString(Message* message, const FieldDescriptor* field,
646+
int index, std::string&& value) const;
645647
void SetRepeatedEnum(Message* message, const FieldDescriptor* field,
646648
int index, const EnumValueDescriptor* value) const;
647649
// Set an enum field's value with an integer rather than EnumValueDescriptor.
@@ -679,6 +681,8 @@ class PROTOBUF_EXPORT Reflection final {
679681
bool value) const;
680682
void AddString(Message* message, const FieldDescriptor* field,
681683
const std::string& value) const;
684+
void AddString(Message* message, const FieldDescriptor* field,
685+
std::string&& value) const;
682686
void AddEnum(Message* message, const FieldDescriptor* field,
683687
const EnumValueDescriptor* value) const;
684688
// Add an integer value to a repeated enum field rather than

0 commit comments

Comments
 (0)