220
221
const FieldDescriptor* field = descriptor_->field(i);
222
223
if (field->is_repeated()) {
223
total_size += GetRaw<GenericRepeatedField>(message, field)
224
.GenericSpaceUsedExcludingSelf();
224
switch (field->cpp_type()) {
225
#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
226
case FieldDescriptor::CPPTYPE_##UPPERCASE : \
227
total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field) \
228
.SpaceUsedExcludingSelf(); \
231
HANDLE_TYPE( INT32, int32);
232
HANDLE_TYPE( INT64, int64);
233
HANDLE_TYPE(UINT32, uint32);
234
HANDLE_TYPE(UINT64, uint64);
235
HANDLE_TYPE(DOUBLE, double);
236
HANDLE_TYPE( FLOAT, float);
237
HANDLE_TYPE( BOOL, bool);
238
HANDLE_TYPE( ENUM, int);
241
case FieldDescriptor::CPPTYPE_STRING:
242
total_size += GetRaw<RepeatedPtrField<string> >(message, field)
243
.SpaceUsedExcludingSelf();
246
case FieldDescriptor::CPPTYPE_MESSAGE:
247
// We don't know which subclass of RepeatedPtrFieldBase the type is,
248
// so we use RepeatedPtrFieldBase directly.
250
GetRaw<RepeatedPtrFieldBase>(message, field)
251
.SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
226
255
switch (field->cpp_type()) {
227
256
case FieldDescriptor::CPPTYPE_INT32 :
269
298
return total_size;
301
void GeneratedMessageReflection::Swap(
303
Message* message2) const {
304
if (message1 == message2) return;
306
// TODO(kenton): Other Reflection methods should probably check this too.
307
GOOGLE_CHECK_EQ(message1->GetReflection(), this)
308
<< "First argument to Swap() (of type \""
309
<< message1->GetDescriptor()->full_name()
310
<< "\") is not compatible with this reflection object (which is for type \""
311
<< descriptor_->full_name()
312
<< "\"). Note that the exact same class is required; not just the same "
314
GOOGLE_CHECK_EQ(message2->GetReflection(), this)
315
<< "Second argument to Swap() (of type \""
316
<< message1->GetDescriptor()->full_name()
317
<< "\") is not compatible with this reflection object (which is for type \""
318
<< descriptor_->full_name()
319
<< "\"). Note that the exact same class is required; not just the same "
322
uint32* has_bits1 = MutableHasBits(message1);
323
uint32* has_bits2 = MutableHasBits(message2);
324
int has_bits_size = (descriptor_->field_count() + 31) / 32;
326
for (int i = 0; i < has_bits_size; i++) {
327
swap(has_bits1[i], has_bits2[i]);
330
for (int i = 0; i < descriptor_->field_count(); i++) {
331
const FieldDescriptor* field = descriptor_->field(i);
332
if (field->is_repeated()) {
333
switch (field->cpp_type()) {
334
#define SWAP_ARRAYS(CPPTYPE, TYPE) \
335
case FieldDescriptor::CPPTYPE_##CPPTYPE: \
336
MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap( \
337
MutableRaw<RepeatedField<TYPE> >(message2, field)); \
340
SWAP_ARRAYS(INT32 , int32 );
341
SWAP_ARRAYS(INT64 , int64 );
342
SWAP_ARRAYS(UINT32, uint32);
343
SWAP_ARRAYS(UINT64, uint64);
344
SWAP_ARRAYS(FLOAT , float );
345
SWAP_ARRAYS(DOUBLE, double);
346
SWAP_ARRAYS(BOOL , bool );
347
SWAP_ARRAYS(ENUM , int );
350
case FieldDescriptor::CPPTYPE_STRING:
351
case FieldDescriptor::CPPTYPE_MESSAGE:
352
MutableRaw<RepeatedPtrFieldBase>(message1, field)->Swap(
353
MutableRaw<RepeatedPtrFieldBase>(message2, field));
357
GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
360
switch (field->cpp_type()) {
361
#define SWAP_VALUES(CPPTYPE, TYPE) \
362
case FieldDescriptor::CPPTYPE_##CPPTYPE: \
363
swap(*MutableRaw<TYPE>(message1, field), \
364
*MutableRaw<TYPE>(message2, field)); \
367
SWAP_VALUES(INT32 , int32 );
368
SWAP_VALUES(INT64 , int64 );
369
SWAP_VALUES(UINT32, uint32);
370
SWAP_VALUES(UINT64, uint64);
371
SWAP_VALUES(FLOAT , float );
372
SWAP_VALUES(DOUBLE, double);
373
SWAP_VALUES(BOOL , bool );
374
SWAP_VALUES(ENUM , int );
375
SWAP_VALUES(MESSAGE, Message*);
378
case FieldDescriptor::CPPTYPE_STRING:
379
swap(*MutableRaw<string*>(message1, field),
380
*MutableRaw<string*>(message2, field));
384
GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
389
if (extensions_offset_ != -1) {
390
MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));
393
MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2));
272
396
// -------------------------------------------------------------------
274
398
bool GeneratedMessageReflection::HasField(const Message& message,
286
410
int GeneratedMessageReflection::FieldSize(const Message& message,
287
411
const FieldDescriptor* field) const {
288
USAGE_CHECK_MESSAGE_TYPE(HasField);
289
USAGE_CHECK_REPEATED(HasField);
412
USAGE_CHECK_MESSAGE_TYPE(FieldSize);
413
USAGE_CHECK_REPEATED(FieldSize);
291
415
if (field->is_extension()) {
292
416
return GetExtensionSet(message).ExtensionSize(field->number());
294
return GetRaw<GenericRepeatedField>(message, field).GenericSize();
418
switch (field->cpp_type()) {
419
#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
420
case FieldDescriptor::CPPTYPE_##UPPERCASE : \
421
return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()
423
HANDLE_TYPE( INT32, int32);
424
HANDLE_TYPE( INT64, int64);
425
HANDLE_TYPE(UINT32, uint32);
426
HANDLE_TYPE(UINT64, uint64);
427
HANDLE_TYPE(DOUBLE, double);
428
HANDLE_TYPE( FLOAT, float);
429
HANDLE_TYPE( BOOL, bool);
430
HANDLE_TYPE( ENUM, int);
433
case FieldDescriptor::CPPTYPE_STRING:
434
case FieldDescriptor::CPPTYPE_MESSAGE:
435
return GetRaw<RepeatedPtrFieldBase>(message, field).size();
438
GOOGLE_LOG(FATAL) << "Can't get here.";
349
MutableRaw<GenericRepeatedField>(message, field)->GenericClear();
494
switch (field->cpp_type()) {
495
#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
496
case FieldDescriptor::CPPTYPE_##UPPERCASE : \
497
MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear(); \
500
HANDLE_TYPE( INT32, int32);
501
HANDLE_TYPE( INT64, int64);
502
HANDLE_TYPE(UINT32, uint32);
503
HANDLE_TYPE(UINT64, uint64);
504
HANDLE_TYPE(DOUBLE, double);
505
HANDLE_TYPE( FLOAT, float);
506
HANDLE_TYPE( BOOL, bool);
507
HANDLE_TYPE( ENUM, int);
510
case FieldDescriptor::CPPTYPE_STRING: {
511
MutableRaw<RepeatedPtrField<string> >(message, field)->Clear();
515
case FieldDescriptor::CPPTYPE_MESSAGE: {
516
// We don't know which subclass of RepeatedPtrFieldBase the type is,
517
// so we use RepeatedPtrFieldBase directly.
518
MutableRaw<RepeatedPtrFieldBase>(message, field)
519
->Clear<GenericTypeHandler<Message> >();
526
void GeneratedMessageReflection::RemoveLast(
528
const FieldDescriptor* field) const {
529
USAGE_CHECK_MESSAGE_TYPE(RemoveLast);
530
USAGE_CHECK_REPEATED(RemoveLast);
532
if (field->is_extension()) {
533
MutableExtensionSet(message)->RemoveLast(field->number());
535
switch (field->cpp_type()) {
536
#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
537
case FieldDescriptor::CPPTYPE_##UPPERCASE : \
538
MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast(); \
541
HANDLE_TYPE( INT32, int32);
542
HANDLE_TYPE( INT64, int64);
543
HANDLE_TYPE(UINT32, uint32);
544
HANDLE_TYPE(UINT64, uint64);
545
HANDLE_TYPE(DOUBLE, double);
546
HANDLE_TYPE( FLOAT, float);
547
HANDLE_TYPE( BOOL, bool);
548
HANDLE_TYPE( ENUM, int);
551
case FieldDescriptor::CPPTYPE_STRING:
552
MutableRaw<RepeatedPtrField<string> >(message, field)->RemoveLast();
555
case FieldDescriptor::CPPTYPE_MESSAGE:
556
MutableRaw<RepeatedPtrFieldBase>(message, field)
557
->RemoveLast<GenericTypeHandler<Message> >();
563
void GeneratedMessageReflection::SwapElements(
565
const FieldDescriptor* field,
568
USAGE_CHECK_MESSAGE_TYPE(Swap);
569
USAGE_CHECK_REPEATED(Swap);
571
if (field->is_extension()) {
572
MutableExtensionSet(message)->SwapElements(field->number(), index1, index2);
574
switch (field->cpp_type()) {
575
#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
576
case FieldDescriptor::CPPTYPE_##UPPERCASE : \
577
MutableRaw<RepeatedField<LOWERCASE> >(message, field) \
578
->SwapElements(index1, index2); \
581
HANDLE_TYPE( INT32, int32);
582
HANDLE_TYPE( INT64, int64);
583
HANDLE_TYPE(UINT32, uint32);
584
HANDLE_TYPE(UINT64, uint64);
585
HANDLE_TYPE(DOUBLE, double);
586
HANDLE_TYPE( FLOAT, float);
587
HANDLE_TYPE( BOOL, bool);
588
HANDLE_TYPE( ENUM, int);
591
case FieldDescriptor::CPPTYPE_STRING:
592
case FieldDescriptor::CPPTYPE_MESSAGE:
593
MutableRaw<RepeatedPtrFieldBase>(message, field)
594
->SwapElements(index1, index2);
699
952
USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE);
701
954
if (field->is_extension()) {
702
return MutableExtensionSet(message)->AddMessage(field->number(),
704
field->message_type(),
955
return static_cast<Message*>(
956
MutableExtensionSet(message)->AddMessage(field->number(),
958
field->message_type(),
707
return AddField<Message>(message, field);
961
// We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't
962
// know how to allocate one.
963
RepeatedPtrFieldBase* repeated =
964
MutableRaw<RepeatedPtrFieldBase>(message, field);
965
Message* result = repeated->AddFromCleared<GenericTypeHandler<Message> >();
966
if (result == NULL) {
967
// We must allocate a new object.
968
const Message* prototype;
969
if (repeated->size() == 0) {
970
prototype = message_factory_->GetPrototype(field->message_type());
972
prototype = &repeated->Get<GenericTypeHandler<Message> >(0);
974
result = prototype->New();
975
repeated->AddAllocated<GenericTypeHandler<Message> >(result);
842
1112
template <typename Type>
843
inline const Type& GeneratedMessageReflection::GetRepeatedField(
844
const Message& message, const FieldDescriptor* field, int index) const {
845
return *reinterpret_cast<const Type*>(
846
GetRaw<GenericRepeatedField>(message, field).GenericGet(index));
1113
inline Type GeneratedMessageReflection::GetRepeatedField(
1114
const Message& message, const FieldDescriptor* field, int index) const {
1115
return GetRaw<RepeatedField<Type> >(message, field).Get(index);
1118
template <typename Type>
1119
inline const Type& GeneratedMessageReflection::GetRepeatedPtrField(
1120
const Message& message, const FieldDescriptor* field, int index) const {
1121
return GetRaw<RepeatedPtrField<Type> >(message, field).Get(index);
849
1124
template <typename Type>
850
1125
inline void GeneratedMessageReflection::SetRepeatedField(
851
1126
Message* message, const FieldDescriptor* field,
852
int index, const Type& value) const {
853
GenericRepeatedField* repeated =
854
MutableRaw<GenericRepeatedField>(message, field);
855
*reinterpret_cast<Type*>(repeated->GenericMutable(index)) = value;
1127
int index, Type value) const {
1128
MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value);
858
1131
template <typename Type>
859
1132
inline Type* GeneratedMessageReflection::MutableRepeatedField(
860
1133
Message* message, const FieldDescriptor* field, int index) const {
861
GenericRepeatedField* repeated =
862
MutableRaw<GenericRepeatedField>(message, field);
863
return reinterpret_cast<Type*>(repeated->GenericMutable(index));
1134
RepeatedPtrField<Type>* repeated =
1135
MutableRaw<RepeatedPtrField<Type> >(message, field);
1136
return repeated->Mutable(index);
866
1139
template <typename Type>
867
1140
inline void GeneratedMessageReflection::AddField(
868
Message* message, const FieldDescriptor* field, const Type& value) const {
869
GenericRepeatedField* repeated =
870
MutableRaw<GenericRepeatedField>(message, field);
871
*reinterpret_cast<Type*>(repeated->GenericAdd()) = value;
1141
Message* message, const FieldDescriptor* field, Type value) const {
1142
MutableRaw<RepeatedField<Type> >(message, field)->Add(value);
874
1145
template <typename Type>
875
1146
inline Type* GeneratedMessageReflection::AddField(
876
1147
Message* message, const FieldDescriptor* field) const {
877
GenericRepeatedField* repeated =
878
MutableRaw<GenericRepeatedField>(message, field);
879
return reinterpret_cast<Type*>(repeated->GenericAdd());
1148
RepeatedPtrField<Type>* repeated =
1149
MutableRaw<RepeatedPtrField<Type> >(message, field);
1150
return repeated->Add();
883
1153
} // namespace internal
884
1154
} // namespace protobuf
885
1155
} // namespace google