1// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc.  All rights reserved.
3// http://code.google.com/p/protobuf/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9//     * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11//     * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15//     * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31// Authors: wink@google.com (Wink Saville),
32//          kenton@google.com (Kenton Varda)
33//  Based on original Protocol Buffers design by
34//  Sanjay Ghemawat, Jeff Dean, and others.
35//
36// Defines MessageLite, the abstract interface implemented by all (lite
37// and non-lite) protocol message objects.
38
39#ifndef GOOGLE_PROTOBUF_MESSAGE_LITE_H__
40#define GOOGLE_PROTOBUF_MESSAGE_LITE_H__
41
42#include <google/protobuf/stubs/common.h>
43
44namespace google {
45namespace protobuf {
46
47namespace io {
48  class CodedInputStream;
49  class CodedOutputStream;
50  class ZeroCopyInputStream;
51  class ZeroCopyOutputStream;
52}
53
54// Interface to light weight protocol messages.
55//
56// This interface is implemented by all protocol message objects.  Non-lite
57// messages additionally implement the Message interface, which is a
58// subclass of MessageLite.  Use MessageLite instead when you only need
59// the subset of features which it supports -- namely, nothing that uses
60// descriptors or reflection.  You can instruct the protocol compiler
61// to generate classes which implement only MessageLite, not the full
62// Message interface, by adding the following line to the .proto file:
63//
64//   option optimize_for = LITE_RUNTIME;
65//
66// This is particularly useful on resource-constrained systems where
67// the full protocol buffers runtime library is too big.
68//
69// Note that on non-constrained systems (e.g. servers) when you need
70// to link in lots of protocol definitions, a better way to reduce
71// total code footprint is to use optimize_for = CODE_SIZE.  This
72// will make the generated code smaller while still supporting all the
73// same features (at the expense of speed).  optimize_for = LITE_RUNTIME
74// is best when you only have a small number of message types linked
75// into your binary, in which case the size of the protocol buffers
76// runtime itself is the biggest problem.
77class LIBPROTOBUF_EXPORT MessageLite {
78 public:
79  inline MessageLite() {}
80  virtual ~MessageLite();
81
82  // Basic Operations ------------------------------------------------
83
84  // Get the name of this message type, e.g. "foo.bar.BazProto".
85  virtual string GetTypeName() const = 0;
86
87  // Construct a new instance of the same type.  Ownership is passed to the
88  // caller.
89  virtual MessageLite* New() const = 0;
90
91  // Clear all fields of the message and set them to their default values.
92  // Clear() avoids freeing memory, assuming that any memory allocated
93  // to hold parts of the message will be needed again to hold the next
94  // message.  If you actually want to free the memory used by a Message,
95  // you must delete it.
96  virtual void Clear() = 0;
97
98  // Quickly check if all required fields have values set.
99  virtual bool IsInitialized() const = 0;
100
101  // This is not implemented for Lite messages -- it just returns "(cannot
102  // determine missing fields for lite message)".  However, it is implemented
103  // for full messages.  See message.h.
104  virtual string InitializationErrorString() const;
105
106  // If |other| is the exact same class as this, calls MergeFrom().  Otherwise,
107  // results are undefined (probably crash).
108  virtual void CheckTypeAndMergeFrom(const MessageLite& other) = 0;
109
110  // Parsing ---------------------------------------------------------
111  // Methods for parsing in protocol buffer format.  Most of these are
112  // just simple wrappers around MergeFromCodedStream().
113
114  // Fill the message with a protocol buffer parsed from the given input
115  // stream.  Returns false on a read error or if the input is in the
116  // wrong format.
117  bool ParseFromCodedStream(io::CodedInputStream* input);
118  // Like ParseFromCodedStream(), but accepts messages that are missing
119  // required fields.
120  bool ParsePartialFromCodedStream(io::CodedInputStream* input);
121  // Read a protocol buffer from the given zero-copy input stream.  If
122  // successful, the entire input will be consumed.
123  bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input);
124  // Like ParseFromZeroCopyStream(), but accepts messages that are missing
125  // required fields.
126  bool ParsePartialFromZeroCopyStream(io::ZeroCopyInputStream* input);
127  // Read a protocol buffer from the given zero-copy input stream, expecting
128  // the message to be exactly "size" bytes long.  If successful, exactly
129  // this many bytes will have been consumed from the input.
130  bool ParseFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size);
131  // Like ParseFromBoundedZeroCopyStream(), but accepts messages that are
132  // missing required fields.
133  bool ParsePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input,
134                                             int size);
135  // Parse a protocol buffer contained in a string.
136  bool ParseFromString(const string& data);
137  // Like ParseFromString(), but accepts messages that are missing
138  // required fields.
139  bool ParsePartialFromString(const string& data);
140  // Parse a protocol buffer contained in an array of bytes.
141  bool ParseFromArray(const void* data, int size);
142  // Like ParseFromArray(), but accepts messages that are missing
143  // required fields.
144  bool ParsePartialFromArray(const void* data, int size);
145
146
147  // Reads a protocol buffer from the stream and merges it into this
148  // Message.  Singular fields read from the input overwrite what is
149  // already in the Message and repeated fields are appended to those
150  // already present.
151  //
152  // It is the responsibility of the caller to call input->LastTagWas()
153  // (for groups) or input->ConsumedEntireMessage() (for non-groups) after
154  // this returns to verify that the message's end was delimited correctly.
155  //
156  // ParsefromCodedStream() is implemented as Clear() followed by
157  // MergeFromCodedStream().
158  bool MergeFromCodedStream(io::CodedInputStream* input);
159
160  // Like MergeFromCodedStream(), but succeeds even if required fields are
161  // missing in the input.
162  //
163  // MergeFromCodedStream() is just implemented as MergePartialFromCodedStream()
164  // followed by IsInitialized().
165  virtual bool MergePartialFromCodedStream(io::CodedInputStream* input) = 0;
166
167
168  // Serialization ---------------------------------------------------
169  // Methods for serializing in protocol buffer format.  Most of these
170  // are just simple wrappers around ByteSize() and SerializeWithCachedSizes().
171
172  // Write a protocol buffer of this message to the given output.  Returns
173  // false on a write error.  If the message is missing required fields,
174  // this may GOOGLE_CHECK-fail.
175  bool SerializeToCodedStream(io::CodedOutputStream* output) const;
176  // Like SerializeToCodedStream(), but allows missing required fields.
177  bool SerializePartialToCodedStream(io::CodedOutputStream* output) const;
178  // Write the message to the given zero-copy output stream.  All required
179  // fields must be set.
180  bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream* output) const;
181  // Like SerializeToZeroCopyStream(), but allows missing required fields.
182  bool SerializePartialToZeroCopyStream(io::ZeroCopyOutputStream* output) const;
183  // Serialize the message and store it in the given string.  All required
184  // fields must be set.
185  bool SerializeToString(string* output) const;
186  // Like SerializeToString(), but allows missing required fields.
187  bool SerializePartialToString(string* output) const;
188  // Serialize the message and store it in the given byte array.  All required
189  // fields must be set.
190  bool SerializeToArray(void* data, int size) const;
191  // Like SerializeToArray(), but allows missing required fields.
192  bool SerializePartialToArray(void* data, int size) const;
193
194  // Make a string encoding the message. Is equivalent to calling
195  // SerializeToString() on a string and using that.  Returns the empty
196  // string if SerializeToString() would have returned an error.
197  // Note: If you intend to generate many such strings, you may
198  // reduce heap fragmentation by instead re-using the same string
199  // object with calls to SerializeToString().
200  string SerializeAsString() const;
201  // Like SerializeAsString(), but allows missing required fields.
202  string SerializePartialAsString() const;
203
204  // Like SerializeToString(), but appends to the data to the string's existing
205  // contents.  All required fields must be set.
206  bool AppendToString(string* output) const;
207  // Like AppendToString(), but allows missing required fields.
208  bool AppendPartialToString(string* output) const;
209
210  // Computes the serialized size of the message.  This recursively calls
211  // ByteSize() on all embedded messages.  If a subclass does not override
212  // this, it MUST override SetCachedSize().
213  virtual int ByteSize() const = 0;
214
215  // Serializes the message without recomputing the size.  The message must
216  // not have changed since the last call to ByteSize(); if it has, the results
217  // are undefined.
218  virtual void SerializeWithCachedSizes(
219      io::CodedOutputStream* output) const = 0;
220
221  // Like SerializeWithCachedSizes, but writes directly to *target, returning
222  // a pointer to the byte immediately after the last byte written.  "target"
223  // must point at a byte array of at least ByteSize() bytes.
224  virtual uint8* SerializeWithCachedSizesToArray(uint8* target) const;
225
226  // Returns the result of the last call to ByteSize().  An embedded message's
227  // size is needed both to serialize it (because embedded messages are
228  // length-delimited) and to compute the outer message's size.  Caching
229  // the size avoids computing it multiple times.
230  //
231  // ByteSize() does not automatically use the cached size when available
232  // because this would require invalidating it every time the message was
233  // modified, which would be too hard and expensive.  (E.g. if a deeply-nested
234  // sub-message is changed, all of its parents' cached sizes would need to be
235  // invalidated, which is too much work for an otherwise inlined setter
236  // method.)
237  virtual int GetCachedSize() const = 0;
238
239 private:
240  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageLite);
241};
242
243}  // namespace protobuf
244
245}  // namespace google
246#endif  // GOOGLE_PROTOBUF_MESSAGE_LITE_H__
247