|
@@ -41,32 +41,35 @@ import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
- * A class which represents an arbitrary set of fields of some message type.
|
|
|
- * This is used to implement {@link DynamicMessage}, and also to represent
|
|
|
- * extensions in {@link GeneratedMessage}. This class is package-private,
|
|
|
- * since outside users should probably be using {@link DynamicMessage}.
|
|
|
+ * A class which represents an arbitrary set of fields of some message type. This is used to
|
|
|
+ * implement {@link DynamicMessage}, and also to represent extensions in {@link GeneratedMessage}.
|
|
|
+ * This class is package-private, since outside users should probably be using {@link
|
|
|
+ * DynamicMessage}.
|
|
|
*
|
|
|
* @author kenton@google.com Kenton Varda
|
|
|
*/
|
|
|
-final class FieldSet<FieldDescriptorType extends
|
|
|
- FieldSet.FieldDescriptorLite<FieldDescriptorType>> {
|
|
|
+final class FieldSet<
|
|
|
+ FieldDescriptorType extends FieldSet.FieldDescriptorLite<FieldDescriptorType>> {
|
|
|
/**
|
|
|
- * Interface for a FieldDescriptor or lite extension descriptor. This
|
|
|
- * prevents FieldSet from depending on {@link Descriptors.FieldDescriptor}.
|
|
|
+ * Interface for a FieldDescriptor or lite extension descriptor. This prevents FieldSet from
|
|
|
+ * depending on {@link Descriptors.FieldDescriptor}.
|
|
|
*/
|
|
|
- public interface FieldDescriptorLite<T extends FieldDescriptorLite<T>>
|
|
|
- extends Comparable<T> {
|
|
|
+ public interface FieldDescriptorLite<T extends FieldDescriptorLite<T>> extends Comparable<T> {
|
|
|
int getNumber();
|
|
|
+
|
|
|
WireFormat.FieldType getLiteType();
|
|
|
+
|
|
|
WireFormat.JavaType getLiteJavaType();
|
|
|
+
|
|
|
boolean isRepeated();
|
|
|
+
|
|
|
boolean isPacked();
|
|
|
+
|
|
|
Internal.EnumLiteMap<?> getEnumType();
|
|
|
|
|
|
// If getLiteJavaType() == MESSAGE, this merges a message object of the
|
|
|
// type into a builder of the type. Returns {@code to}.
|
|
|
- MessageLite.Builder internalMergeFrom(
|
|
|
- MessageLite.Builder to, MessageLite from);
|
|
|
+ MessageLite.Builder internalMergeFrom(MessageLite.Builder to, MessageLite from);
|
|
|
}
|
|
|
|
|
|
private final SmallSortedMap<FieldDescriptorType, Object> fields;
|
|
@@ -78,27 +81,23 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
this.fields = SmallSortedMap.newFieldMap(16);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Construct an empty FieldSet. This is only used to initialize
|
|
|
- * DEFAULT_INSTANCE.
|
|
|
- */
|
|
|
+ /** Construct an empty FieldSet. This is only used to initialize DEFAULT_INSTANCE. */
|
|
|
private FieldSet(final boolean dummy) {
|
|
|
this.fields = SmallSortedMap.newFieldMap(0);
|
|
|
makeImmutable();
|
|
|
}
|
|
|
|
|
|
/** Construct a new FieldSet. */
|
|
|
- public static <T extends FieldSet.FieldDescriptorLite<T>>
|
|
|
- FieldSet<T> newFieldSet() {
|
|
|
+ public static <T extends FieldSet.FieldDescriptorLite<T>> FieldSet<T> newFieldSet() {
|
|
|
return new FieldSet<T>();
|
|
|
}
|
|
|
|
|
|
/** Get an immutable empty FieldSet. */
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- public static <T extends FieldSet.FieldDescriptorLite<T>>
|
|
|
- FieldSet<T> emptySet() {
|
|
|
+ public static <T extends FieldSet.FieldDescriptorLite<T>> FieldSet<T> emptySet() {
|
|
|
return DEFAULT_INSTANCE;
|
|
|
}
|
|
|
+
|
|
|
@SuppressWarnings("rawtypes")
|
|
|
private static final FieldSet DEFAULT_INSTANCE = new FieldSet(true);
|
|
|
|
|
@@ -118,8 +117,8 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Returns whether the FieldSet is immutable. This is true if it is the
|
|
|
- * {@link #emptySet} or if {@link #makeImmutable} were called.
|
|
|
+ * Returns whether the FieldSet is immutable. This is true if it is the {@link #emptySet} or if
|
|
|
+ * {@link #makeImmutable} were called.
|
|
|
*
|
|
|
* @return whether the FieldSet is immutable.
|
|
|
*/
|
|
@@ -147,8 +146,8 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Clones the FieldSet. The returned FieldSet will be mutable even if the
|
|
|
- * original FieldSet was immutable.
|
|
|
+ * Clones the FieldSet. The returned FieldSet will be mutable even if the original FieldSet was
|
|
|
+ * immutable.
|
|
|
*
|
|
|
* @return the newly cloned FieldSet
|
|
|
*/
|
|
@@ -162,8 +161,7 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
FieldDescriptorType descriptor = entry.getKey();
|
|
|
clone.setField(descriptor, entry.getValue());
|
|
|
}
|
|
|
- for (Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- fields.getOverflowEntries()) {
|
|
|
+ for (Map.Entry<FieldDescriptorType, Object> entry : fields.getOverflowEntries()) {
|
|
|
FieldDescriptorType descriptor = entry.getKey();
|
|
|
clone.setField(descriptor, entry.getValue());
|
|
|
}
|
|
@@ -180,18 +178,14 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
hasLazyField = false;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Get a simple map containing all the fields.
|
|
|
- */
|
|
|
+ /** Get a simple map containing all the fields. */
|
|
|
public Map<FieldDescriptorType, Object> getAllFields() {
|
|
|
if (hasLazyField) {
|
|
|
- SmallSortedMap<FieldDescriptorType, Object> result =
|
|
|
- SmallSortedMap.newFieldMap(16);
|
|
|
+ SmallSortedMap<FieldDescriptorType, Object> result = SmallSortedMap.newFieldMap(16);
|
|
|
for (int i = 0; i < fields.getNumArrayEntries(); i++) {
|
|
|
cloneFieldEntry(result, fields.getArrayEntryAt(i));
|
|
|
}
|
|
|
- for (Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- fields.getOverflowEntries()) {
|
|
|
+ for (Map.Entry<FieldDescriptorType, Object> entry : fields.getOverflowEntries()) {
|
|
|
cloneFieldEntry(result, entry);
|
|
|
}
|
|
|
if (fields.isImmutable()) {
|
|
@@ -202,8 +196,8 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
return fields.isImmutable() ? fields : Collections.unmodifiableMap(fields);
|
|
|
}
|
|
|
|
|
|
- private void cloneFieldEntry(Map<FieldDescriptorType, Object> map,
|
|
|
- Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
+ private void cloneFieldEntry(
|
|
|
+ Map<FieldDescriptorType, Object> map, Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
FieldDescriptorType key = entry.getKey();
|
|
|
Object value = entry.getValue();
|
|
|
if (value instanceof LazyField) {
|
|
@@ -214,37 +208,30 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Get an iterator to the field map. This iterator should not be leaked out
|
|
|
- * of the protobuf library as it is not protected from mutation when fields
|
|
|
- * is not immutable.
|
|
|
+ * Get an iterator to the field map. This iterator should not be leaked out of the protobuf
|
|
|
+ * library as it is not protected from mutation when fields is not immutable.
|
|
|
*/
|
|
|
public Iterator<Map.Entry<FieldDescriptorType, Object>> iterator() {
|
|
|
if (hasLazyField) {
|
|
|
- return new LazyIterator<FieldDescriptorType>(
|
|
|
- fields.entrySet().iterator());
|
|
|
+ return new LazyIterator<FieldDescriptorType>(fields.entrySet().iterator());
|
|
|
}
|
|
|
return fields.entrySet().iterator();
|
|
|
}
|
|
|
|
|
|
|
|
|
- /**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message#hasField(Descriptors.FieldDescriptor)}.
|
|
|
- */
|
|
|
+ /** Useful for implementing {@link Message#hasField(Descriptors.FieldDescriptor)}. */
|
|
|
public boolean hasField(final FieldDescriptorType descriptor) {
|
|
|
if (descriptor.isRepeated()) {
|
|
|
- throw new IllegalArgumentException(
|
|
|
- "hasField() can only be called on non-repeated fields.");
|
|
|
+ throw new IllegalArgumentException("hasField() can only be called on non-repeated fields.");
|
|
|
}
|
|
|
|
|
|
return fields.get(descriptor) != null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message#getField(Descriptors.FieldDescriptor)}. This method
|
|
|
- * returns {@code null} if the field is not set; in this case it is up
|
|
|
- * to the caller to fetch the field's default value.
|
|
|
+ * Useful for implementing {@link Message#getField(Descriptors.FieldDescriptor)}. This method
|
|
|
+ * returns {@code null} if the field is not set; in this case it is up to the caller to fetch the
|
|
|
+ * field's default value.
|
|
|
*/
|
|
|
public Object getField(final FieldDescriptorType descriptor) {
|
|
|
Object o = fields.get(descriptor);
|
|
@@ -255,16 +242,14 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message.Builder#setField(Descriptors.FieldDescriptor,Object)}.
|
|
|
+ * Useful for implementing {@link Message.Builder#setField(Descriptors.FieldDescriptor,Object)}.
|
|
|
*/
|
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
- public void setField(final FieldDescriptorType descriptor,
|
|
|
- Object value) {
|
|
|
+ public void setField(final FieldDescriptorType descriptor, Object value) {
|
|
|
if (descriptor.isRepeated()) {
|
|
|
if (!(value instanceof List)) {
|
|
|
throw new IllegalArgumentException(
|
|
|
- "Wrong object type used with protocol message reflection.");
|
|
|
+ "Wrong object type used with protocol message reflection.");
|
|
|
}
|
|
|
|
|
|
// Wrap the contents in a new list so that the caller cannot change
|
|
@@ -285,10 +270,7 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
fields.put(descriptor, value);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message.Builder#clearField(Descriptors.FieldDescriptor)}.
|
|
|
- */
|
|
|
+ /** Useful for implementing {@link Message.Builder#clearField(Descriptors.FieldDescriptor)}. */
|
|
|
public void clearField(final FieldDescriptorType descriptor) {
|
|
|
fields.remove(descriptor);
|
|
|
if (fields.isEmpty()) {
|
|
@@ -296,14 +278,11 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message#getRepeatedFieldCount(Descriptors.FieldDescriptor)}.
|
|
|
- */
|
|
|
+ /** Useful for implementing {@link Message#getRepeatedFieldCount(Descriptors.FieldDescriptor)}. */
|
|
|
public int getRepeatedFieldCount(final FieldDescriptorType descriptor) {
|
|
|
if (!descriptor.isRepeated()) {
|
|
|
throw new IllegalArgumentException(
|
|
|
- "getRepeatedField() can only be called on repeated fields.");
|
|
|
+ "getRepeatedField() can only be called on repeated fields.");
|
|
|
}
|
|
|
|
|
|
final Object value = getField(descriptor);
|
|
@@ -314,15 +293,11 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)}.
|
|
|
- */
|
|
|
- public Object getRepeatedField(final FieldDescriptorType descriptor,
|
|
|
- final int index) {
|
|
|
+ /** Useful for implementing {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)}. */
|
|
|
+ public Object getRepeatedField(final FieldDescriptorType descriptor, final int index) {
|
|
|
if (!descriptor.isRepeated()) {
|
|
|
throw new IllegalArgumentException(
|
|
|
- "getRepeatedField() can only be called on repeated fields.");
|
|
|
+ "getRepeatedField() can only be called on repeated fields.");
|
|
|
}
|
|
|
|
|
|
final Object value = getField(descriptor);
|
|
@@ -335,16 +310,15 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message.Builder#setRepeatedField(Descriptors.FieldDescriptor,int,Object)}.
|
|
|
+ * Useful for implementing {@link
|
|
|
+ * Message.Builder#setRepeatedField(Descriptors.FieldDescriptor,int,Object)}.
|
|
|
*/
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- public void setRepeatedField(final FieldDescriptorType descriptor,
|
|
|
- final int index,
|
|
|
- final Object value) {
|
|
|
+ public void setRepeatedField(
|
|
|
+ final FieldDescriptorType descriptor, final int index, final Object value) {
|
|
|
if (!descriptor.isRepeated()) {
|
|
|
throw new IllegalArgumentException(
|
|
|
- "getRepeatedField() can only be called on repeated fields.");
|
|
|
+ "getRepeatedField() can only be called on repeated fields.");
|
|
|
}
|
|
|
|
|
|
final Object list = getField(descriptor);
|
|
@@ -357,15 +331,14 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Useful for implementing
|
|
|
- * {@link Message.Builder#addRepeatedField(Descriptors.FieldDescriptor,Object)}.
|
|
|
+ * Useful for implementing {@link
|
|
|
+ * Message.Builder#addRepeatedField(Descriptors.FieldDescriptor,Object)}.
|
|
|
*/
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- public void addRepeatedField(final FieldDescriptorType descriptor,
|
|
|
- final Object value) {
|
|
|
+ public void addRepeatedField(final FieldDescriptorType descriptor, final Object value) {
|
|
|
if (!descriptor.isRepeated()) {
|
|
|
throw new IllegalArgumentException(
|
|
|
- "addRepeatedField() can only be called on repeated fields.");
|
|
|
+ "addRepeatedField() can only be called on repeated fields.");
|
|
|
}
|
|
|
|
|
|
verifyType(descriptor.getLiteType(), value);
|
|
@@ -383,36 +356,45 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Verifies that the given object is of the correct type to be a valid
|
|
|
- * value for the given field. (For repeated fields, this checks if the
|
|
|
- * object is the right type to be one element of the field.)
|
|
|
+ * Verifies that the given object is of the correct type to be a valid value for the given field.
|
|
|
+ * (For repeated fields, this checks if the object is the right type to be one element of the
|
|
|
+ * field.)
|
|
|
*
|
|
|
* @throws IllegalArgumentException The value is not of the right type.
|
|
|
*/
|
|
|
- private static void verifyType(final WireFormat.FieldType type,
|
|
|
- final Object value) {
|
|
|
+ private static void verifyType(final WireFormat.FieldType type, final Object value) {
|
|
|
checkNotNull(value);
|
|
|
|
|
|
boolean isValid = false;
|
|
|
switch (type.getJavaType()) {
|
|
|
- case INT: isValid = value instanceof Integer ; break;
|
|
|
- case LONG: isValid = value instanceof Long ; break;
|
|
|
- case FLOAT: isValid = value instanceof Float ; break;
|
|
|
- case DOUBLE: isValid = value instanceof Double ; break;
|
|
|
- case BOOLEAN: isValid = value instanceof Boolean ; break;
|
|
|
- case STRING: isValid = value instanceof String ; break;
|
|
|
+ case INT:
|
|
|
+ isValid = value instanceof Integer;
|
|
|
+ break;
|
|
|
+ case LONG:
|
|
|
+ isValid = value instanceof Long;
|
|
|
+ break;
|
|
|
+ case FLOAT:
|
|
|
+ isValid = value instanceof Float;
|
|
|
+ break;
|
|
|
+ case DOUBLE:
|
|
|
+ isValid = value instanceof Double;
|
|
|
+ break;
|
|
|
+ case BOOLEAN:
|
|
|
+ isValid = value instanceof Boolean;
|
|
|
+ break;
|
|
|
+ case STRING:
|
|
|
+ isValid = value instanceof String;
|
|
|
+ break;
|
|
|
case BYTE_STRING:
|
|
|
isValid = value instanceof ByteString || value instanceof byte[];
|
|
|
break;
|
|
|
case ENUM:
|
|
|
// TODO(kenton): Caller must do type checking here, I guess.
|
|
|
- isValid =
|
|
|
- (value instanceof Integer || value instanceof Internal.EnumLite);
|
|
|
+ isValid = (value instanceof Integer || value instanceof Internal.EnumLite);
|
|
|
break;
|
|
|
case MESSAGE:
|
|
|
// TODO(kenton): Caller must do type checking here, I guess.
|
|
|
- isValid =
|
|
|
- (value instanceof MessageLite) || (value instanceof LazyField);
|
|
|
+ isValid = (value instanceof MessageLite) || (value instanceof LazyField);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -425,7 +407,7 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
// isn't a big deal, though, since it would only really apply when using
|
|
|
// reflection and generally people don't chain reflection setters.
|
|
|
throw new IllegalArgumentException(
|
|
|
- "Wrong object type used with protocol message reflection.");
|
|
|
+ "Wrong object type used with protocol message reflection.");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -433,10 +415,9 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
// Parsing and serialization
|
|
|
|
|
|
/**
|
|
|
- * See {@link Message#isInitialized()}. Note: Since {@code FieldSet}
|
|
|
- * itself does not have any way of knowing about required fields that
|
|
|
- * aren't actually present in the set, it is up to the caller to check
|
|
|
- * that all required fields are present.
|
|
|
+ * See {@link Message#isInitialized()}. Note: Since {@code FieldSet} itself does not have any way
|
|
|
+ * of knowing about required fields that aren't actually present in the set, it is up to the
|
|
|
+ * caller to check that all required fields are present.
|
|
|
*/
|
|
|
public boolean isInitialized() {
|
|
|
for (int i = 0; i < fields.getNumArrayEntries(); i++) {
|
|
@@ -444,8 +425,7 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- for (final Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- fields.getOverflowEntries()) {
|
|
|
+ for (final Map.Entry<FieldDescriptorType, Object> entry : fields.getOverflowEntries()) {
|
|
|
if (!isInitialized(entry)) {
|
|
|
return false;
|
|
|
}
|
|
@@ -454,13 +434,11 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- private boolean isInitialized(
|
|
|
- final Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
+ private boolean isInitialized(final Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
final FieldDescriptorType descriptor = entry.getKey();
|
|
|
if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) {
|
|
|
if (descriptor.isRepeated()) {
|
|
|
- for (final MessageLite element:
|
|
|
- (List<MessageLite>) entry.getValue()) {
|
|
|
+ for (final MessageLite element : (List<MessageLite>) entry.getValue()) {
|
|
|
if (!element.isInitialized()) {
|
|
|
return false;
|
|
|
}
|
|
@@ -485,11 +463,9 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
/**
|
|
|
* Given a field type, return the wire type.
|
|
|
*
|
|
|
- * @returns One of the {@code WIRETYPE_} constants defined in
|
|
|
- * {@link WireFormat}.
|
|
|
+ * @return One of the {@code WIRETYPE_} constants defined in {@link WireFormat}.
|
|
|
*/
|
|
|
- static int getWireFormatForFieldType(final WireFormat.FieldType type,
|
|
|
- boolean isPacked) {
|
|
|
+ static int getWireFormatForFieldType(final WireFormat.FieldType type, boolean isPacked) {
|
|
|
if (isPacked) {
|
|
|
return WireFormat.WIRETYPE_LENGTH_DELIMITED;
|
|
|
} else {
|
|
@@ -497,16 +473,12 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Like {@link Message.Builder#mergeFrom(Message)}, but merges from another
|
|
|
- * {@link FieldSet}.
|
|
|
- */
|
|
|
+ /** Like {@link Message.Builder#mergeFrom(Message)}, but merges from another {@link FieldSet}. */
|
|
|
public void mergeFrom(final FieldSet<FieldDescriptorType> other) {
|
|
|
for (int i = 0; i < other.fields.getNumArrayEntries(); i++) {
|
|
|
mergeFromField(other.fields.getArrayEntryAt(i));
|
|
|
}
|
|
|
- for (final Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- other.fields.getOverflowEntries()) {
|
|
|
+ for (final Map.Entry<FieldDescriptorType, Object> entry : other.fields.getOverflowEntries()) {
|
|
|
mergeFromField(entry);
|
|
|
}
|
|
|
}
|
|
@@ -523,8 +495,7 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
- private void mergeFromField(
|
|
|
- final Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
+ private void mergeFromField(final Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
final FieldDescriptorType descriptor = entry.getKey();
|
|
|
Object otherValue = entry.getValue();
|
|
|
if (otherValue instanceof LazyField) {
|
|
@@ -546,9 +517,10 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
fields.put(descriptor, cloneIfMutable(otherValue));
|
|
|
} else {
|
|
|
// Merge the messages.
|
|
|
- value = descriptor.internalMergeFrom(
|
|
|
- ((MessageLite) value).toBuilder(), (MessageLite) otherValue)
|
|
|
- .build();
|
|
|
+ value =
|
|
|
+ descriptor
|
|
|
+ .internalMergeFrom(((MessageLite) value).toBuilder(), (MessageLite) otherValue)
|
|
|
+ .build();
|
|
|
|
|
|
fields.put(descriptor, value);
|
|
|
}
|
|
@@ -561,72 +533,59 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
// other class. Probably WireFormat.
|
|
|
|
|
|
/**
|
|
|
- * Read a field of any primitive type for immutable messages from a
|
|
|
- * CodedInputStream. Enums, groups, and embedded messages are not handled by
|
|
|
- * this method.
|
|
|
+ * Read a field of any primitive type for immutable messages from a CodedInputStream. Enums,
|
|
|
+ * groups, and embedded messages are not handled by this method.
|
|
|
*
|
|
|
* @param input The stream from which to read.
|
|
|
* @param type Declared type of the field.
|
|
|
* @param checkUtf8 When true, check that the input is valid utf8.
|
|
|
- * @return An object representing the field's value, of the exact
|
|
|
- * type which would be returned by
|
|
|
- * {@link Message#getField(Descriptors.FieldDescriptor)} for
|
|
|
- * this field.
|
|
|
+ * @return An object representing the field's value, of the exact type which would be returned by
|
|
|
+ * {@link Message#getField(Descriptors.FieldDescriptor)} for this field.
|
|
|
*/
|
|
|
public static Object readPrimitiveField(
|
|
|
- CodedInputStream input,
|
|
|
- final WireFormat.FieldType type,
|
|
|
- boolean checkUtf8) throws IOException {
|
|
|
+ CodedInputStream input, final WireFormat.FieldType type, boolean checkUtf8)
|
|
|
+ throws IOException {
|
|
|
if (checkUtf8) {
|
|
|
- return WireFormat.readPrimitiveField(input, type,
|
|
|
- WireFormat.Utf8Validation.STRICT);
|
|
|
+ return WireFormat.readPrimitiveField(input, type, WireFormat.Utf8Validation.STRICT);
|
|
|
} else {
|
|
|
- return WireFormat.readPrimitiveField(input, type,
|
|
|
- WireFormat.Utf8Validation.LOOSE);
|
|
|
+ return WireFormat.readPrimitiveField(input, type, WireFormat.Utf8Validation.LOOSE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/** See {@link Message#writeTo(CodedOutputStream)}. */
|
|
|
- public void writeTo(final CodedOutputStream output)
|
|
|
- throws IOException {
|
|
|
+ public void writeTo(final CodedOutputStream output) throws IOException {
|
|
|
for (int i = 0; i < fields.getNumArrayEntries(); i++) {
|
|
|
- final Map.Entry<FieldDescriptorType, Object> entry =
|
|
|
- fields.getArrayEntryAt(i);
|
|
|
+ final Map.Entry<FieldDescriptorType, Object> entry = fields.getArrayEntryAt(i);
|
|
|
writeField(entry.getKey(), entry.getValue(), output);
|
|
|
}
|
|
|
- for (final Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- fields.getOverflowEntries()) {
|
|
|
+ for (final Map.Entry<FieldDescriptorType, Object> entry : fields.getOverflowEntries()) {
|
|
|
writeField(entry.getKey(), entry.getValue(), output);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Like {@link #writeTo} but uses MessageSet wire format.
|
|
|
- */
|
|
|
- public void writeMessageSetTo(final CodedOutputStream output)
|
|
|
- throws IOException {
|
|
|
+ /** Like {@link #writeTo} but uses MessageSet wire format. */
|
|
|
+ public void writeMessageSetTo(final CodedOutputStream output) throws IOException {
|
|
|
for (int i = 0; i < fields.getNumArrayEntries(); i++) {
|
|
|
writeMessageSetTo(fields.getArrayEntryAt(i), output);
|
|
|
}
|
|
|
- for (final Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- fields.getOverflowEntries()) {
|
|
|
+ for (final Map.Entry<FieldDescriptorType, Object> entry : fields.getOverflowEntries()) {
|
|
|
writeMessageSetTo(entry, output);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void writeMessageSetTo(
|
|
|
- final Map.Entry<FieldDescriptorType, Object> entry,
|
|
|
- final CodedOutputStream output) throws IOException {
|
|
|
+ final Map.Entry<FieldDescriptorType, Object> entry, final CodedOutputStream output)
|
|
|
+ throws IOException {
|
|
|
final FieldDescriptorType descriptor = entry.getKey();
|
|
|
- if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE &&
|
|
|
- !descriptor.isRepeated() && !descriptor.isPacked()) {
|
|
|
+ if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE
|
|
|
+ && !descriptor.isRepeated()
|
|
|
+ && !descriptor.isPacked()) {
|
|
|
Object value = entry.getValue();
|
|
|
if (value instanceof LazyField) {
|
|
|
value = ((LazyField) value).getValue();
|
|
|
}
|
|
|
- output.writeMessageSetExtension(entry.getKey().getNumber(),
|
|
|
- (MessageLite) value);
|
|
|
+ output.writeMessageSetExtension(entry.getKey().getNumber(), (MessageLite) value);
|
|
|
} else {
|
|
|
writeField(descriptor, entry.getValue(), output);
|
|
|
}
|
|
@@ -636,18 +595,17 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
* Write a single tag-value pair to the stream.
|
|
|
*
|
|
|
* @param output The output stream.
|
|
|
- * @param type The field's type.
|
|
|
+ * @param type The field's type.
|
|
|
* @param number The field's number.
|
|
|
- * @param value Object representing the field's value. Must be of the exact
|
|
|
- * type which would be returned by
|
|
|
- * {@link Message#getField(Descriptors.FieldDescriptor)} for
|
|
|
- * this field.
|
|
|
+ * @param value Object representing the field's value. Must be of the exact type which would be
|
|
|
+ * returned by {@link Message#getField(Descriptors.FieldDescriptor)} for this field.
|
|
|
*/
|
|
|
static void writeElement(
|
|
|
final CodedOutputStream output,
|
|
|
final WireFormat.FieldType type,
|
|
|
final int number,
|
|
|
- final Object value) throws IOException {
|
|
|
+ final Object value)
|
|
|
+ throws IOException {
|
|
|
// Special case for groups, which need a start and end tag; other fields
|
|
|
// can just use writeTag() and writeFieldNoTag().
|
|
|
if (type == WireFormat.FieldType.GROUP) {
|
|
@@ -663,26 +621,43 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
*
|
|
|
* @param output The output stream.
|
|
|
* @param type The field's type.
|
|
|
- * @param value Object representing the field's value. Must be of the exact
|
|
|
- * type which would be returned by
|
|
|
- * {@link Message#getField(Descriptors.FieldDescriptor)} for
|
|
|
- * this field.
|
|
|
+ * @param value Object representing the field's value. Must be of the exact type which would be
|
|
|
+ * returned by {@link Message#getField(Descriptors.FieldDescriptor)} for this field.
|
|
|
*/
|
|
|
static void writeElementNoTag(
|
|
|
- final CodedOutputStream output,
|
|
|
- final WireFormat.FieldType type,
|
|
|
- final Object value) throws IOException {
|
|
|
+ final CodedOutputStream output, final WireFormat.FieldType type, final Object value)
|
|
|
+ throws IOException {
|
|
|
switch (type) {
|
|
|
- case DOUBLE : output.writeDoubleNoTag ((Double ) value); break;
|
|
|
- case FLOAT : output.writeFloatNoTag ((Float ) value); break;
|
|
|
- case INT64 : output.writeInt64NoTag ((Long ) value); break;
|
|
|
- case UINT64 : output.writeUInt64NoTag ((Long ) value); break;
|
|
|
- case INT32 : output.writeInt32NoTag ((Integer ) value); break;
|
|
|
- case FIXED64 : output.writeFixed64NoTag ((Long ) value); break;
|
|
|
- case FIXED32 : output.writeFixed32NoTag ((Integer ) value); break;
|
|
|
- case BOOL : output.writeBoolNoTag ((Boolean ) value); break;
|
|
|
- case GROUP : output.writeGroupNoTag ((MessageLite) value); break;
|
|
|
- case MESSAGE : output.writeMessageNoTag ((MessageLite) value); break;
|
|
|
+ case DOUBLE:
|
|
|
+ output.writeDoubleNoTag((Double) value);
|
|
|
+ break;
|
|
|
+ case FLOAT:
|
|
|
+ output.writeFloatNoTag((Float) value);
|
|
|
+ break;
|
|
|
+ case INT64:
|
|
|
+ output.writeInt64NoTag((Long) value);
|
|
|
+ break;
|
|
|
+ case UINT64:
|
|
|
+ output.writeUInt64NoTag((Long) value);
|
|
|
+ break;
|
|
|
+ case INT32:
|
|
|
+ output.writeInt32NoTag((Integer) value);
|
|
|
+ break;
|
|
|
+ case FIXED64:
|
|
|
+ output.writeFixed64NoTag((Long) value);
|
|
|
+ break;
|
|
|
+ case FIXED32:
|
|
|
+ output.writeFixed32NoTag((Integer) value);
|
|
|
+ break;
|
|
|
+ case BOOL:
|
|
|
+ output.writeBoolNoTag((Boolean) value);
|
|
|
+ break;
|
|
|
+ case GROUP:
|
|
|
+ output.writeGroupNoTag((MessageLite) value);
|
|
|
+ break;
|
|
|
+ case MESSAGE:
|
|
|
+ output.writeMessageNoTag((MessageLite) value);
|
|
|
+ break;
|
|
|
case STRING:
|
|
|
if (value instanceof ByteString) {
|
|
|
output.writeBytesNoTag((ByteString) value);
|
|
@@ -697,11 +672,21 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
output.writeByteArrayNoTag((byte[]) value);
|
|
|
}
|
|
|
break;
|
|
|
- case UINT32 : output.writeUInt32NoTag ((Integer ) value); break;
|
|
|
- case SFIXED32: output.writeSFixed32NoTag((Integer ) value); break;
|
|
|
- case SFIXED64: output.writeSFixed64NoTag((Long ) value); break;
|
|
|
- case SINT32 : output.writeSInt32NoTag ((Integer ) value); break;
|
|
|
- case SINT64 : output.writeSInt64NoTag ((Long ) value); break;
|
|
|
+ case UINT32:
|
|
|
+ output.writeUInt32NoTag((Integer) value);
|
|
|
+ break;
|
|
|
+ case SFIXED32:
|
|
|
+ output.writeSFixed32NoTag((Integer) value);
|
|
|
+ break;
|
|
|
+ case SFIXED64:
|
|
|
+ output.writeSFixed64NoTag((Long) value);
|
|
|
+ break;
|
|
|
+ case SINT32:
|
|
|
+ output.writeSInt32NoTag((Integer) value);
|
|
|
+ break;
|
|
|
+ case SINT64:
|
|
|
+ output.writeSInt64NoTag((Long) value);
|
|
|
+ break;
|
|
|
|
|
|
case ENUM:
|
|
|
if (value instanceof Internal.EnumLite) {
|
|
@@ -714,14 +699,13 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/** Write a single field. */
|
|
|
- public static void writeField(final FieldDescriptorLite<?> descriptor,
|
|
|
- final Object value,
|
|
|
- final CodedOutputStream output)
|
|
|
- throws IOException {
|
|
|
+ public static void writeField(
|
|
|
+ final FieldDescriptorLite<?> descriptor, final Object value, final CodedOutputStream output)
|
|
|
+ throws IOException {
|
|
|
WireFormat.FieldType type = descriptor.getLiteType();
|
|
|
int number = descriptor.getNumber();
|
|
|
if (descriptor.isRepeated()) {
|
|
|
- final List<?> valueList = (List<?>)value;
|
|
|
+ final List<?> valueList = (List<?>) value;
|
|
|
if (descriptor.isPacked()) {
|
|
|
output.writeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED);
|
|
|
// Compute the total data size so the length can be written.
|
|
@@ -749,44 +733,39 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * See {@link Message#getSerializedSize()}. It's up to the caller to cache
|
|
|
- * the resulting size if desired.
|
|
|
+ * See {@link Message#getSerializedSize()}. It's up to the caller to cache the resulting size if
|
|
|
+ * desired.
|
|
|
*/
|
|
|
public int getSerializedSize() {
|
|
|
int size = 0;
|
|
|
for (int i = 0; i < fields.getNumArrayEntries(); i++) {
|
|
|
- final Map.Entry<FieldDescriptorType, Object> entry =
|
|
|
- fields.getArrayEntryAt(i);
|
|
|
+ final Map.Entry<FieldDescriptorType, Object> entry = fields.getArrayEntryAt(i);
|
|
|
size += computeFieldSize(entry.getKey(), entry.getValue());
|
|
|
}
|
|
|
- for (final Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- fields.getOverflowEntries()) {
|
|
|
+ for (final Map.Entry<FieldDescriptorType, Object> entry : fields.getOverflowEntries()) {
|
|
|
size += computeFieldSize(entry.getKey(), entry.getValue());
|
|
|
}
|
|
|
return size;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Like {@link #getSerializedSize} but uses MessageSet wire format.
|
|
|
- */
|
|
|
+ /** Like {@link #getSerializedSize} but uses MessageSet wire format. */
|
|
|
public int getMessageSetSerializedSize() {
|
|
|
int size = 0;
|
|
|
for (int i = 0; i < fields.getNumArrayEntries(); i++) {
|
|
|
size += getMessageSetSerializedSize(fields.getArrayEntryAt(i));
|
|
|
}
|
|
|
- for (final Map.Entry<FieldDescriptorType, Object> entry :
|
|
|
- fields.getOverflowEntries()) {
|
|
|
+ for (final Map.Entry<FieldDescriptorType, Object> entry : fields.getOverflowEntries()) {
|
|
|
size += getMessageSetSerializedSize(entry);
|
|
|
}
|
|
|
return size;
|
|
|
}
|
|
|
|
|
|
- private int getMessageSetSerializedSize(
|
|
|
- final Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
+ private int getMessageSetSerializedSize(final Map.Entry<FieldDescriptorType, Object> entry) {
|
|
|
final FieldDescriptorType descriptor = entry.getKey();
|
|
|
Object value = entry.getValue();
|
|
|
if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE
|
|
|
- && !descriptor.isRepeated() && !descriptor.isPacked()) {
|
|
|
+ && !descriptor.isRepeated()
|
|
|
+ && !descriptor.isPacked()) {
|
|
|
if (value instanceof LazyField) {
|
|
|
return CodedOutputStream.computeLazyFieldMessageSetExtensionSize(
|
|
|
entry.getKey().getNumber(), (LazyField) value);
|
|
@@ -800,15 +779,13 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Compute the number of bytes that would be needed to encode a
|
|
|
- * single tag/value pair of arbitrary type.
|
|
|
+ * Compute the number of bytes that would be needed to encode a single tag/value pair of arbitrary
|
|
|
+ * type.
|
|
|
*
|
|
|
- * @param type The field's type.
|
|
|
+ * @param type The field's type.
|
|
|
* @param number The field's number.
|
|
|
- * @param value Object representing the field's value. Must be of the exact
|
|
|
- * type which would be returned by
|
|
|
- * {@link Message#getField(Descriptors.FieldDescriptor)} for
|
|
|
- * this field.
|
|
|
+ * @param value Object representing the field's value. Must be of the exact type which would be
|
|
|
+ * returned by {@link Message#getField(Descriptors.FieldDescriptor)} for this field.
|
|
|
*/
|
|
|
static int computeElementSize(
|
|
|
final WireFormat.FieldType type, final int number, final Object value) {
|
|
@@ -822,46 +799,57 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Compute the number of bytes that would be needed to encode a
|
|
|
- * particular value of arbitrary type, excluding tag.
|
|
|
+ * Compute the number of bytes that would be needed to encode a particular value of arbitrary
|
|
|
+ * type, excluding tag.
|
|
|
*
|
|
|
- * @param type The field's type.
|
|
|
- * @param value Object representing the field's value. Must be of the exact
|
|
|
- * type which would be returned by
|
|
|
- * {@link Message#getField(Descriptors.FieldDescriptor)} for
|
|
|
- * this field.
|
|
|
+ * @param type The field's type.
|
|
|
+ * @param value Object representing the field's value. Must be of the exact type which would be
|
|
|
+ * returned by {@link Message#getField(Descriptors.FieldDescriptor)} for this field.
|
|
|
*/
|
|
|
- static int computeElementSizeNoTag(
|
|
|
- final WireFormat.FieldType type, final Object value) {
|
|
|
+ static int computeElementSizeNoTag(final WireFormat.FieldType type, final Object value) {
|
|
|
switch (type) {
|
|
|
- // Note: Minor violation of 80-char limit rule here because this would
|
|
|
- // actually be harder to read if we wrapped the lines.
|
|
|
- case DOUBLE : return CodedOutputStream.computeDoubleSizeNoTag ((Double )value);
|
|
|
- case FLOAT : return CodedOutputStream.computeFloatSizeNoTag ((Float )value);
|
|
|
- case INT64 : return CodedOutputStream.computeInt64SizeNoTag ((Long )value);
|
|
|
- case UINT64 : return CodedOutputStream.computeUInt64SizeNoTag ((Long )value);
|
|
|
- case INT32 : return CodedOutputStream.computeInt32SizeNoTag ((Integer )value);
|
|
|
- case FIXED64 : return CodedOutputStream.computeFixed64SizeNoTag ((Long )value);
|
|
|
- case FIXED32 : return CodedOutputStream.computeFixed32SizeNoTag ((Integer )value);
|
|
|
- case BOOL : return CodedOutputStream.computeBoolSizeNoTag ((Boolean )value);
|
|
|
- case GROUP : return CodedOutputStream.computeGroupSizeNoTag ((MessageLite)value);
|
|
|
- case BYTES :
|
|
|
+ // Note: Minor violation of 80-char limit rule here because this would
|
|
|
+ // actually be harder to read if we wrapped the lines.
|
|
|
+ case DOUBLE:
|
|
|
+ return CodedOutputStream.computeDoubleSizeNoTag((Double) value);
|
|
|
+ case FLOAT:
|
|
|
+ return CodedOutputStream.computeFloatSizeNoTag((Float) value);
|
|
|
+ case INT64:
|
|
|
+ return CodedOutputStream.computeInt64SizeNoTag((Long) value);
|
|
|
+ case UINT64:
|
|
|
+ return CodedOutputStream.computeUInt64SizeNoTag((Long) value);
|
|
|
+ case INT32:
|
|
|
+ return CodedOutputStream.computeInt32SizeNoTag((Integer) value);
|
|
|
+ case FIXED64:
|
|
|
+ return CodedOutputStream.computeFixed64SizeNoTag((Long) value);
|
|
|
+ case FIXED32:
|
|
|
+ return CodedOutputStream.computeFixed32SizeNoTag((Integer) value);
|
|
|
+ case BOOL:
|
|
|
+ return CodedOutputStream.computeBoolSizeNoTag((Boolean) value);
|
|
|
+ case GROUP:
|
|
|
+ return CodedOutputStream.computeGroupSizeNoTag((MessageLite) value);
|
|
|
+ case BYTES:
|
|
|
if (value instanceof ByteString) {
|
|
|
return CodedOutputStream.computeBytesSizeNoTag((ByteString) value);
|
|
|
} else {
|
|
|
return CodedOutputStream.computeByteArraySizeNoTag((byte[]) value);
|
|
|
}
|
|
|
- case STRING :
|
|
|
+ case STRING:
|
|
|
if (value instanceof ByteString) {
|
|
|
return CodedOutputStream.computeBytesSizeNoTag((ByteString) value);
|
|
|
} else {
|
|
|
return CodedOutputStream.computeStringSizeNoTag((String) value);
|
|
|
}
|
|
|
- case UINT32 : return CodedOutputStream.computeUInt32SizeNoTag ((Integer )value);
|
|
|
- case SFIXED32: return CodedOutputStream.computeSFixed32SizeNoTag((Integer )value);
|
|
|
- case SFIXED64: return CodedOutputStream.computeSFixed64SizeNoTag((Long )value);
|
|
|
- case SINT32 : return CodedOutputStream.computeSInt32SizeNoTag ((Integer )value);
|
|
|
- case SINT64 : return CodedOutputStream.computeSInt64SizeNoTag ((Long )value);
|
|
|
+ case UINT32:
|
|
|
+ return CodedOutputStream.computeUInt32SizeNoTag((Integer) value);
|
|
|
+ case SFIXED32:
|
|
|
+ return CodedOutputStream.computeSFixed32SizeNoTag((Integer) value);
|
|
|
+ case SFIXED64:
|
|
|
+ return CodedOutputStream.computeSFixed64SizeNoTag((Long) value);
|
|
|
+ case SINT32:
|
|
|
+ return CodedOutputStream.computeSInt32SizeNoTag((Integer) value);
|
|
|
+ case SINT64:
|
|
|
+ return CodedOutputStream.computeSInt64SizeNoTag((Long) value);
|
|
|
|
|
|
case MESSAGE:
|
|
|
if (value instanceof LazyField) {
|
|
@@ -872,36 +860,31 @@ final class FieldSet<FieldDescriptorType extends
|
|
|
|
|
|
case ENUM:
|
|
|
if (value instanceof Internal.EnumLite) {
|
|
|
- return CodedOutputStream.computeEnumSizeNoTag(
|
|
|
- ((Internal.EnumLite) value).getNumber());
|
|
|
+ return CodedOutputStream.computeEnumSizeNoTag(((Internal.EnumLite) value).getNumber());
|
|
|
} else {
|
|
|
return CodedOutputStream.computeEnumSizeNoTag((Integer) value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- throw new RuntimeException(
|
|
|
- "There is no way to get here, but the compiler thinks otherwise.");
|
|
|
+ throw new RuntimeException("There is no way to get here, but the compiler thinks otherwise.");
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Compute the number of bytes needed to encode a particular field.
|
|
|
- */
|
|
|
- public static int computeFieldSize(final FieldDescriptorLite<?> descriptor,
|
|
|
- final Object value) {
|
|
|
+ /** Compute the number of bytes needed to encode a particular field. */
|
|
|
+ public static int computeFieldSize(final FieldDescriptorLite<?> descriptor, final Object value) {
|
|
|
WireFormat.FieldType type = descriptor.getLiteType();
|
|
|
int number = descriptor.getNumber();
|
|
|
if (descriptor.isRepeated()) {
|
|
|
if (descriptor.isPacked()) {
|
|
|
int dataSize = 0;
|
|
|
- for (final Object element : (List<?>)value) {
|
|
|
+ for (final Object element : (List<?>) value) {
|
|
|
dataSize += computeElementSizeNoTag(type, element);
|
|
|
}
|
|
|
- return dataSize +
|
|
|
- CodedOutputStream.computeTagSize(number) +
|
|
|
- CodedOutputStream.computeRawVarint32Size(dataSize);
|
|
|
+ return dataSize
|
|
|
+ + CodedOutputStream.computeTagSize(number)
|
|
|
+ + CodedOutputStream.computeRawVarint32Size(dataSize);
|
|
|
} else {
|
|
|
int size = 0;
|
|
|
- for (final Object element : (List<?>)value) {
|
|
|
+ for (final Object element : (List<?>) value) {
|
|
|
size += computeElementSize(type, number, element);
|
|
|
}
|
|
|
return size;
|