1
// Protocol Buffers - Google's data interchange format
2
// Copyright 2008 Google Inc. All rights reserved.
3
// http://code.google.com/p/protobuf/
5
// Redistribution and use in source and binary forms, with or without
6
// modification, are permitted provided that the following conditions are
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
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.
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.
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.
36
// Defines MessageLite, the abstract interface implemented by all (lite
37
// and non-lite) protocol message objects.
39
#ifndef GOOGLE_PROTOBUF_MESSAGE_LITE_H__
40
#define GOOGLE_PROTOBUF_MESSAGE_LITE_H__
42
#include <google/protobuf/stubs/common.h>
48
class CodedInputStream;
49
class CodedOutputStream;
50
class ZeroCopyInputStream;
51
class ZeroCopyOutputStream;
54
// Interface to light weight protocol messages.
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:
64
// option optimize_for = LITE_RUNTIME;
66
// This is particularly useful on resource-constrained systems where
67
// the full protocol buffers runtime library is too big.
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.
77
class LIBPROTOBUF_EXPORT MessageLite {
79
inline MessageLite() {}
80
virtual ~MessageLite();
82
// Basic Operations ------------------------------------------------
84
// Get the name of this message type, e.g. "foo.bar.BazProto".
85
virtual string GetTypeName() const = 0;
87
// Construct a new instance of the same type. Ownership is passed to the
89
virtual MessageLite* New() const = 0;
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;
98
// Quickly check if all required fields have values set.
99
virtual bool IsInitialized() const = 0;
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;
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;
110
// Parsing ---------------------------------------------------------
111
// Methods for parsing in protocol buffer format. Most of these are
112
// just simple wrappers around MergeFromCodedStream().
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
117
bool ParseFromCodedStream(io::CodedInputStream* input);
118
// Like ParseFromCodedStream(), but accepts messages that are missing
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
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,
135
// Parse a protocol buffer contained in a string.
136
bool ParseFromString(const string& data);
137
// Like ParseFromString(), but accepts messages that are missing
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
144
bool ParsePartialFromArray(const void* data, int size);
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
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.
156
// ParsefromCodedStream() is implemented as Clear() followed by
157
// MergeFromCodedStream().
158
bool MergeFromCodedStream(io::CodedInputStream* input);
160
// Like MergeFromCodedStream(), but succeeds even if required fields are
161
// missing in the input.
163
// MergeFromCodedStream() is just implemented as MergePartialFromCodedStream()
164
// followed by IsInitialized().
165
virtual bool MergePartialFromCodedStream(io::CodedInputStream* input) = 0;
168
// Serialization ---------------------------------------------------
169
// Methods for serializing in protocol buffer format. Most of these
170
// are just simple wrappers around ByteSize() and SerializeWithCachedSizes().
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;
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;
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;
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;
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
218
virtual void SerializeWithCachedSizes(
219
io::CodedOutputStream* output) const = 0;
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;
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.
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
237
virtual int GetCachedSize() const = 0;
240
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageLite);
243
} // namespace protobuf
245
} // namespace google
246
#endif // GOOGLE_PROTOBUF_MESSAGE_LITE_H__