• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
44 namespace google {
45 namespace protobuf {
46 
47 namespace 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.
77 class LIBPROTOBUF_EXPORT MessageLite {
78  public:
MessageLite()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