diff options
author | Tom Chao <chaot@google.com> | 2013-11-11 11:22:02 -0800 |
---|---|---|
committer | Tom Chao <chaot@google.com> | 2013-11-11 11:22:02 -0800 |
commit | 28b4dec79beb47828d73f61b5f8719e62f098f37 (patch) | |
tree | 004293dab4beb3f73d71b1f1381a0db8ec031cac /java/src | |
parent | 874d66c06a6348a4bf3038107338477dc6d0f360 (diff) | |
download | protobuf-28b4dec79beb47828d73f61b5f8719e62f098f37.tar.gz protobuf-28b4dec79beb47828d73f61b5f8719e62f098f37.tar.bz2 protobuf-28b4dec79beb47828d73f61b5f8719e62f098f37.zip |
Minimize method count for nanoproto.
- Migrates getCachedSize to the MessageNano parent class to save one method per message.
- Create ExtendableMessageNano parent class for protos with extensions, this saves the
getExtension and setExtension methods on the relevant messages.
- getSerializedSize's default case (with no fields to serialize) also migrate to the
parent class, which saves methods on empty messages.
- Container classes become interfaces to save the constructor.
Change-Id: I81f1a1b6d6a660096835e9df3ea20456655aab4a
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/main/java/com/google/protobuf/nano/ExtendableMessageNano.java | 70 | ||||
-rw-r--r-- | java/src/main/java/com/google/protobuf/nano/MessageNano.java | 16 |
2 files changed, 84 insertions, 2 deletions
diff --git a/java/src/main/java/com/google/protobuf/nano/ExtendableMessageNano.java b/java/src/main/java/com/google/protobuf/nano/ExtendableMessageNano.java new file mode 100644 index 00000000..066774d5 --- /dev/null +++ b/java/src/main/java/com/google/protobuf/nano/ExtendableMessageNano.java @@ -0,0 +1,70 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2013 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf.nano; + +import java.util.ArrayList; +import java.util.List; + +/** + * Base class of those Protocol Buffer messages that need to store unknown fields, + * such as extensions. + */ +public abstract class ExtendableMessageNano extends MessageNano { + /** + * A container for fields unknown to the message, including extensions. Extension fields can + * can be accessed through the {@link getExtension()} and {@link setExtension()} methods. + */ + protected List<UnknownFieldData> unknownFieldData; + + @Override + public int getSerializedSize() { + int size = WireFormatNano.computeWireSize(unknownFieldData); + cachedSize = size; + return size; + } + + /** + * Gets the value stored in the specified extension of this message. + */ + public <T> T getExtension(Extension<T> extension) { + return WireFormatNano.getExtension(extension, unknownFieldData); + } + + /** + * Sets the value of the specified extension of this message. + */ + public <T> void setExtension(Extension<T> extension, T value) { + if (unknownFieldData == null) { + unknownFieldData = new ArrayList<UnknownFieldData>(); + } + WireFormatNano.setExtension(extension, value, unknownFieldData); + } +}
\ No newline at end of file diff --git a/java/src/main/java/com/google/protobuf/nano/MessageNano.java b/java/src/main/java/com/google/protobuf/nano/MessageNano.java index 8d4ec39e..7eff153c 100644 --- a/java/src/main/java/com/google/protobuf/nano/MessageNano.java +++ b/java/src/main/java/com/google/protobuf/nano/MessageNano.java @@ -38,6 +38,8 @@ import java.io.IOException; * @author wink@google.com Wink Saville */ public abstract class MessageNano { + protected int cachedSize = -1; + /** * Get the number of bytes required to encode this message. * Returns the cached size or calls getSerializedSize which @@ -45,14 +47,24 @@ public abstract class MessageNano { * so the size is only computed once. If a member is modified * then this could be stale call getSerializedSize if in doubt. */ - abstract public int getCachedSize(); + public int getCachedSize() { + if (cachedSize < 0) { + // getSerializedSize sets cachedSize + getSerializedSize(); + } + return cachedSize; + } /** * Computes the number of bytes required to encode this message. * The size is cached and the cached result can be retrieved * using getCachedSize(). */ - abstract public int getSerializedSize(); + public int getSerializedSize() { + // This is overridden if the generated message has serialized fields. + cachedSize = 0; + return 0; + } /** * Serializes the message and writes it to {@code output}. This does not |