156
176
// Wrap the contents in a new list so that the caller cannot change
157
177
// the list's contents after setting it.
158
List newList = new ArrayList();
178
final List newList = new ArrayList();
159
179
newList.addAll((List)value);
160
for (Object element : newList) {
161
verifyType(field, element);
180
for (final Object element : newList) {
181
verifyType(descriptor.getLiteType(), element);
165
verifyType(field, value);
168
fields.put(field, value);
171
/** See {@link Message.Builder#clearField(Descriptors.FieldDescriptor)}. */
172
public void clearField(Descriptors.FieldDescriptor field) {
173
fields.remove(field);
176
/** See {@link Message#getRepeatedFieldCount(Descriptors.FieldDescriptor)}. */
177
public int getRepeatedFieldCount(Descriptors.FieldDescriptor field) {
178
if (!field.isRepeated()) {
179
throw new IllegalArgumentException(
180
"getRepeatedFieldCount() can only be called on repeated fields.");
183
return ((List)getField(field)).size();
186
/** See {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)}. */
187
public Object getRepeatedField(Descriptors.FieldDescriptor field, int index) {
188
if (!field.isRepeated()) {
189
throw new IllegalArgumentException(
190
"getRepeatedField() can only be called on repeated fields.");
193
return ((List)getField(field)).get(index);
196
/** See {@link Message.Builder#setRepeatedField(Descriptors.FieldDescriptor,int,Object)}. */
197
@SuppressWarnings("unchecked")
198
public void setRepeatedField(Descriptors.FieldDescriptor field, int index,
200
if (!field.isRepeated()) {
201
throw new IllegalArgumentException(
202
"setRepeatedField() can only be called on repeated fields.");
205
verifyType(field, value);
207
List list = (List)fields.get(field);
209
throw new IndexOutOfBoundsException();
212
list.set(index, value);
215
/** See {@link Message.Builder#addRepeatedField(Descriptors.FieldDescriptor,Object)}. */
216
@SuppressWarnings("unchecked")
217
public void addRepeatedField(Descriptors.FieldDescriptor field,
219
if (!field.isRepeated()) {
220
throw new IllegalArgumentException(
221
"setRepeatedField() can only be called on repeated fields.");
224
verifyType(field, value);
226
List list = (List)fields.get(field);
185
verifyType(descriptor.getLiteType(), value);
188
fields.put(descriptor, value);
192
* Useful for implementing
193
* {@link Message.Builder#clearField(Descriptors.FieldDescriptor)}.
195
public void clearField(final FieldDescriptorType descriptor) {
196
fields.remove(descriptor);
200
* Useful for implementing
201
* {@link Message#getRepeatedFieldCount(Descriptors.FieldDescriptor)}.
203
public int getRepeatedFieldCount(final FieldDescriptorType descriptor) {
204
if (!descriptor.isRepeated()) {
205
throw new IllegalArgumentException(
206
"getRepeatedField() can only be called on repeated fields.");
209
final Object value = fields.get(descriptor);
213
return ((List) value).size();
218
* Useful for implementing
219
* {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)}.
221
public Object getRepeatedField(final FieldDescriptorType descriptor,
223
if (!descriptor.isRepeated()) {
224
throw new IllegalArgumentException(
225
"getRepeatedField() can only be called on repeated fields.");
228
final Object value = fields.get(descriptor);
231
throw new IndexOutOfBoundsException();
233
return ((List) value).get(index);
238
* Useful for implementing
239
* {@link Message.Builder#setRepeatedField(Descriptors.FieldDescriptor,int,Object)}.
241
@SuppressWarnings("unchecked")
242
public void setRepeatedField(final FieldDescriptorType descriptor,
244
final Object value) {
245
if (!descriptor.isRepeated()) {
246
throw new IllegalArgumentException(
247
"getRepeatedField() can only be called on repeated fields.");
250
final Object list = fields.get(descriptor);
252
throw new IndexOutOfBoundsException();
255
verifyType(descriptor.getLiteType(), value);
256
((List) list).set(index, value);
260
* Useful for implementing
261
* {@link Message.Builder#addRepeatedField(Descriptors.FieldDescriptor,Object)}.
263
@SuppressWarnings("unchecked")
264
public void addRepeatedField(final FieldDescriptorType descriptor,
265
final Object value) {
266
if (!descriptor.isRepeated()) {
267
throw new IllegalArgumentException(
268
"addRepeatedField() can only be called on repeated fields.");
271
verifyType(descriptor.getLiteType(), value);
273
final Object existingValue = fields.get(descriptor);
275
if (existingValue == null) {
228
276
list = new ArrayList();
229
fields.put(field, list);
277
fields.put(descriptor, list);
279
list = (List) existingValue;
365
379
* Like {@link #mergeFrom(Message)}, but merges from another {@link FieldSet}.
367
381
@SuppressWarnings("unchecked")
368
public void mergeFrom(FieldSet other) {
369
for (Map.Entry<FieldDescriptor, Object> entry : other.fields.entrySet()) {
370
FieldDescriptor field = entry.getKey();
371
Object value = entry.getValue();
373
if (field.isRepeated()) {
374
List existingValue = (List)fields.get(field);
375
if (existingValue == null) {
376
existingValue = new ArrayList();
377
fields.put(field, existingValue);
379
existingValue.addAll((List)value);
380
} else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
381
Message existingValue = (Message)fields.get(field);
382
if (existingValue == null) {
383
setField(field, value);
386
existingValue.toBuilder()
387
.mergeFrom((Message)value)
391
setField(field, value);
396
// TODO(kenton): Move parsing code into AbstractMessage, since it no longer
397
// uses any special knowledge from FieldSet.
400
* See {@link Message.Builder#mergeFrom(CodedInputStream)}.
401
* @param builder The {@code Builder} for the target message.
403
public static void mergeFrom(CodedInputStream input,
404
UnknownFieldSet.Builder unknownFields,
405
ExtensionRegistry extensionRegistry,
406
Message.Builder builder)
407
throws java.io.IOException {
409
int tag = input.readTag();
414
if (!mergeFieldFrom(input, unknownFields, extensionRegistry,
423
* Like {@link #mergeFrom(CodedInputStream, UnknownFieldSet.Builder,
424
* ExtensionRegistry, Message.Builder)}, but parses a single field.
425
* @param tag The tag, which should have already been read.
426
* @return {@code true} unless the tag is an end-group tag.
428
@SuppressWarnings("unchecked")
429
public static boolean mergeFieldFrom(
430
CodedInputStream input,
431
UnknownFieldSet.Builder unknownFields,
432
ExtensionRegistry extensionRegistry,
433
Message.Builder builder,
434
int tag) throws java.io.IOException {
435
Descriptor type = builder.getDescriptorForType();
437
if (type.getOptions().getMessageSetWireFormat() &&
438
tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
439
mergeMessageSetExtensionFromCodedStream(
440
input, unknownFields, extensionRegistry, builder);
444
int wireType = WireFormat.getTagWireType(tag);
445
int fieldNumber = WireFormat.getTagFieldNumber(tag);
447
FieldDescriptor field;
448
Message defaultInstance = null;
450
if (type.isExtensionNumber(fieldNumber)) {
451
ExtensionRegistry.ExtensionInfo extension =
452
extensionRegistry.findExtensionByNumber(type, fieldNumber);
453
if (extension == null) {
456
field = extension.descriptor;
457
defaultInstance = extension.defaultInstance;
460
field = type.findFieldByNumber(fieldNumber);
464
wireType != WireFormat.getWireFormatForField(field)) {
465
// Unknown field or wrong wire type. Skip.
466
return unknownFields.mergeFieldFrom(tag, input);
468
if (field.getOptions().getPacked()) {
469
int length = input.readRawVarint32();
470
int limit = input.pushLimit(length);
471
if (field.getType() == FieldDescriptor.Type.ENUM) {
472
while (input.getBytesUntilLimit() > 0) {
473
int rawValue = input.readEnum();
474
Object value = field.getEnumType().findValueByNumber(rawValue);
476
// If the number isn't recognized as a valid value for this
477
// enum, drop it (don't even add it to unknownFields).
480
builder.addRepeatedField(field, value);
483
while (input.getBytesUntilLimit() > 0) {
484
Object value = input.readPrimitiveField(field.getType());
485
builder.addRepeatedField(field, value);
488
input.popLimit(limit);
491
switch (field.getType()) {
493
Message.Builder subBuilder;
494
if (defaultInstance != null) {
495
subBuilder = defaultInstance.newBuilderForType();
497
subBuilder = builder.newBuilderForField(field);
499
if (!field.isRepeated()) {
500
subBuilder.mergeFrom((Message) builder.getField(field));
502
input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
503
value = subBuilder.build();
507
Message.Builder subBuilder;
508
if (defaultInstance != null) {
509
subBuilder = defaultInstance.newBuilderForType();
511
subBuilder = builder.newBuilderForField(field);
513
if (!field.isRepeated()) {
514
subBuilder.mergeFrom((Message) builder.getField(field));
516
input.readMessage(subBuilder, extensionRegistry);
517
value = subBuilder.build();
521
int rawValue = input.readEnum();
522
value = field.getEnumType().findValueByNumber(rawValue);
523
// If the number isn't recognized as a valid value for this enum,
526
unknownFields.mergeVarintField(fieldNumber, rawValue);
532
value = input.readPrimitiveField(field.getType());
536
if (field.isRepeated()) {
537
builder.addRepeatedField(field, value);
539
builder.setField(field, value);
547
/** Called by {@code #mergeFieldFrom()} to parse a MessageSet extension. */
548
private static void mergeMessageSetExtensionFromCodedStream(
549
CodedInputStream input,
550
UnknownFieldSet.Builder unknownFields,
551
ExtensionRegistry extensionRegistry,
552
Message.Builder builder) throws java.io.IOException {
553
Descriptor type = builder.getDescriptorForType();
555
// The wire format for MessageSet is:
556
// message MessageSet {
557
// repeated group Item = 1 {
558
// required int32 typeId = 2;
559
// required bytes message = 3;
562
// "typeId" is the extension's field number. The extension can only be
563
// a message type, where "message" contains the encoded bytes of that
566
// In practice, we will probably never see a MessageSet item in which
567
// the message appears before the type ID, or where either field does not
568
// appear exactly once. However, in theory such cases are valid, so we
569
// should be prepared to accept them.
572
ByteString rawBytes = null; // If we encounter "message" before "typeId"
573
Message.Builder subBuilder = null;
574
FieldDescriptor field = null;
577
int tag = input.readTag();
582
if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
583
typeId = input.readUInt32();
584
// Zero is not a valid type ID.
586
ExtensionRegistry.ExtensionInfo extension =
587
extensionRegistry.findExtensionByNumber(type, typeId);
588
if (extension != null) {
589
field = extension.descriptor;
590
subBuilder = extension.defaultInstance.newBuilderForType();
591
Message originalMessage = (Message)builder.getField(field);
592
if (originalMessage != null) {
593
subBuilder.mergeFrom(originalMessage);
595
if (rawBytes != null) {
596
// We already encountered the message. Parse it now.
597
subBuilder.mergeFrom(
598
CodedInputStream.newInstance(rawBytes.newInput()));
602
// Unknown extension number. If we already saw data, put it
604
if (rawBytes != null) {
605
unknownFields.mergeField(typeId,
606
UnknownFieldSet.Field.newBuilder()
607
.addLengthDelimited(rawBytes)
613
} else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
615
// We haven't seen a type ID yet, so we have to store the raw bytes
617
rawBytes = input.readBytes();
618
} else if (subBuilder == null) {
619
// We don't know how to parse this. Ignore it.
620
unknownFields.mergeField(typeId,
621
UnknownFieldSet.Field.newBuilder()
622
.addLengthDelimited(input.readBytes())
625
// We already know the type, so we can parse directly from the input
626
// with no copying. Hooray!
627
input.readMessage(subBuilder, extensionRegistry);
630
// Unknown tag. Skip it.
631
if (!input.skipField(tag)) {
632
break; // end of group
637
input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);
639
if (subBuilder != null) {
640
builder.setField(field, subBuilder.build());
382
public void mergeFrom(final FieldSet<FieldDescriptorType> other) {
383
for (final Map.Entry<FieldDescriptorType, Object> entry:
384
other.fields.entrySet()) {
385
final FieldDescriptorType descriptor = entry.getKey();
386
final Object otherValue = entry.getValue();
388
if (descriptor.isRepeated()) {
389
Object value = fields.get(descriptor);
391
// Our list is empty, but we still need to make a defensive copy of
392
// the other list since we don't know if the other FieldSet is still
394
fields.put(descriptor, new ArrayList((List) otherValue));
396
// Concatenate the lists.
397
((List) value).addAll((List) otherValue);
399
} else if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) {
400
Object value = fields.get(descriptor);
402
fields.put(descriptor, otherValue);
404
// Merge the messages.
405
fields.put(descriptor,
406
descriptor.internalMergeFrom(
407
((MessageLite) value).toBuilder(), (MessageLite) otherValue)
412
fields.put(descriptor, otherValue);
417
// TODO(kenton): Move static parsing and serialization methods into some
418
// other class. Probably WireFormat.
421
* Read a field of any primitive type from a CodedInputStream. Enums,
422
* groups, and embedded messages are not handled by this method.
424
* @param input The stream from which to read.
425
* @param type Declared type of the field.
426
* @return An object representing the field's value, of the exact
427
* type which would be returned by
428
* {@link Message#getField(Descriptors.FieldDescriptor)} for
431
public static Object readPrimitiveField(
432
CodedInputStream input,
433
final WireFormat.FieldType type) throws IOException {
435
case DOUBLE : return input.readDouble ();
436
case FLOAT : return input.readFloat ();
437
case INT64 : return input.readInt64 ();
438
case UINT64 : return input.readUInt64 ();
439
case INT32 : return input.readInt32 ();
440
case FIXED64 : return input.readFixed64 ();
441
case FIXED32 : return input.readFixed32 ();
442
case BOOL : return input.readBool ();
443
case STRING : return input.readString ();
444
case BYTES : return input.readBytes ();
445
case UINT32 : return input.readUInt32 ();
446
case SFIXED32: return input.readSFixed32();
447
case SFIXED64: return input.readSFixed64();
448
case SINT32 : return input.readSInt32 ();
449
case SINT64 : return input.readSInt64 ();
452
throw new IllegalArgumentException(
453
"readPrimitiveField() cannot handle nested groups.");
455
throw new IllegalArgumentException(
456
"readPrimitiveField() cannot handle embedded messages.");
458
// We don't handle enums because we don't know what to do if the
459
// value is not recognized.
460
throw new IllegalArgumentException(
461
"readPrimitiveField() cannot handle enums.");
464
throw new RuntimeException(
465
"There is no way to get here, but the compiler thinks otherwise.");
644
468
/** See {@link Message#writeTo(CodedOutputStream)}. */
645
public void writeTo(CodedOutputStream output)
646
throws java.io.IOException {
647
for (Map.Entry<FieldDescriptor, Object> entry : fields.entrySet()) {
469
public void writeTo(final CodedOutputStream output)
471
for (final Map.Entry<FieldDescriptorType, Object> entry:
648
473
writeField(entry.getKey(), entry.getValue(), output);
478
* Like {@link #writeTo} but uses MessageSet wire format.
480
public void writeMessageSetTo(final CodedOutputStream output)
482
for (final Map.Entry<FieldDescriptorType, Object> entry:
484
final FieldDescriptorType descriptor = entry.getKey();
485
if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE &&
486
!descriptor.isRepeated() && !descriptor.isPacked()) {
487
output.writeMessageSetExtension(entry.getKey().getNumber(),
488
(MessageLite) entry.getValue());
490
writeField(descriptor, entry.getValue(), output);
496
* Write a single tag-value pair to the stream.
498
* @param output The output stream.
499
* @param type The field's type.
500
* @param number The field's number.
501
* @param value Object representing the field's value. Must be of the exact
502
* type which would be returned by
503
* {@link Message#getField(Descriptors.FieldDescriptor)} for
506
private static void writeElement(final CodedOutputStream output,
507
final WireFormat.FieldType type,
509
final Object value) throws IOException {
510
// Special case for groups, which need a start and end tag; other fields
511
// can just use writeTag() and writeFieldNoTag().
512
if (type == WireFormat.FieldType.GROUP) {
513
output.writeGroup(number, (MessageLite) value);
515
output.writeTag(number, getWireFormatForFieldType(type, false));
516
writeElementNoTag(output, type, value);
521
* Write a field of arbitrary type, without its tag, to the stream.
523
* @param output The output stream.
524
* @param type The field's type.
525
* @param value Object representing the field's value. Must be of the exact
526
* type which would be returned by
527
* {@link Message#getField(Descriptors.FieldDescriptor)} for
530
private static void writeElementNoTag(
531
final CodedOutputStream output,
532
final WireFormat.FieldType type,
533
final Object value) throws IOException {
535
case DOUBLE : output.writeDoubleNoTag ((Double ) value); break;
536
case FLOAT : output.writeFloatNoTag ((Float ) value); break;
537
case INT64 : output.writeInt64NoTag ((Long ) value); break;
538
case UINT64 : output.writeUInt64NoTag ((Long ) value); break;
539
case INT32 : output.writeInt32NoTag ((Integer ) value); break;
540
case FIXED64 : output.writeFixed64NoTag ((Long ) value); break;
541
case FIXED32 : output.writeFixed32NoTag ((Integer ) value); break;
542
case BOOL : output.writeBoolNoTag ((Boolean ) value); break;
543
case STRING : output.writeStringNoTag ((String ) value); break;
544
case GROUP : output.writeGroupNoTag ((MessageLite) value); break;
545
case MESSAGE : output.writeMessageNoTag ((MessageLite) value); break;
546
case BYTES : output.writeBytesNoTag ((ByteString ) value); break;
547
case UINT32 : output.writeUInt32NoTag ((Integer ) value); break;
548
case SFIXED32: output.writeSFixed32NoTag((Integer ) value); break;
549
case SFIXED64: output.writeSFixed64NoTag((Long ) value); break;
550
case SINT32 : output.writeSInt32NoTag ((Integer ) value); break;
551
case SINT64 : output.writeSInt64NoTag ((Long ) value); break;
554
output.writeEnumNoTag(((Internal.EnumLite) value).getNumber());
652
559
/** Write a single field. */
653
public void writeField(FieldDescriptor field, Object value,
654
CodedOutputStream output) throws java.io.IOException {
655
if (field.isExtension() &&
656
field.getContainingType().getOptions().getMessageSetWireFormat()) {
657
output.writeMessageSetExtension(field.getNumber(), (Message)value);
659
if (field.isRepeated()) {
660
List valueList = (List)value;
661
if (field.getOptions().getPacked()) {
662
output.writeTag(field.getNumber(),
663
WireFormat.WIRETYPE_LENGTH_DELIMITED);
664
// Compute the total data size so the length can be written.
666
for (Object element : valueList) {
667
dataSize += output.computeFieldSizeNoTag(field.getType(), element);
669
output.writeRawVarint32(dataSize);
670
// Write the data itself, without any tags.
671
for (Object element : valueList) {
672
output.writeFieldNoTag(field.getType(), element);
675
for (Object element : valueList) {
676
output.writeField(field.getType(), field.getNumber(), element);
560
public static void writeField(final FieldDescriptorLite<?> descriptor,
562
final CodedOutputStream output)
564
WireFormat.FieldType type = descriptor.getLiteType();
565
int number = descriptor.getNumber();
566
if (descriptor.isRepeated()) {
567
final List valueList = (List)value;
568
if (descriptor.isPacked()) {
569
output.writeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED);
570
// Compute the total data size so the length can be written.
572
for (final Object element : valueList) {
573
dataSize += computeElementSizeNoTag(type, element);
575
output.writeRawVarint32(dataSize);
576
// Write the data itself, without any tags.
577
for (final Object element : valueList) {
578
writeElementNoTag(output, type, element);
680
output.writeField(field.getType(), field.getNumber(), value);
581
for (final Object element : valueList) {
582
writeElement(output, type, number, element);
586
writeElement(output, type, number, value);
689
594
public int getSerializedSize() {
691
for (Map.Entry<FieldDescriptor, Object> entry : fields.entrySet()) {
692
FieldDescriptor field = entry.getKey();
693
Object value = entry.getValue();
596
for (final Map.Entry<FieldDescriptorType, Object> entry:
598
size += computeFieldSize(entry.getKey(), entry.getValue());
695
if (field.isExtension() &&
696
field.getContainingType().getOptions().getMessageSetWireFormat()) {
604
* Like {@link #getSerializedSize} but uses MessageSet wire format.
606
public int getMessageSetSerializedSize() {
608
for (final Map.Entry<FieldDescriptorType, Object> entry:
610
final FieldDescriptorType descriptor = entry.getKey();
611
if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE &&
612
!descriptor.isRepeated() && !descriptor.isPacked()) {
697
613
size += CodedOutputStream.computeMessageSetExtensionSize(
698
field.getNumber(), (Message) value);
614
entry.getKey().getNumber(), (MessageLite) entry.getValue());
700
if (field.isRepeated()) {
701
if (field.getOptions().getPacked()) {
703
for (Object element : (List)value) {
704
dataSize += CodedOutputStream.computeFieldSizeNoTag(
705
field.getType(), element);
708
CodedOutputStream.computeTagSize(field.getNumber()) +
709
CodedOutputStream.computeRawVarint32Size(dataSize);
711
for (Object element : (List)value) {
712
size += CodedOutputStream.computeFieldSize(
713
field.getType(), field.getNumber(), element);
717
size += CodedOutputStream.computeFieldSize(
718
field.getType(), field.getNumber(), value);
616
size += computeFieldSize(descriptor, entry.getValue());
623
* Compute the number of bytes that would be needed to encode a
624
* single tag/value pair of arbitrary type.
626
* @param type The field's type.
627
* @param number The field's number.
628
* @param value Object representing the field's value. Must be of the exact
629
* type which would be returned by
630
* {@link Message#getField(Descriptors.FieldDescriptor)} for
633
private static int computeElementSize(
634
final WireFormat.FieldType type,
635
final int number, final Object value) {
636
int tagSize = CodedOutputStream.computeTagSize(number);
637
if (type == WireFormat.FieldType.GROUP) {
640
return tagSize + computeElementSizeNoTag(type, value);
644
* Compute the number of bytes that would be needed to encode a
645
* particular value of arbitrary type, excluding tag.
647
* @param type The field's type.
648
* @param value Object representing the field's value. Must be of the exact
649
* type which would be returned by
650
* {@link Message#getField(Descriptors.FieldDescriptor)} for
653
private static int computeElementSizeNoTag(
654
final WireFormat.FieldType type, final Object value) {
656
// Note: Minor violation of 80-char limit rule here because this would
657
// actually be harder to read if we wrapped the lines.
658
case DOUBLE : return CodedOutputStream.computeDoubleSizeNoTag ((Double )value);
659
case FLOAT : return CodedOutputStream.computeFloatSizeNoTag ((Float )value);
660
case INT64 : return CodedOutputStream.computeInt64SizeNoTag ((Long )value);
661
case UINT64 : return CodedOutputStream.computeUInt64SizeNoTag ((Long )value);
662
case INT32 : return CodedOutputStream.computeInt32SizeNoTag ((Integer )value);
663
case FIXED64 : return CodedOutputStream.computeFixed64SizeNoTag ((Long )value);
664
case FIXED32 : return CodedOutputStream.computeFixed32SizeNoTag ((Integer )value);
665
case BOOL : return CodedOutputStream.computeBoolSizeNoTag ((Boolean )value);
666
case STRING : return CodedOutputStream.computeStringSizeNoTag ((String )value);
667
case GROUP : return CodedOutputStream.computeGroupSizeNoTag ((MessageLite)value);
668
case MESSAGE : return CodedOutputStream.computeMessageSizeNoTag ((MessageLite)value);
669
case BYTES : return CodedOutputStream.computeBytesSizeNoTag ((ByteString )value);
670
case UINT32 : return CodedOutputStream.computeUInt32SizeNoTag ((Integer )value);
671
case SFIXED32: return CodedOutputStream.computeSFixed32SizeNoTag((Integer )value);
672
case SFIXED64: return CodedOutputStream.computeSFixed64SizeNoTag((Long )value);
673
case SINT32 : return CodedOutputStream.computeSInt32SizeNoTag ((Integer )value);
674
case SINT64 : return CodedOutputStream.computeSInt64SizeNoTag ((Long )value);
677
return CodedOutputStream.computeEnumSizeNoTag(
678
((Internal.EnumLite) value).getNumber());
681
throw new RuntimeException(
682
"There is no way to get here, but the compiler thinks otherwise.");
686
* Compute the number of bytes needed to encode a particular field.
688
public static int computeFieldSize(final FieldDescriptorLite<?> descriptor,
689
final Object value) {
690
WireFormat.FieldType type = descriptor.getLiteType();
691
int number = descriptor.getNumber();
692
if (descriptor.isRepeated()) {
693
if (descriptor.isPacked()) {
695
for (final Object element : (List)value) {
696
dataSize += computeElementSizeNoTag(type, element);
699
CodedOutputStream.computeTagSize(number) +
700
CodedOutputStream.computeRawVarint32Size(dataSize);
703
for (final Object element : (List)value) {
704
size += computeElementSize(type, number, element);
709
return computeElementSize(type, number, value);