OLD | NEW |
1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
3 // https://developers.google.com/protocol-buffers/ | 3 // http://code.google.com/p/protobuf/ |
4 // | 4 // |
5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
7 // met: | 7 // met: |
8 // | 8 // |
9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
11 // * Redistributions in binary form must reproduce the above | 11 // * Redistributions in binary form must reproduce the above |
12 // copyright notice, this list of conditions and the following disclaimer | 12 // copyright notice, this list of conditions and the following disclaimer |
13 // in the documentation and/or other materials provided with the | 13 // in the documentation and/or other materials provided with the |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 // FindFieldByName("numbers"); | 91 // FindFieldByName("numbers"); |
92 // assert(numbers_field != NULL); | 92 // assert(numbers_field != NULL); |
93 // assert(numbers_field->type() == FieldDescriptor::TYPE_INT32); | 93 // assert(numbers_field->type() == FieldDescriptor::TYPE_INT32); |
94 // assert(numbers_field->label() == FieldDescriptor::LABEL_REPEATED); | 94 // assert(numbers_field->label() == FieldDescriptor::LABEL_REPEATED); |
95 // | 95 // |
96 // // Parse the message. | 96 // // Parse the message. |
97 // foo->ParseFromString(data); | 97 // foo->ParseFromString(data); |
98 // | 98 // |
99 // // Use the reflection interface to examine the contents. | 99 // // Use the reflection interface to examine the contents. |
100 // const Reflection* reflection = foo->GetReflection(); | 100 // const Reflection* reflection = foo->GetReflection(); |
101 // assert(reflection->GetString(*foo, text_field) == "Hello World!"); | 101 // assert(reflection->GetString(foo, text_field) == "Hello World!"); |
102 // assert(reflection->FieldSize(*foo, numbers_field) == 3); | 102 // assert(reflection->FieldSize(foo, numbers_field) == 3); |
103 // assert(reflection->GetRepeatedInt32(*foo, numbers_field, 0) == 1); | 103 // assert(reflection->GetRepeatedInt32(foo, numbers_field, 0) == 1); |
104 // assert(reflection->GetRepeatedInt32(*foo, numbers_field, 1) == 5); | 104 // assert(reflection->GetRepeatedInt32(foo, numbers_field, 1) == 5); |
105 // assert(reflection->GetRepeatedInt32(*foo, numbers_field, 2) == 42); | 105 // assert(reflection->GetRepeatedInt32(foo, numbers_field, 2) == 42); |
106 // | 106 // |
107 // delete foo; | 107 // delete foo; |
108 // } | 108 // } |
109 | 109 |
110 #ifndef GOOGLE_PROTOBUF_MESSAGE_H__ | 110 #ifndef GOOGLE_PROTOBUF_MESSAGE_H__ |
111 #define GOOGLE_PROTOBUF_MESSAGE_H__ | 111 #define GOOGLE_PROTOBUF_MESSAGE_H__ |
112 | 112 |
| 113 #include <vector> |
| 114 #include <string> |
| 115 |
| 116 #ifdef __DECCXX |
| 117 // HP C++'s iosfwd doesn't work. |
| 118 #include <iostream> |
| 119 #else |
113 #include <iosfwd> | 120 #include <iosfwd> |
114 #include <string> | 121 #endif |
115 #include <google/protobuf/stubs/type_traits.h> | |
116 #include <vector> | |
117 | 122 |
118 #include <google/protobuf/arena.h> | |
119 #include <google/protobuf/message_lite.h> | 123 #include <google/protobuf/message_lite.h> |
120 | 124 |
121 #include <google/protobuf/stubs/common.h> | 125 #include <google/protobuf/stubs/common.h> |
122 #include <google/protobuf/descriptor.h> | 126 #include <google/protobuf/descriptor.h> |
123 | 127 |
124 | 128 |
125 #define GOOGLE_PROTOBUF_HAS_ONEOF | |
126 #define GOOGLE_PROTOBUF_HAS_ARENAS | |
127 | |
128 namespace google { | 129 namespace google { |
129 namespace protobuf { | 130 namespace protobuf { |
130 | 131 |
131 // Defined in this file. | 132 // Defined in this file. |
132 class Message; | 133 class Message; |
133 class Reflection; | 134 class Reflection; |
134 class MessageFactory; | 135 class MessageFactory; |
135 | 136 |
136 // Defined in other files. | 137 // Defined in other files. |
137 class UnknownFieldSet; // unknown_field_set.h | 138 class UnknownFieldSet; // unknown_field_set.h |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 inline Message() {} | 171 inline Message() {} |
171 virtual ~Message(); | 172 virtual ~Message(); |
172 | 173 |
173 // Basic Operations ------------------------------------------------ | 174 // Basic Operations ------------------------------------------------ |
174 | 175 |
175 // Construct a new instance of the same type. Ownership is passed to the | 176 // Construct a new instance of the same type. Ownership is passed to the |
176 // caller. (This is also defined in MessageLite, but is defined again here | 177 // caller. (This is also defined in MessageLite, but is defined again here |
177 // for return-type covariance.) | 178 // for return-type covariance.) |
178 virtual Message* New() const = 0; | 179 virtual Message* New() const = 0; |
179 | 180 |
180 // Construct a new instance on the arena. Ownership is passed to the caller | |
181 // if arena is a NULL. Default implementation allows for API compatibility | |
182 // during the Arena transition. | |
183 virtual Message* New(::google::protobuf::Arena* arena) const { | |
184 Message* message = New(); | |
185 if (arena != NULL) { | |
186 arena->Own(message); | |
187 } | |
188 return message; | |
189 } | |
190 | |
191 // Make this message into a copy of the given message. The given message | 181 // Make this message into a copy of the given message. The given message |
192 // must have the same descriptor, but need not necessarily be the same class. | 182 // must have the same descriptor, but need not necessarily be the same class. |
193 // By default this is just implemented as "Clear(); MergeFrom(from);". | 183 // By default this is just implemented as "Clear(); MergeFrom(from);". |
194 virtual void CopyFrom(const Message& from); | 184 virtual void CopyFrom(const Message& from); |
195 | 185 |
196 // Merge the fields from the given message into this message. Singular | 186 // Merge the fields from the given message into this message. Singular |
197 // fields will be overwritten, if specified in from, except for embedded | 187 // fields will be overwritten, except for embedded messages which will |
198 // messages which will be merged. Repeated fields will be concatenated. | 188 // be merged. Repeated fields will be concatenated. The given message |
199 // The given message must be of the same type as this message (i.e. the | 189 // must be of the same type as this message (i.e. the exact same class). |
200 // exact same class). | |
201 virtual void MergeFrom(const Message& from); | 190 virtual void MergeFrom(const Message& from); |
202 | 191 |
203 // Verifies that IsInitialized() returns true. GOOGLE_CHECK-fails otherwise,
with | 192 // Verifies that IsInitialized() returns true. GOOGLE_CHECK-fails otherwise,
with |
204 // a nice error message. | 193 // a nice error message. |
205 void CheckInitialized() const; | 194 void CheckInitialized() const; |
206 | 195 |
207 // Slowly build a list of all required fields that are not set. | 196 // Slowly build a list of all required fields that are not set. |
208 // This is much, much slower than IsInitialized() as it is implemented | 197 // This is much, much slower than IsInitialized() as it is implemented |
209 // purely via reflection. Generally, you should not call this unless you | 198 // purely via reflection. Generally, you should not call this unless you |
210 // have already determined that an error exists by calling IsInitialized(). | 199 // have already determined that an error exists by calling IsInitialized(). |
211 void FindInitializationErrors(std::vector<string>* errors) const; | 200 void FindInitializationErrors(vector<string>* errors) const; |
212 | 201 |
213 // Like FindInitializationErrors, but joins all the strings, delimited by | 202 // Like FindInitializationErrors, but joins all the strings, delimited by |
214 // commas, and returns them. | 203 // commas, and returns them. |
215 string InitializationErrorString() const; | 204 string InitializationErrorString() const; |
216 | 205 |
217 // Clears all unknown fields from this message and all embedded messages. | 206 // Clears all unknown fields from this message and all embedded messages. |
218 // Normally, if unknown tag numbers are encountered when parsing a message, | 207 // Normally, if unknown tag numbers are encountered when parsing a message, |
219 // the tag and value are stored in the message's UnknownFieldSet and | 208 // the tag and value are stored in the message's UnknownFieldSet and |
220 // then written back out when the message is serialized. This allows servers | 209 // then written back out when the message is serialized. This allows servers |
221 // which simply route messages to other servers to pass through messages | 210 // which simply route messages to other servers to pass through messages |
222 // that have new field definitions which they don't yet know about. However, | 211 // that have new field definitions which they don't yet know about. However, |
223 // this behavior can have security implications. To avoid it, call this | 212 // this behavior can have security implications. To avoid it, call this |
224 // method after parsing. | 213 // method after parsing. |
225 // | 214 // |
226 // See Reflection::GetUnknownFields() for more on unknown fields. | 215 // See Reflection::GetUnknownFields() for more on unknown fields. |
227 virtual void DiscardUnknownFields(); | 216 virtual void DiscardUnknownFields(); |
228 | 217 |
229 // Computes (an estimate of) the total number of bytes currently used for | 218 // Computes (an estimate of) the total number of bytes currently used for |
230 // storing the message in memory. The default implementation calls the | 219 // storing the message in memory. The default implementation calls the |
231 // Reflection object's SpaceUsed() method. | 220 // Reflection object's SpaceUsed() method. |
232 // | |
233 // SpaceUsed() is noticeably slower than ByteSize(), as it is implemented | |
234 // using reflection (rather than the generated code implementation for | |
235 // ByteSize()). Like ByteSize(), its CPU time is linear in the number of | |
236 // fields defined for the proto. | |
237 virtual int SpaceUsed() const; | 221 virtual int SpaceUsed() const; |
238 | 222 |
239 // Debugging & Testing---------------------------------------------- | 223 // Debugging & Testing---------------------------------------------- |
240 | 224 |
241 // Generates a human readable form of this message, useful for debugging | 225 // Generates a human readable form of this message, useful for debugging |
242 // and other purposes. | 226 // and other purposes. |
243 string DebugString() const; | 227 string DebugString() const; |
244 // Like DebugString(), but with less whitespace. | 228 // Like DebugString(), but with less whitespace. |
245 string ShortDebugString() const; | 229 string ShortDebugString() const; |
246 // Like DebugString(), but do not escape UTF-8 byte sequences. | 230 // Like DebugString(), but do not escape UTF-8 byte sequences. |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 // Get a struct containing the metadata for the Message. Most subclasses only | 309 // Get a struct containing the metadata for the Message. Most subclasses only |
326 // need to implement this method, rather than the GetDescriptor() and | 310 // need to implement this method, rather than the GetDescriptor() and |
327 // GetReflection() wrappers. | 311 // GetReflection() wrappers. |
328 virtual Metadata GetMetadata() const = 0; | 312 virtual Metadata GetMetadata() const = 0; |
329 | 313 |
330 | 314 |
331 private: | 315 private: |
332 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message); | 316 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message); |
333 }; | 317 }; |
334 | 318 |
335 namespace internal { | |
336 // Forward-declare interfaces used to implement RepeatedFieldRef. | |
337 // These are protobuf internals that users shouldn't care about. | |
338 class RepeatedFieldAccessor; | |
339 } // namespace internal | |
340 | |
341 // Forward-declare RepeatedFieldRef templates. The second type parameter is | |
342 // used for SFINAE tricks. Users should ignore it. | |
343 template<typename T, typename Enable = void> | |
344 class RepeatedFieldRef; | |
345 | |
346 template<typename T, typename Enable = void> | |
347 class MutableRepeatedFieldRef; | |
348 | |
349 // This interface contains methods that can be used to dynamically access | 319 // This interface contains methods that can be used to dynamically access |
350 // and modify the fields of a protocol message. Their semantics are | 320 // and modify the fields of a protocol message. Their semantics are |
351 // similar to the accessors the protocol compiler generates. | 321 // similar to the accessors the protocol compiler generates. |
352 // | 322 // |
353 // To get the Reflection for a given Message, call Message::GetReflection(). | 323 // To get the Reflection for a given Message, call Message::GetReflection(). |
354 // | 324 // |
355 // This interface is separate from Message only for efficiency reasons; | 325 // This interface is separate from Message only for efficiency reasons; |
356 // the vast majority of implementations of Message will share the same | 326 // the vast majority of implementations of Message will share the same |
357 // implementation of Reflection (GeneratedMessageReflection, | 327 // implementation of Reflection (GeneratedMessageReflection, |
358 // defined in generated_message.h), and all Messages of a particular class | 328 // defined in generated_message.h), and all Messages of a particular class |
(...skipping 28 matching lines...) Expand all Loading... |
387 // | 357 // |
388 // TODO(kenton): Create a utility class which callers can use to read and | 358 // TODO(kenton): Create a utility class which callers can use to read and |
389 // write fields from a Reflection without paying attention to the type. | 359 // write fields from a Reflection without paying attention to the type. |
390 class LIBPROTOBUF_EXPORT Reflection { | 360 class LIBPROTOBUF_EXPORT Reflection { |
391 public: | 361 public: |
392 inline Reflection() {} | 362 inline Reflection() {} |
393 virtual ~Reflection(); | 363 virtual ~Reflection(); |
394 | 364 |
395 // Get the UnknownFieldSet for the message. This contains fields which | 365 // Get the UnknownFieldSet for the message. This contains fields which |
396 // were seen when the Message was parsed but were not recognized according | 366 // were seen when the Message was parsed but were not recognized according |
397 // to the Message's definition. For proto3 protos, this method will always | 367 // to the Message's definition. |
398 // return an empty UnknownFieldSet. | |
399 virtual const UnknownFieldSet& GetUnknownFields( | 368 virtual const UnknownFieldSet& GetUnknownFields( |
400 const Message& message) const = 0; | 369 const Message& message) const = 0; |
401 // Get a mutable pointer to the UnknownFieldSet for the message. This | 370 // Get a mutable pointer to the UnknownFieldSet for the message. This |
402 // contains fields which were seen when the Message was parsed but were not | 371 // contains fields which were seen when the Message was parsed but were not |
403 // recognized according to the Message's definition. For proto3 protos, this | 372 // recognized according to the Message's definition. |
404 // method will return a valid mutable UnknownFieldSet pointer but modifying | |
405 // it won't affect the serialized bytes of the message. | |
406 virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; | 373 virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; |
407 | 374 |
408 // Estimate the amount of memory used by the message object. | 375 // Estimate the amount of memory used by the message object. |
409 virtual int SpaceUsed(const Message& message) const = 0; | 376 virtual int SpaceUsed(const Message& message) const = 0; |
410 | 377 |
411 // Check if the given non-repeated field is set. | 378 // Check if the given non-repeated field is set. |
412 virtual bool HasField(const Message& message, | 379 virtual bool HasField(const Message& message, |
413 const FieldDescriptor* field) const = 0; | 380 const FieldDescriptor* field) const = 0; |
414 | 381 |
415 // Get the number of elements of a repeated field. | 382 // Get the number of elements of a repeated field. |
416 virtual int FieldSize(const Message& message, | 383 virtual int FieldSize(const Message& message, |
417 const FieldDescriptor* field) const = 0; | 384 const FieldDescriptor* field) const = 0; |
418 | 385 |
419 // Clear the value of a field, so that HasField() returns false or | 386 // Clear the value of a field, so that HasField() returns false or |
420 // FieldSize() returns zero. | 387 // FieldSize() returns zero. |
421 virtual void ClearField(Message* message, | 388 virtual void ClearField(Message* message, |
422 const FieldDescriptor* field) const = 0; | 389 const FieldDescriptor* field) const = 0; |
423 | 390 |
424 // Check if the oneof is set. Returns true if any field in oneof | |
425 // is set, false otherwise. | |
426 // TODO(jieluo) - make it pure virtual after updating all | |
427 // the subclasses. | |
428 virtual bool HasOneof(const Message& /*message*/, | |
429 const OneofDescriptor* /*oneof_descriptor*/) const { | |
430 return false; | |
431 } | |
432 | |
433 virtual void ClearOneof(Message* /*message*/, | |
434 const OneofDescriptor* /*oneof_descriptor*/) const {} | |
435 | |
436 // Returns the field descriptor if the oneof is set. NULL otherwise. | |
437 // TODO(jieluo) - make it pure virtual. | |
438 virtual const FieldDescriptor* GetOneofFieldDescriptor( | |
439 const Message& /*message*/, | |
440 const OneofDescriptor* /*oneof_descriptor*/) const { | |
441 return NULL; | |
442 } | |
443 | |
444 // Removes the last element of a repeated field. | 391 // Removes the last element of a repeated field. |
445 // We don't provide a way to remove any element other than the last | 392 // We don't provide a way to remove any element other than the last |
446 // because it invites inefficient use, such as O(n^2) filtering loops | 393 // because it invites inefficient use, such as O(n^2) filtering loops |
447 // that should have been O(n). If you want to remove an element other | 394 // that should have been O(n). If you want to remove an element other |
448 // than the last, the best way to do it is to re-arrange the elements | 395 // than the last, the best way to do it is to re-arrange the elements |
449 // (using Swap()) so that the one you want removed is at the end, then | 396 // (using Swap()) so that the one you want removed is at the end, then |
450 // call RemoveLast(). | 397 // call RemoveLast(). |
451 virtual void RemoveLast(Message* message, | 398 virtual void RemoveLast(Message* message, |
452 const FieldDescriptor* field) const = 0; | 399 const FieldDescriptor* field) const = 0; |
453 // Removes the last element of a repeated message field, and returns the | 400 // Removes the last element of a repeated message field, and returns the |
454 // pointer to the caller. Caller takes ownership of the returned pointer. | 401 // pointer to the caller. Caller takes ownership of the returned pointer. |
455 virtual Message* ReleaseLast(Message* message, | 402 virtual Message* ReleaseLast(Message* message, |
456 const FieldDescriptor* field) const = 0; | 403 const FieldDescriptor* field) const = 0; |
457 | 404 |
458 // Swap the complete contents of two messages. | 405 // Swap the complete contents of two messages. |
459 virtual void Swap(Message* message1, Message* message2) const = 0; | 406 virtual void Swap(Message* message1, Message* message2) const = 0; |
460 | 407 |
461 // Swap fields listed in fields vector of two messages. | |
462 virtual void SwapFields(Message* message1, | |
463 Message* message2, | |
464 const std::vector<const FieldDescriptor*>& fields) | |
465 const = 0; | |
466 | |
467 // Swap two elements of a repeated field. | 408 // Swap two elements of a repeated field. |
468 virtual void SwapElements(Message* message, | 409 virtual void SwapElements(Message* message, |
469 const FieldDescriptor* field, | 410 const FieldDescriptor* field, |
470 int index1, | 411 int index1, |
471 int index2) const = 0; | 412 int index2) const = 0; |
472 | 413 |
473 // List all fields of the message which are currently set. This includes | 414 // List all fields of the message which are currently set. This includes |
474 // extensions. Singular fields will only be listed if HasField(field) would | 415 // extensions. Singular fields will only be listed if HasField(field) would |
475 // return true and repeated fields will only be listed if FieldSize(field) | 416 // return true and repeated fields will only be listed if FieldSize(field) |
476 // would return non-zero. Fields (both normal fields and extension fields) | 417 // would return non-zero. Fields (both normal fields and extension fields) |
477 // will be listed ordered by field number. | 418 // will be listed ordered by field number. |
478 virtual void ListFields( | 419 virtual void ListFields(const Message& message, |
479 const Message& message, | 420 vector<const FieldDescriptor*>* output) const = 0; |
480 std::vector<const FieldDescriptor*>* output) const = 0; | |
481 | 421 |
482 // Singular field getters ------------------------------------------ | 422 // Singular field getters ------------------------------------------ |
483 // These get the value of a non-repeated field. They return the default | 423 // These get the value of a non-repeated field. They return the default |
484 // value for fields that aren't set. | 424 // value for fields that aren't set. |
485 | 425 |
486 virtual int32 GetInt32 (const Message& message, | 426 virtual int32 GetInt32 (const Message& message, |
487 const FieldDescriptor* field) const = 0; | 427 const FieldDescriptor* field) const = 0; |
488 virtual int64 GetInt64 (const Message& message, | 428 virtual int64 GetInt64 (const Message& message, |
489 const FieldDescriptor* field) const = 0; | 429 const FieldDescriptor* field) const = 0; |
490 virtual uint32 GetUInt32(const Message& message, | 430 virtual uint32 GetUInt32(const Message& message, |
491 const FieldDescriptor* field) const = 0; | 431 const FieldDescriptor* field) const = 0; |
492 virtual uint64 GetUInt64(const Message& message, | 432 virtual uint64 GetUInt64(const Message& message, |
493 const FieldDescriptor* field) const = 0; | 433 const FieldDescriptor* field) const = 0; |
494 virtual float GetFloat (const Message& message, | 434 virtual float GetFloat (const Message& message, |
495 const FieldDescriptor* field) const = 0; | 435 const FieldDescriptor* field) const = 0; |
496 virtual double GetDouble(const Message& message, | 436 virtual double GetDouble(const Message& message, |
497 const FieldDescriptor* field) const = 0; | 437 const FieldDescriptor* field) const = 0; |
498 virtual bool GetBool (const Message& message, | 438 virtual bool GetBool (const Message& message, |
499 const FieldDescriptor* field) const = 0; | 439 const FieldDescriptor* field) const = 0; |
500 virtual string GetString(const Message& message, | 440 virtual string GetString(const Message& message, |
501 const FieldDescriptor* field) const = 0; | 441 const FieldDescriptor* field) const = 0; |
502 virtual const EnumValueDescriptor* GetEnum( | 442 virtual const EnumValueDescriptor* GetEnum( |
503 const Message& message, const FieldDescriptor* field) const = 0; | 443 const Message& message, const FieldDescriptor* field) const = 0; |
504 | |
505 // GetEnumValue() returns an enum field's value as an integer rather than | |
506 // an EnumValueDescriptor*. If the integer value does not correspond to a | |
507 // known value descriptor, a new value descriptor is created. (Such a value | |
508 // will only be present when the new unknown-enum-value semantics are enabled | |
509 // for a message.) | |
510 virtual int GetEnumValue( | |
511 const Message& message, const FieldDescriptor* field) const; | |
512 | |
513 // See MutableMessage() for the meaning of the "factory" parameter. | 444 // See MutableMessage() for the meaning of the "factory" parameter. |
514 virtual const Message& GetMessage(const Message& message, | 445 virtual const Message& GetMessage(const Message& message, |
515 const FieldDescriptor* field, | 446 const FieldDescriptor* field, |
516 MessageFactory* factory = NULL) const = 0; | 447 MessageFactory* factory = NULL) const = 0; |
517 | 448 |
518 // Get a string value without copying, if possible. | 449 // Get a string value without copying, if possible. |
519 // | 450 // |
520 // GetString() necessarily returns a copy of the string. This can be | 451 // GetString() necessarily returns a copy of the string. This can be |
521 // inefficient when the string is already stored in a string object in the | 452 // inefficient when the string is already stored in a string object in the |
522 // underlying message. GetStringReference() will return a reference to the | 453 // underlying message. GetStringReference() will return a reference to the |
523 // underlying string in this case. Otherwise, it will copy the string into | 454 // underlying string in this case. Otherwise, it will copy the string into |
524 // *scratch and return that. | 455 // *scratch and return that. |
525 // | 456 // |
526 // Note: It is perfectly reasonable and useful to write code like: | 457 // Note: It is perfectly reasonable and useful to write code like: |
527 // str = reflection->GetStringReference(field, &str); | 458 // str = reflection->GetStringReference(field, &str); |
528 // This line would ensure that only one copy of the string is made | 459 // This line would ensure that only one copy of the string is made |
529 // regardless of the field's underlying representation. When initializing | 460 // regardless of the field's underlying representation. When initializing |
530 // a newly-constructed string, though, it's just as fast and more readable | 461 // a newly-constructed string, though, it's just as fast and more readable |
531 // to use code like: | 462 // to use code like: |
532 // string str = reflection->GetString(message, field); | 463 // string str = reflection->GetString(field); |
533 virtual const string& GetStringReference(const Message& message, | 464 virtual const string& GetStringReference(const Message& message, |
534 const FieldDescriptor* field, | 465 const FieldDescriptor* field, |
535 string* scratch) const = 0; | 466 string* scratch) const = 0; |
536 | 467 |
537 | 468 |
538 // Singular field mutators ----------------------------------------- | 469 // Singular field mutators ----------------------------------------- |
539 // These mutate the value of a non-repeated field. | 470 // These mutate the value of a non-repeated field. |
540 | 471 |
541 virtual void SetInt32 (Message* message, | 472 virtual void SetInt32 (Message* message, |
542 const FieldDescriptor* field, int32 value) const = 0; | 473 const FieldDescriptor* field, int32 value) const = 0; |
543 virtual void SetInt64 (Message* message, | 474 virtual void SetInt64 (Message* message, |
544 const FieldDescriptor* field, int64 value) const = 0; | 475 const FieldDescriptor* field, int64 value) const = 0; |
545 virtual void SetUInt32(Message* message, | 476 virtual void SetUInt32(Message* message, |
546 const FieldDescriptor* field, uint32 value) const = 0; | 477 const FieldDescriptor* field, uint32 value) const = 0; |
547 virtual void SetUInt64(Message* message, | 478 virtual void SetUInt64(Message* message, |
548 const FieldDescriptor* field, uint64 value) const = 0; | 479 const FieldDescriptor* field, uint64 value) const = 0; |
549 virtual void SetFloat (Message* message, | 480 virtual void SetFloat (Message* message, |
550 const FieldDescriptor* field, float value) const = 0; | 481 const FieldDescriptor* field, float value) const = 0; |
551 virtual void SetDouble(Message* message, | 482 virtual void SetDouble(Message* message, |
552 const FieldDescriptor* field, double value) const = 0; | 483 const FieldDescriptor* field, double value) const = 0; |
553 virtual void SetBool (Message* message, | 484 virtual void SetBool (Message* message, |
554 const FieldDescriptor* field, bool value) const = 0; | 485 const FieldDescriptor* field, bool value) const = 0; |
555 virtual void SetString(Message* message, | 486 virtual void SetString(Message* message, |
556 const FieldDescriptor* field, | 487 const FieldDescriptor* field, |
557 const string& value) const = 0; | 488 const string& value) const = 0; |
558 virtual void SetEnum (Message* message, | 489 virtual void SetEnum (Message* message, |
559 const FieldDescriptor* field, | 490 const FieldDescriptor* field, |
560 const EnumValueDescriptor* value) const = 0; | 491 const EnumValueDescriptor* value) const = 0; |
561 // Set an enum field's value with an integer rather than EnumValueDescriptor. | |
562 // If the value does not correspond to a known enum value, either behavior is | |
563 // undefined (for proto2 messages), or the value is accepted silently for | |
564 // messages with new unknown-enum-value semantics. | |
565 virtual void SetEnumValue(Message* message, | |
566 const FieldDescriptor* field, | |
567 int value) const; | |
568 | |
569 // Get a mutable pointer to a field with a message type. If a MessageFactory | 492 // Get a mutable pointer to a field with a message type. If a MessageFactory |
570 // is provided, it will be used to construct instances of the sub-message; | 493 // is provided, it will be used to construct instances of the sub-message; |
571 // otherwise, the default factory is used. If the field is an extension that | 494 // otherwise, the default factory is used. If the field is an extension that |
572 // does not live in the same pool as the containing message's descriptor (e.g. | 495 // does not live in the same pool as the containing message's descriptor (e.g. |
573 // it lives in an overlay pool), then a MessageFactory must be provided. | 496 // it lives in an overlay pool), then a MessageFactory must be provided. |
574 // If you have no idea what that meant, then you probably don't need to worry | 497 // If you have no idea what that meant, then you probably don't need to worry |
575 // about it (don't provide a MessageFactory). WARNING: If the | 498 // about it (don't provide a MessageFactory). WARNING: If the |
576 // FieldDescriptor is for a compiled-in extension, then | 499 // FieldDescriptor is for a compiled-in extension, then |
577 // factory->GetPrototype(field->message_type() MUST return an instance of the | 500 // factory->GetPrototype(field->message_type() MUST return an instance of the |
578 // compiled-in class for this type, NOT DynamicMessage. | 501 // compiled-in class for this type, NOT DynamicMessage. |
579 virtual Message* MutableMessage(Message* message, | 502 virtual Message* MutableMessage(Message* message, |
580 const FieldDescriptor* field, | 503 const FieldDescriptor* field, |
581 MessageFactory* factory = NULL) const = 0; | 504 MessageFactory* factory = NULL) const = 0; |
582 // Replaces the message specified by 'field' with the already-allocated object | |
583 // sub_message, passing ownership to the message. If the field contained a | |
584 // message, that message is deleted. If sub_message is NULL, the field is | |
585 // cleared. | |
586 virtual void SetAllocatedMessage(Message* message, | |
587 Message* sub_message, | |
588 const FieldDescriptor* field) const = 0; | |
589 // Releases the message specified by 'field' and returns the pointer, | 505 // Releases the message specified by 'field' and returns the pointer, |
590 // ReleaseMessage() will return the message the message object if it exists. | 506 // ReleaseMessage() will return the message the message object if it exists. |
591 // Otherwise, it may or may not return NULL. In any case, if the return value | 507 // Otherwise, it may or may not return NULL. In any case, if the return value |
592 // is non-NULL, the caller takes ownership of the pointer. | 508 // is non-NULL, the caller takes ownership of the pointer. |
593 // If the field existed (HasField() is true), then the returned pointer will | 509 // If the field existed (HasField() is true), then the returned pointer will |
594 // be the same as the pointer returned by MutableMessage(). | 510 // be the same as the pointer returned by MutableMessage(). |
595 // This function has the same effect as ClearField(). | 511 // This function has the same effect as ClearField(). |
596 virtual Message* ReleaseMessage(Message* message, | 512 virtual Message* ReleaseMessage(Message* message, |
597 const FieldDescriptor* field, | 513 const FieldDescriptor* field, |
598 MessageFactory* factory = NULL) const = 0; | 514 MessageFactory* factory = NULL) const = 0; |
(...skipping 22 matching lines...) Expand all Loading... |
621 int index) const = 0; | 537 int index) const = 0; |
622 virtual bool GetRepeatedBool (const Message& message, | 538 virtual bool GetRepeatedBool (const Message& message, |
623 const FieldDescriptor* field, | 539 const FieldDescriptor* field, |
624 int index) const = 0; | 540 int index) const = 0; |
625 virtual string GetRepeatedString(const Message& message, | 541 virtual string GetRepeatedString(const Message& message, |
626 const FieldDescriptor* field, | 542 const FieldDescriptor* field, |
627 int index) const = 0; | 543 int index) const = 0; |
628 virtual const EnumValueDescriptor* GetRepeatedEnum( | 544 virtual const EnumValueDescriptor* GetRepeatedEnum( |
629 const Message& message, | 545 const Message& message, |
630 const FieldDescriptor* field, int index) const = 0; | 546 const FieldDescriptor* field, int index) const = 0; |
631 // GetRepeatedEnumValue() returns an enum field's value as an integer rather | |
632 // than an EnumValueDescriptor*. If the integer value does not correspond to a | |
633 // known value descriptor, a new value descriptor is created. (Such a value | |
634 // will only be present when the new unknown-enum-value semantics are enabled | |
635 // for a message.) | |
636 virtual int GetRepeatedEnumValue( | |
637 const Message& message, | |
638 const FieldDescriptor* field, int index) const; | |
639 virtual const Message& GetRepeatedMessage( | 547 virtual const Message& GetRepeatedMessage( |
640 const Message& message, | 548 const Message& message, |
641 const FieldDescriptor* field, int index) const = 0; | 549 const FieldDescriptor* field, int index) const = 0; |
642 | 550 |
643 // See GetStringReference(), above. | 551 // See GetStringReference(), above. |
644 virtual const string& GetRepeatedStringReference( | 552 virtual const string& GetRepeatedStringReference( |
645 const Message& message, const FieldDescriptor* field, | 553 const Message& message, const FieldDescriptor* field, |
646 int index, string* scratch) const = 0; | 554 int index, string* scratch) const = 0; |
647 | 555 |
648 | 556 |
(...skipping 20 matching lines...) Expand all Loading... |
669 int index, double value) const = 0; | 577 int index, double value) const = 0; |
670 virtual void SetRepeatedBool (Message* message, | 578 virtual void SetRepeatedBool (Message* message, |
671 const FieldDescriptor* field, | 579 const FieldDescriptor* field, |
672 int index, bool value) const = 0; | 580 int index, bool value) const = 0; |
673 virtual void SetRepeatedString(Message* message, | 581 virtual void SetRepeatedString(Message* message, |
674 const FieldDescriptor* field, | 582 const FieldDescriptor* field, |
675 int index, const string& value) const = 0; | 583 int index, const string& value) const = 0; |
676 virtual void SetRepeatedEnum(Message* message, | 584 virtual void SetRepeatedEnum(Message* message, |
677 const FieldDescriptor* field, int index, | 585 const FieldDescriptor* field, int index, |
678 const EnumValueDescriptor* value) const = 0; | 586 const EnumValueDescriptor* value) const = 0; |
679 // Set an enum field's value with an integer rather than EnumValueDescriptor. | |
680 // If the value does not correspond to a known enum value, either behavior is | |
681 // undefined (for proto2 messages), or the value is accepted silently for | |
682 // messages with new unknown-enum-value semantics. | |
683 virtual void SetRepeatedEnumValue(Message* message, | |
684 const FieldDescriptor* field, int index, | |
685 int value) const; | |
686 // Get a mutable pointer to an element of a repeated field with a message | 587 // Get a mutable pointer to an element of a repeated field with a message |
687 // type. | 588 // type. |
688 virtual Message* MutableRepeatedMessage( | 589 virtual Message* MutableRepeatedMessage( |
689 Message* message, const FieldDescriptor* field, int index) const = 0; | 590 Message* message, const FieldDescriptor* field, int index) const = 0; |
690 | 591 |
691 | 592 |
692 // Repeated field adders ------------------------------------------- | 593 // Repeated field adders ------------------------------------------- |
693 // These add an element to a repeated field. | 594 // These add an element to a repeated field. |
694 | 595 |
695 virtual void AddInt32 (Message* message, | 596 virtual void AddInt32 (Message* message, |
696 const FieldDescriptor* field, int32 value) const = 0; | 597 const FieldDescriptor* field, int32 value) const = 0; |
697 virtual void AddInt64 (Message* message, | 598 virtual void AddInt64 (Message* message, |
698 const FieldDescriptor* field, int64 value) const = 0; | 599 const FieldDescriptor* field, int64 value) const = 0; |
699 virtual void AddUInt32(Message* message, | 600 virtual void AddUInt32(Message* message, |
700 const FieldDescriptor* field, uint32 value) const = 0; | 601 const FieldDescriptor* field, uint32 value) const = 0; |
701 virtual void AddUInt64(Message* message, | 602 virtual void AddUInt64(Message* message, |
702 const FieldDescriptor* field, uint64 value) const = 0; | 603 const FieldDescriptor* field, uint64 value) const = 0; |
703 virtual void AddFloat (Message* message, | 604 virtual void AddFloat (Message* message, |
704 const FieldDescriptor* field, float value) const = 0; | 605 const FieldDescriptor* field, float value) const = 0; |
705 virtual void AddDouble(Message* message, | 606 virtual void AddDouble(Message* message, |
706 const FieldDescriptor* field, double value) const = 0; | 607 const FieldDescriptor* field, double value) const = 0; |
707 virtual void AddBool (Message* message, | 608 virtual void AddBool (Message* message, |
708 const FieldDescriptor* field, bool value) const = 0; | 609 const FieldDescriptor* field, bool value) const = 0; |
709 virtual void AddString(Message* message, | 610 virtual void AddString(Message* message, |
710 const FieldDescriptor* field, | 611 const FieldDescriptor* field, |
711 const string& value) const = 0; | 612 const string& value) const = 0; |
712 virtual void AddEnum (Message* message, | 613 virtual void AddEnum (Message* message, |
713 const FieldDescriptor* field, | 614 const FieldDescriptor* field, |
714 const EnumValueDescriptor* value) const = 0; | 615 const EnumValueDescriptor* value) const = 0; |
715 // Set an enum field's value with an integer rather than EnumValueDescriptor. | |
716 // If the value does not correspond to a known enum value, either behavior is | |
717 // undefined (for proto2 messages), or the value is accepted silently for | |
718 // messages with new unknown-enum-value semantics. | |
719 virtual void AddEnumValue(Message* message, | |
720 const FieldDescriptor* field, | |
721 int value) const; | |
722 // See MutableMessage() for comments on the "factory" parameter. | 616 // See MutableMessage() for comments on the "factory" parameter. |
723 virtual Message* AddMessage(Message* message, | 617 virtual Message* AddMessage(Message* message, |
724 const FieldDescriptor* field, | 618 const FieldDescriptor* field, |
725 MessageFactory* factory = NULL) const = 0; | 619 MessageFactory* factory = NULL) const = 0; |
726 | 620 |
727 | 621 |
728 // Get a RepeatedFieldRef object that can be used to read the underlying | |
729 // repeated field. The type parameter T must be set according to the | |
730 // field's cpp type. The following table shows the mapping from cpp type | |
731 // to acceptable T. | |
732 // | |
733 // field->cpp_type() T | |
734 // CPPTYPE_INT32 int32 | |
735 // CPPTYPE_UINT32 uint32 | |
736 // CPPTYPE_INT64 int64 | |
737 // CPPTYPE_UINT64 uint64 | |
738 // CPPTYPE_DOUBLE double | |
739 // CPPTYPE_FLOAT float | |
740 // CPPTYPE_BOOL bool | |
741 // CPPTYPE_ENUM generated enum type or int32 | |
742 // CPPTYPE_STRING string | |
743 // CPPTYPE_MESSAGE generated message type or google::protobuf::Message | |
744 // | |
745 // A RepeatedFieldRef object can be copied and the resulted object will point | |
746 // to the same repeated field in the same message. The object can be used as | |
747 // long as the message is not destroyed. | |
748 // | |
749 // Note that to use this method users need to include the header file | |
750 // "google/protobuf/reflection.h" (which defines the RepeatedFieldRef | |
751 // class templates). | |
752 template<typename T> | |
753 RepeatedFieldRef<T> GetRepeatedFieldRef( | |
754 const Message& message, const FieldDescriptor* field) const; | |
755 | |
756 // Like GetRepeatedFieldRef() but return an object that can also be used | |
757 // manipulate the underlying repeated field. | |
758 template<typename T> | |
759 MutableRepeatedFieldRef<T> GetMutableRepeatedFieldRef( | |
760 Message* message, const FieldDescriptor* field) const; | |
761 | |
762 // DEPRECATED. Please use Get(Mutable)RepeatedFieldRef() for repeated field | |
763 // access. The following repeated field accesors will be removed in the | |
764 // future. | |
765 // | |
766 // Repeated field accessors ------------------------------------------------- | 622 // Repeated field accessors ------------------------------------------------- |
767 // The methods above, e.g. GetRepeatedInt32(msg, fd, index), provide singular | 623 // The methods above, e.g. GetRepeatedInt32(msg, fd, index), provide singular |
768 // access to the data in a RepeatedField. The methods below provide aggregate | 624 // access to the data in a RepeatedField. The methods below provide aggregate |
769 // access by exposing the RepeatedField object itself with the Message. | 625 // access by exposing the RepeatedField object itself with the Message. |
770 // Applying these templates to inappropriate types will lead to an undefined | 626 // Applying these templates to inappropriate types will lead to an undefined |
771 // reference at link time (e.g. GetRepeatedField<***double>), or possibly a | 627 // reference at link time (e.g. GetRepeatedField<***double>), or possibly a |
772 // template matching error at compile time (e.g. GetRepeatedPtrField<File>). | 628 // template matching error at compile time (e.g. GetRepeatedPtrField<File>). |
773 // | 629 // |
774 // Usage example: my_doubs = refl->GetRepeatedField<double>(msg, fd); | 630 // Usage example: my_doubs = refl->GetRepeatedField<double>(msg, fd); |
775 | 631 |
776 // DEPRECATED. Please use GetRepeatedFieldRef(). | |
777 // | |
778 // for T = Cord and all protobuf scalar types except enums. | 632 // for T = Cord and all protobuf scalar types except enums. |
779 template<typename T> | 633 template<typename T> |
780 const RepeatedField<T>& GetRepeatedField( | 634 const RepeatedField<T>& GetRepeatedField( |
781 const Message&, const FieldDescriptor*) const; | 635 const Message&, const FieldDescriptor*) const; |
782 | 636 |
783 // DEPRECATED. Please use GetMutableRepeatedFieldRef(). | |
784 // | |
785 // for T = Cord and all protobuf scalar types except enums. | 637 // for T = Cord and all protobuf scalar types except enums. |
786 template<typename T> | 638 template<typename T> |
787 RepeatedField<T>* MutableRepeatedField( | 639 RepeatedField<T>* MutableRepeatedField( |
788 Message*, const FieldDescriptor*) const; | 640 Message*, const FieldDescriptor*) const; |
789 | 641 |
790 // DEPRECATED. Please use GetRepeatedFieldRef(). | |
791 // | |
792 // for T = string, google::protobuf::internal::StringPieceField | 642 // for T = string, google::protobuf::internal::StringPieceField |
793 // google::protobuf::Message & descendants. | 643 // google::protobuf::Message & descendants. |
794 template<typename T> | 644 template<typename T> |
795 const RepeatedPtrField<T>& GetRepeatedPtrField( | 645 const RepeatedPtrField<T>& GetRepeatedPtrField( |
796 const Message&, const FieldDescriptor*) const; | 646 const Message&, const FieldDescriptor*) const; |
797 | 647 |
798 // DEPRECATED. Please use GetMutableRepeatedFieldRef(). | |
799 // | |
800 // for T = string, google::protobuf::internal::StringPieceField | 648 // for T = string, google::protobuf::internal::StringPieceField |
801 // google::protobuf::Message & descendants. | 649 // google::protobuf::Message & descendants. |
802 template<typename T> | 650 template<typename T> |
803 RepeatedPtrField<T>* MutableRepeatedPtrField( | 651 RepeatedPtrField<T>* MutableRepeatedPtrField( |
804 Message*, const FieldDescriptor*) const; | 652 Message*, const FieldDescriptor*) const; |
805 | 653 |
806 // Extensions ---------------------------------------------------------------- | 654 // Extensions ---------------------------------------------------------------- |
807 | 655 |
808 // Try to find an extension of this message type by fully-qualified field | 656 // Try to find an extension of this message type by fully-qualified field |
809 // name. Returns NULL if no extension is known for this name or number. | 657 // name. Returns NULL if no extension is known for this name or number. |
810 virtual const FieldDescriptor* FindKnownExtensionByName( | 658 virtual const FieldDescriptor* FindKnownExtensionByName( |
811 const string& name) const = 0; | 659 const string& name) const = 0; |
812 | 660 |
813 // Try to find an extension of this message type by field number. | 661 // Try to find an extension of this message type by field number. |
814 // Returns NULL if no extension is known for this name or number. | 662 // Returns NULL if no extension is known for this name or number. |
815 virtual const FieldDescriptor* FindKnownExtensionByNumber( | 663 virtual const FieldDescriptor* FindKnownExtensionByNumber( |
816 int number) const = 0; | 664 int number) const = 0; |
817 | 665 |
818 // Feature Flags ------------------------------------------------------------- | |
819 | |
820 // Does this message support storing arbitrary integer values in enum fields? | |
821 // If |true|, GetEnumValue/SetEnumValue and associated repeated-field versions | |
822 // take arbitrary integer values, and the legacy GetEnum() getter will | |
823 // dynamically create an EnumValueDescriptor for any integer value without | |
824 // one. If |false|, setting an unknown enum value via the integer-based | |
825 // setters results in undefined behavior (in practice, GOOGLE_DCHECK-fails). | |
826 // | |
827 // Generic code that uses reflection to handle messages with enum fields | |
828 // should check this flag before using the integer-based setter, and either | |
829 // downgrade to a compatible value or use the UnknownFieldSet if not. For | |
830 // example: | |
831 // | |
832 // int new_value = GetValueFromApplicationLogic(); | |
833 // if (reflection->SupportsUnknownEnumValues()) { | |
834 // reflection->SetEnumValue(message, field, new_value); | |
835 // } else { | |
836 // if (field_descriptor->enum_type()-> | |
837 // FindValueByNumver(new_value) != NULL) { | |
838 // reflection->SetEnumValue(message, field, new_value); | |
839 // } else if (emit_unknown_enum_values) { | |
840 // reflection->MutableUnknownFields(message)->AddVarint( | |
841 // field->number(), | |
842 // new_value); | |
843 // } else { | |
844 // // convert value to a compatible/default value. | |
845 // new_value = CompatibleDowngrade(new_value); | |
846 // reflection->SetEnumValue(message, field, new_value); | |
847 // } | |
848 // } | |
849 virtual bool SupportsUnknownEnumValues() const { return false; } | |
850 | |
851 // Returns the MessageFactory associated with this message. This can be | |
852 // useful for determining if a message is a generated message or not, for | |
853 // example: | |
854 // | |
855 // if (message->GetReflection()->GetMessageFactory() == | |
856 // google::protobuf::MessageFactory::generated_factory()) { | |
857 // // This is a generated message. | |
858 // } | |
859 // | |
860 // It can also be used to create more messages of this type, though | |
861 // Message::New() is an easier way to accomplish this. | |
862 virtual MessageFactory* GetMessageFactory() const; | |
863 | |
864 // --------------------------------------------------------------------------- | 666 // --------------------------------------------------------------------------- |
865 | 667 |
866 protected: | 668 protected: |
867 // Obtain a pointer to a Repeated Field Structure and do some type checking: | 669 // Obtain a pointer to a Repeated Field Structure and do some type checking: |
868 // on field->cpp_type(), | 670 // on field->cpp_type(), |
869 // on field->field_option().ctype() (if ctype >= 0) | 671 // on field->field_option().ctype() (if ctype >= 0) |
870 // of field->message_type() (if message_type != NULL). | 672 // of field->message_type() (if message_type != NULL). |
871 // We use 1 routine rather than 4 (const vs mutable) x (scalar vs pointer). | 673 // We use 1 routine rather than 4 (const vs mutable) x (scalar vs pointer). |
872 virtual void* MutableRawRepeatedField( | 674 virtual void* MutableRawRepeatedField( |
873 Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, | 675 Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, |
874 int ctype, const Descriptor* message_type) const = 0; | 676 int ctype, const Descriptor* message_type) const = 0; |
875 | 677 |
876 // The following methods are used to implement (Mutable)RepeatedFieldRef. | |
877 // A Ref object will store a raw pointer to the repeated field data (obtained | |
878 // from RepeatedFieldData()) and a pointer to a Accessor (obtained from | |
879 // RepeatedFieldAccessor) which will be used to access the raw data. | |
880 // | |
881 // TODO(xiaofeng): Make these methods pure-virtual. | |
882 | |
883 // Returns a raw pointer to the repeated field | |
884 // | |
885 // "cpp_type" and "message_type" are decuded from the type parameter T passed | |
886 // to Get(Mutable)RepeatedFieldRef. If T is a generated message type, | |
887 // "message_type" should be set to its descriptor. Otherwise "message_type" | |
888 // should be set to NULL. Implementations of this method should check whether | |
889 // "cpp_type"/"message_type" is consistent with the actual type of the field. | |
890 virtual void* RepeatedFieldData( | |
891 Message* message, const FieldDescriptor* field, | |
892 FieldDescriptor::CppType cpp_type, | |
893 const Descriptor* message_type) const; | |
894 | |
895 // The returned pointer should point to a singleton instance which implements | |
896 // the RepeatedFieldAccessor interface. | |
897 virtual const internal::RepeatedFieldAccessor* RepeatedFieldAccessor( | |
898 const FieldDescriptor* field) const; | |
899 | |
900 private: | 678 private: |
901 template<typename T, typename Enable> | |
902 friend class RepeatedFieldRef; | |
903 template<typename T, typename Enable> | |
904 friend class MutableRepeatedFieldRef; | |
905 | |
906 // Special version for specialized implementations of string. We can't call | 679 // Special version for specialized implementations of string. We can't call |
907 // MutableRawRepeatedField directly here because we don't have access to | 680 // MutableRawRepeatedField directly here because we don't have access to |
908 // FieldOptions::* which are defined in descriptor.pb.h. Including that | 681 // FieldOptions::* which are defined in descriptor.pb.h. Including that |
909 // file here is not possible because it would cause a circular include cycle. | 682 // file here is not possible because it would cause a circular include cycle. |
910 void* MutableRawRepeatedString( | 683 void* MutableRawRepeatedString( |
911 Message* message, const FieldDescriptor* field, bool is_string) const; | 684 Message* message, const FieldDescriptor* field, bool is_string) const; |
912 | 685 |
913 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); | 686 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); |
914 }; | 687 }; |
915 | 688 |
916 // Abstract interface for a factory for message objects. | 689 // Abstract interface for a factory for message objects. |
917 class LIBPROTOBUF_EXPORT MessageFactory { | 690 class LIBPROTOBUF_EXPORT MessageFactory { |
918 public: | 691 public: |
919 inline MessageFactory() {} | 692 inline MessageFactory() {} |
920 virtual ~MessageFactory(); | 693 virtual ~MessageFactory(); |
921 | 694 |
922 // Given a Descriptor, gets or constructs the default (prototype) Message | 695 // Given a Descriptor, gets or constructs the default (prototype) Message |
923 // of that type. You can then call that message's New() method to construct | 696 // of that type. You can then call that message's New() method to construct |
924 // a mutable message of that type. | 697 // a mutable message of that type. |
925 // | 698 // |
926 // Calling this method twice with the same Descriptor returns the same | 699 // Calling this method twice with the same Descriptor returns the same |
927 // object. The returned object remains property of the factory. Also, any | 700 // object. The returned object remains property of the factory. Also, any |
928 // objects created by calling the prototype's New() method share some data | 701 // objects created by calling the prototype's New() method share some data |
929 // with the prototype, so these must be destroyed before the MessageFactory | 702 // with the prototype, so these must be destoyed before the MessageFactory |
930 // is destroyed. | 703 // is destroyed. |
931 // | 704 // |
932 // The given descriptor must outlive the returned message, and hence must | 705 // The given descriptor must outlive the returned message, and hence must |
933 // outlive the MessageFactory. | 706 // outlive the MessageFactory. |
934 // | 707 // |
935 // Some implementations do not support all types. GetPrototype() will | 708 // Some implementations do not support all types. GetPrototype() will |
936 // return NULL if the descriptor passed in is not supported. | 709 // return NULL if the descriptor passed in is not supported. |
937 // | 710 // |
938 // This method may or may not be thread-safe depending on the implementation. | 711 // This method may or may not be thread-safe depending on the implementation. |
939 // Each implementation should document its own degree thread-safety. | 712 // Each implementation should document its own degree thread-safety. |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 } | 823 } |
1051 | 824 |
1052 template<typename PB> | 825 template<typename PB> |
1053 inline RepeatedPtrField<PB>* Reflection::MutableRepeatedPtrField( | 826 inline RepeatedPtrField<PB>* Reflection::MutableRepeatedPtrField( |
1054 Message* message, const FieldDescriptor* field) const { | 827 Message* message, const FieldDescriptor* field) const { |
1055 return static_cast<RepeatedPtrField<PB>* >( | 828 return static_cast<RepeatedPtrField<PB>* >( |
1056 MutableRawRepeatedField(message, field, | 829 MutableRawRepeatedField(message, field, |
1057 FieldDescriptor::CPPTYPE_MESSAGE, -1, | 830 FieldDescriptor::CPPTYPE_MESSAGE, -1, |
1058 PB::default_instance().GetDescriptor())); | 831 PB::default_instance().GetDescriptor())); |
1059 } | 832 } |
| 833 |
1060 } // namespace protobuf | 834 } // namespace protobuf |
1061 | 835 |
1062 } // namespace google | 836 } // namespace google |
1063 #endif // GOOGLE_PROTOBUF_MESSAGE_H__ | 837 #endif // GOOGLE_PROTOBUF_MESSAGE_H__ |
OLD | NEW |