1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <algorithm> 36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <set> 37a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/descriptor.pb.h> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/generated_message_reflection.h> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/repeated_field.h> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/extension_set.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/generated_message_util.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define GOOGLE_PROTOBUF_HAS_ONEOF 46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal { 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint StringSpaceUsedExcludingSelf(const string& str) { 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const void* start = &str; 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const void* end = &str + 1; 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (start <= str.data() && str.data() < end) { 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The string's data is stored inside the string object itself. 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 0; 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return str.capacity(); 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ParseNamedEnum(const EnumDescriptor* descriptor, 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int* value) { 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* d = descriptor->FindValueByName(name); 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (d == NULL) return false; 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *value = d->number(); 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return true; 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& NameOfEnum(const EnumDescriptor* descriptor, int value) { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* d = descriptor->FindValueByNumber(value); 74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return (d == NULL ? GetEmptyString() : d->name()); 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Helpers for reporting usage errors (e.g. trying to use GetInt32() on 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a string field). 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ReportReflectionUsageError( 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor, const FieldDescriptor* field, 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* method, const char* description) { 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_LOG(FATAL) 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "Protocol Buffer reflection usage error:\n" 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::" << method << "\n" 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: " << descriptor->full_name() << "\n" 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : " << field->full_name() << "\n" 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : " << description; 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = { 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "INVALID_CPPTYPE", 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_INT32", 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_INT64", 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_UINT32", 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_UINT64", 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_DOUBLE", 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_FLOAT", 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_BOOL", 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_ENUM", 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_STRING", 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "CPPTYPE_MESSAGE" 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void ReportReflectionUsageTypeError( 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor, const FieldDescriptor* field, 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* method, 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor::CppType expected_type) { 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_LOG(FATAL) 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "Protocol Buffer reflection usage error:\n" 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::" << method << "\n" 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: " << descriptor->full_name() << "\n" 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : " << field->full_name() << "\n" 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field is not the right type for this message:\n" 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Expected : " << cpptype_names_[expected_type] << "\n" 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field type: " << cpptype_names_[field->cpp_type()]; 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void ReportReflectionUsageEnumTypeError( 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor, const FieldDescriptor* field, 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* method, const EnumValueDescriptor* value) { 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_LOG(FATAL) 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "Protocol Buffer reflection usage error:\n" 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::" << method << "\n" 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: " << descriptor->full_name() << "\n" 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : " << field->full_name() << "\n" 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Enum value did not match field type:\n" 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Expected : " << field->enum_type()->full_name() << "\n" 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Actual : " << value->full_name(); 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION) \ 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (!(CONDITION)) \ 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION) 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION) \ 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION) 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION) \ 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION) 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_TYPE(METHOD, CPPTYPE) \ 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE) \ 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ReportReflectionUsageTypeError(descriptor_, field, #METHOD, \ 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor::CPPTYPE_##CPPTYPE) 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_ENUM_VALUE(METHOD) \ 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (value->type() != field->enum_type()) \ 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value) 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_MESSAGE_TYPE(METHOD) \ 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_EQ(field->containing_type(), descriptor_, \ 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville METHOD, "Field does not match message type."); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_SINGULAR(METHOD) \ 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Field is repeated; the method requires a singular field.") 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_REPEATED(METHOD) \ 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Field is singular; the method requires a repeated field.") 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE) \ 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_MESSAGE_TYPE(METHOD); \ 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_##LABEL(METHOD); \ 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_TYPE(METHOD, CPPTYPE) 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratedMessageReflection::GeneratedMessageReflection( 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor, 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message* default_instance, 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const int offsets[], 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int has_bits_offset, 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int unknown_fields_offset, 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int extensions_offset, 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const DescriptorPool* descriptor_pool, 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageFactory* factory, 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int object_size) 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : descriptor_ (descriptor), 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville default_instance_ (default_instance), 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville offsets_ (offsets), 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville has_bits_offset_ (has_bits_offset), 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields_offset_(unknown_fields_offset), 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extensions_offset_(extensions_offset), 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville object_size_ (object_size), 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville descriptor_pool_ ((descriptor_pool == NULL) ? 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool::generated_pool() : 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville descriptor_pool), 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_factory_ (factory) { 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGeneratedMessageReflection::GeneratedMessageReflection( 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor, 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message* default_instance, 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const int offsets[], 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int has_bits_offset, 199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int unknown_fields_offset, 200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int extensions_offset, 201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const void* default_oneof_instance, 202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int oneof_case_offset, 203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const DescriptorPool* descriptor_pool, 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MessageFactory* factory, 205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int object_size) 206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : descriptor_ (descriptor), 207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default_instance_ (default_instance), 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default_oneof_instance_ (default_oneof_instance), 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson offsets_ (offsets), 210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson has_bits_offset_ (has_bits_offset), 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_case_offset_(oneof_case_offset), 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unknown_fields_offset_(unknown_fields_offset), 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson extensions_offset_(extensions_offset), 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson object_size_ (object_size), 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor_pool_ ((descriptor_pool == NULL) ? 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool::generated_pool() : 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor_pool), 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message_factory_ (factory) { 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratedMessageReflection::~GeneratedMessageReflection() {} 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields( 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message) const { 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const void* ptr = reinterpret_cast<const uint8*>(&message) + 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields_offset_; 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return *reinterpret_cast<const UnknownFieldSet*>(ptr); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleUnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields( 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message) const { 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void* ptr = reinterpret_cast<uint8*>(message) + unknown_fields_offset_; 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return reinterpret_cast<UnknownFieldSet*>(ptr); 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint GeneratedMessageReflection::SpaceUsed(const Message& message) const { 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // object_size_ already includes the in-memory representation of each field 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in the message, so we only need to account for additional memory used by 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the fields. 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int total_size = object_size_; 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville total_size += GetUnknownFields(message).SpaceUsedExcludingSelf(); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (extensions_offset_ != -1) { 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville total_size += GetExtensionSet(message).SpaceUsedExcludingSelf(); 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < descriptor_->field_count(); i++) { 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field = descriptor_->field(i); 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_repeated()) { 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field) \ 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .SpaceUsedExcludingSelf(); \ 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT32, int32); 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT64, int64); 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT32, uint32); 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT64, uint64); 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(DOUBLE, double); 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( FLOAT, float); 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( BOOL, bool); 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( ENUM, int); 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: 269d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 270d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 271d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 272d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville total_size += GetRaw<RepeatedPtrField<string> >(message, field) 273d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .SpaceUsedExcludingSelf(); 274d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 275d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We don't know which subclass of RepeatedPtrFieldBase the type is, 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // so we use RepeatedPtrFieldBase directly. 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville total_size += 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetRaw<RepeatedPtrFieldBase>(message, field) 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .SpaceUsedExcludingSelf<GenericTypeHandler<Message> >(); 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof() && !HasOneofField(message, field)) { 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson continue; 289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_INT32 : 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_INT64 : 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_UINT32: 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_UINT64: 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_DOUBLE: 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_FLOAT : 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_BOOL : 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_ENUM : 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Field is inline, so we've already counted it. 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: { 303d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 304d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 305d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: { 306d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const string* ptr = GetField<const string*>(message, field); 307d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 308d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Initially, the string points to the default value stored in 309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // the prototype. Only count the string if it has been changed 310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // from the default value. 311d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const string* default_ptr = DefaultRaw<const string*>(field); 312d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 313d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (ptr != default_ptr) { 314d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // string fields are represented by just a pointer, so also 315d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // include sizeof(string) as well. 316d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr); 317d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 318d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 320d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (&message == default_instance_) { 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For singular fields, the prototype just stores a pointer to the 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // external type's prototype, so there is no extra memory usage. 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message* sub_message = GetRaw<const Message*>(message, field); 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (sub_message != NULL) { 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville total_size += sub_message->SpaceUsed(); 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return total_size; 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SwapField( 343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message1, 344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message2, 345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field) const { 346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->is_repeated()) { 347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field->cpp_type()) { 348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SWAP_ARRAYS(CPPTYPE, TYPE) \ 349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap( \ 351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableRaw<RepeatedField<TYPE> >(message2, field)); \ 352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(INT32 , int32 ); 355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(INT64 , int64 ); 356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(UINT32, uint32); 357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(UINT64, uint64); 358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(FLOAT , float ); 359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(DOUBLE, double); 360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(BOOL , bool ); 361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_ARRAYS(ENUM , int ); 362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SWAP_ARRAYS 363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_STRING: 365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_MESSAGE: 366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableRaw<RepeatedPtrFieldBase>(message1, field)->Swap( 367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableRaw<RepeatedPtrFieldBase>(message2, field)); 368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); 372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field->cpp_type()) { 375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SWAP_VALUES(CPPTYPE, TYPE) \ 376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson std::swap(*MutableRaw<TYPE>(message1, field), \ 378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableRaw<TYPE>(message2, field)); \ 379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(INT32 , int32 ); 382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(INT64 , int64 ); 383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(UINT32, uint32); 384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(UINT64, uint64); 385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(FLOAT , float ); 386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(DOUBLE, double); 387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(BOOL , bool ); 388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SWAP_VALUES(ENUM , int ); 389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SWAP_VALUES 390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_MESSAGE: 391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson std::swap(*MutableRaw<Message*>(message1, field), 392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableRaw<Message*>(message2, field)); 393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_STRING: 396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field->options().ctype()) { 397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: // TODO(kenton): Support other string reps. 398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldOptions::STRING: 399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson std::swap(*MutableRaw<string*>(message1, field), 400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableRaw<string*>(message2, field)); 401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); 407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SwapOneofField( 412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message1, 413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message2, 414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* oneof_descriptor) const { 415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor); 416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor); 417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int32 temp_int32; 419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int64 temp_int64; 420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson uint32 temp_uint32; 421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson uint64 temp_uint64; 422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson float temp_float; 423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson double temp_double; 424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool temp_bool; 425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int temp_int; 426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* temp_message; 427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson string temp_string; 428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Stores message1's oneof field to a temp variable. 430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field1; 431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (oneof_case1 > 0) { 432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field1 = descriptor_->FindFieldByNumber(oneof_case1); 433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson //oneof_descriptor->field(oneof_case1); 434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field1->cpp_type()) { 435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define GET_TEMP_VALUE(CPPTYPE, TYPE) \ 436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson temp_##TYPE = GetField<TYPE>(*message1, field1); \ 438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(INT32 , int32 ); 441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(INT64 , int64 ); 442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(UINT32, uint32); 443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(UINT64, uint64); 444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(FLOAT , float ); 445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(DOUBLE, double); 446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(BOOL , bool ); 447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GET_TEMP_VALUE(ENUM , int ); 448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef GET_TEMP_VALUE 449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_MESSAGE: 450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson temp_message = ReleaseMessage(message1, field1); 451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_STRING: 454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson temp_string = GetString(*message1, field1); 455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); 459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Sets message1's oneof field from the message2's oneof field. 463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (oneof_case2 > 0) { 464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field2 = 465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor_->FindFieldByNumber(oneof_case2); 466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field2->cpp_type()) { 467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SET_ONEOF_VALUE1(CPPTYPE, TYPE) \ 468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetField<TYPE>(message1, field2, GetField<TYPE>(*message2, field2)); \ 470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(INT32 , int32 ); 473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(INT64 , int64 ); 474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(UINT32, uint32); 475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(UINT64, uint64); 476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(FLOAT , float ); 477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(DOUBLE, double); 478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(BOOL , bool ); 479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE1(ENUM , int ); 480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SET_ONEOF_VALUE1 481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_MESSAGE: 482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetAllocatedMessage(message1, 483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ReleaseMessage(message2, field2), 484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field2); 485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_STRING: 488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetString(message1, field2, GetString(*message2, field2)); 489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Unimplemented type: " << field2->cpp_type(); 493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message1, oneof_descriptor); 496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Sets message2's oneof field from the temp variable. 499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (oneof_case1 > 0) { 500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field1->cpp_type()) { 501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SET_ONEOF_VALUE2(CPPTYPE, TYPE) \ 502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetField<TYPE>(message2, field1, temp_##TYPE); \ 504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(INT32 , int32 ); 507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(INT64 , int64 ); 508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(UINT32, uint32); 509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(UINT64, uint64); 510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(FLOAT , float ); 511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(DOUBLE, double); 512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(BOOL , bool ); 513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SET_ONEOF_VALUE2(ENUM , int ); 514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SET_ONEOF_VALUE2 515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_MESSAGE: 516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetAllocatedMessage(message2, temp_message, field1); 517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_STRING: 520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetString(message2, field1, temp_string); 521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); 525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message2, oneof_descriptor); 528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::Swap( 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message1, 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message2) const { 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (message1 == message2) return; 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(kenton): Other Reflection methods should probably check this too. 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_EQ(message1->GetReflection(), this) 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "First argument to Swap() (of type \"" 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << message1->GetDescriptor()->full_name() 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "\") is not compatible with this reflection object (which is for type \"" 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << descriptor_->full_name() 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "\"). Note that the exact same class is required; not just the same " 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "descriptor."; 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_EQ(message2->GetReflection(), this) 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "Second argument to Swap() (of type \"" 546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << message2->GetDescriptor()->full_name() 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "\") is not compatible with this reflection object (which is for type \"" 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << descriptor_->full_name() 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "\"). Note that the exact same class is required; not just the same " 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "descriptor."; 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint32* has_bits1 = MutableHasBits(message1); 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint32* has_bits2 = MutableHasBits(message2); 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int has_bits_size = (descriptor_->field_count() + 31) / 32; 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < has_bits_size; i++) { 557d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville std::swap(has_bits1[i], has_bits2[i]); 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < descriptor_->field_count(); i++) { 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field = descriptor_->field(i); 562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (!field->containing_oneof()) { 563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SwapField(message1, message2, field); 564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { 568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SwapOneofField(message1, message2, descriptor_->oneof_decl(i)); 569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (extensions_offset_ != -1) { 572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2)); 573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2)); 576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SwapFields( 579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message1, 580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message2, 581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const vector<const FieldDescriptor*>& fields) const { 582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (message1 == message2) return; 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TODO(kenton): Other Reflection methods should probably check this too. 585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_EQ(message1->GetReflection(), this) 586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << "First argument to SwapFields() (of type \"" 587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << message1->GetDescriptor()->full_name() 588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << "\") is not compatible with this reflection object (which is for type \"" 589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << descriptor_->full_name() 590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << "\"). Note that the exact same class is required; not just the same " 591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "descriptor."; 592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_EQ(message2->GetReflection(), this) 593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << "Second argument to SwapFields() (of type \"" 594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << message2->GetDescriptor()->full_name() 595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << "\") is not compatible with this reflection object (which is for type \"" 596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << descriptor_->full_name() 597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << "\"). Note that the exact same class is required; not just the same " 598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "descriptor."; 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson std::set<int> swapped_oneof; 601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for (int i = 0; i < fields.size(); i++) { 603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = fields[i]; 604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->is_extension()) { 605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableExtensionSet(message1)->SwapExtension( 606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableExtensionSet(message2), 607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->number()); 608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof()) { 610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int oneof_index = field->containing_oneof()->index(); 611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Only swap the oneof field once. 612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) { 613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson continue; 614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson swapped_oneof.insert(oneof_index); 616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SwapOneofField(message1, message2, field->containing_oneof()); 617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Swap has bit. 619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SwapBit(message1, message2, field); 620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Swap field. 621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SwapField(message1, message2, field); 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool GeneratedMessageReflection::HasField(const Message& message, 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const { 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_MESSAGE_TYPE(HasField); 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_SINGULAR(HasField); 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).Has(field->number()); 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof()) { 638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return HasOneofField(message, field); 639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return HasBit(message, field); 641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint GeneratedMessageReflection::FieldSize(const Message& message, 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const { 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_MESSAGE_TYPE(FieldSize); 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_REPEATED(FieldSize); 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).ExtensionSize(field->number()); 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetRaw<RepeatedField<LOWERCASE> >(message, field).size() 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT32, int32); 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT64, int64); 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT32, uint32); 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT64, uint64); 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(DOUBLE, double); 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( FLOAT, float); 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( BOOL, bool); 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( ENUM, int); 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetRaw<RepeatedPtrFieldBase>(message, field).size(); 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_LOG(FATAL) << "Can't get here."; 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 0; 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::ClearField( 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field) const { 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_MESSAGE_TYPE(ClearField); 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->ClearExtension(field->number()); 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else if (!field->is_repeated()) { 685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof()) { 686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneofField(message, field); 687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return; 688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (HasBit(*message, field)) { 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ClearBit(message, field); 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We need to set the field back to its default value. 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define CLEAR_TYPE(CPPTYPE, TYPE) \ 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *MutableRaw<TYPE>(message, field) = \ 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->default_value_##TYPE(); \ 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLEAR_TYPE(INT32 , int32 ); 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLEAR_TYPE(INT64 , int64 ); 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLEAR_TYPE(UINT32, uint32); 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLEAR_TYPE(UINT64, uint64); 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLEAR_TYPE(FLOAT , float ); 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLEAR_TYPE(DOUBLE, double); 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLEAR_TYPE(BOOL , bool ); 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef CLEAR_TYPE 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_ENUM: 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *MutableRaw<int>(message, field) = 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->default_value_enum()->number(); 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: { 716d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 717d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 718d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 719d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const string* default_ptr = DefaultRaw<const string*>(field); 720d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string** value = MutableRaw<string*>(message, field); 721d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (*value != default_ptr) { 722d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (field->has_default_value()) { 723d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville (*value)->assign(field->default_value_string()); 724d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } else { 725d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville (*value)->clear(); 726d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 728d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 729d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*MutableRaw<Message*>(message, field))->Clear(); 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear(); \ 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT32, int32); 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT64, int64); 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT32, uint32); 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT64, uint64); 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(DOUBLE, double); 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( FLOAT, float); 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( BOOL, bool); 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( ENUM, int); 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: { 756d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 757d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 759d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MutableRaw<RepeatedPtrField<string> >(message, field)->Clear(); 760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 761d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: { 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We don't know which subclass of RepeatedPtrFieldBase the type is, 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // so we use RepeatedPtrFieldBase directly. 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedPtrFieldBase>(message, field) 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->Clear<GenericTypeHandler<Message> >(); 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::RemoveLast( 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const { 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_MESSAGE_TYPE(RemoveLast); 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_REPEATED(RemoveLast); 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->RemoveLast(field->number()); 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast(); \ 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT32, int32); 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT64, int64); 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT32, uint32); 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT64, uint64); 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(DOUBLE, double); 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( FLOAT, float); 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( BOOL, bool); 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( ENUM, int); 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: 802d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 803d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 804d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 805d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MutableRaw<RepeatedPtrField<string> >(message, field)->RemoveLast(); 806d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 807d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedPtrFieldBase>(message, field) 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->RemoveLast<GenericTypeHandler<Message> >(); 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessage* GeneratedMessageReflection::ReleaseLast( 819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, 820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field) const { 821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE); 822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->is_extension()) { 824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return static_cast<Message*>( 825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableExtensionSet(message)->ReleaseLast(field->number())); 826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return MutableRaw<RepeatedPtrFieldBase>(message, field) 828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ->ReleaseLast<GenericTypeHandler<Message> >(); 829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SwapElements( 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index1, 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index2) const { 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_MESSAGE_TYPE(Swap); 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_REPEATED(Swap); 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->SwapElements(field->number(), index1, index2); 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedField<LOWERCASE> >(message, field) \ 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->SwapElements(index1, index2); \ 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT32, int32); 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( INT64, int64); 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT32, uint32); 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(UINT64, uint64); 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE(DOUBLE, double); 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( FLOAT, float); 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( BOOL, bool); 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HANDLE_TYPE( ENUM, int); 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedPtrFieldBase>(message, field) 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->SwapElements(index1, index2); 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break; 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Comparison functor for sorting FieldDescriptors by field number. 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct FieldNumberSorter { 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool operator()(const FieldDescriptor* left, 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* right) const { 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return left->number() < right->number(); 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::ListFields( 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*>* output) const { 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->clear(); 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Optimization: The default instance never has any fields set. 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (&message == default_instance_) return; 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < descriptor_->field_count(); i++) { 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field = descriptor_->field(i); 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_repeated()) { 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (FieldSize(message, field) > 0) { 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->push_back(field); 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 894a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof()) { 895a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (HasOneofField(message, field)) { 896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson output->push_back(field); 897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else if (HasBit(message, field)) { 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->push_back(field); 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (extensions_offset_ != -1) { 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_, 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output); 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ListFields() must sort output by field number. 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sort(output->begin(), output->end(), FieldNumberSorter()); 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef DEFINE_PRIMITIVE_ACCESSORS 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE) \ 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville PASSTYPE GeneratedMessageReflection::Get##TYPENAME( \ 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field) const { \ 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE); \ 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { \ 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).Get##TYPENAME( \ 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->number(), field->default_value_##PASSTYPE()); \ 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { \ 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetField<TYPE>(message, field); \ 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void GeneratedMessageReflection::Set##TYPENAME( \ 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, \ 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville PASSTYPE value) const { \ 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE); \ 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { \ 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return MutableExtensionSet(message)->Set##TYPENAME( \ 934d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field->number(), field->type(), value, field); \ 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { \ 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetField<TYPE>(message, field, value); \ 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME( \ 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, \ 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int index) const { \ 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE); \ 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { \ 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).GetRepeated##TYPENAME( \ 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->number(), index); \ 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { \ 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetRepeatedField<TYPE>(message, field, index); \ 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void GeneratedMessageReflection::SetRepeated##TYPENAME( \ 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, \ 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, PASSTYPE value) const { \ 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE); \ 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { \ 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->SetRepeated##TYPENAME( \ 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->number(), index, value); \ 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { \ 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetRepeatedField<TYPE>(message, field, index, value); \ 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void GeneratedMessageReflection::Add##TYPENAME( \ 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, \ 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville PASSTYPE value) const { \ 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE); \ 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { \ 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->Add##TYPENAME( \ 970d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field->number(), field->type(), field->options().packed(), value, \ 971d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field); \ 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { \ 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField<TYPE>(message, field, value); \ 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 ) 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 ) 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32) 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64) 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT ) 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE) 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Bool , bool , bool , BOOL ) 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef DEFINE_PRIMITIVE_ACCESSORS 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring GeneratedMessageReflection::GetString( 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field) const { 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetString, SINGULAR, STRING); 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).GetString(field->number(), 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->default_value_string()); 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 995d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 996d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 997d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 998d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return *GetField<const string*>(message, field); 999d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1000d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 1001d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_LOG(FATAL) << "Can't get here."; 1002a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return GetEmptyString(); // Make compiler happy. 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& GeneratedMessageReflection::GetStringReference( 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, string* scratch) const { 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING); 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).GetString(field->number(), 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->default_value_string()); 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1014d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 1015d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 1016d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 1017d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return *GetField<const string*>(message, field); 1018d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1019d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 1020d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_LOG(FATAL) << "Can't get here."; 1021a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return GetEmptyString(); // Make compiler happy. 1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetString( 1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, 1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& value) const { 1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(SetString, SINGULAR, STRING); 1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return MutableExtensionSet(message)->SetString(field->number(), 1032d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field->type(), value, field); 1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1034d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 1035d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 1036d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: { 1037a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof() && !HasOneofField(*message, field)) { 1038a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message, field->containing_oneof()); 1039a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableField<string*>(message, field) = new string; 1040a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1041d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string** ptr = MutableField<string*>(message, field); 1042d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (*ptr == DefaultRaw<const string*>(field)) { 1043d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville *ptr = new string(value); 1044d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } else { 1045d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville (*ptr)->assign(value); 1046d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1047d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 1048d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring GeneratedMessageReflection::GetRepeatedString( 1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field, int index) const { 1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING); 1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).GetRepeatedString(field->number(), index); 1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1060d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 1061d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 1062d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 1063d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return GetRepeatedPtrField<string>(message, field, index); 1064d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1065d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 1066d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_LOG(FATAL) << "Can't get here."; 1067a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return GetEmptyString(); // Make compiler happy. 1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& GeneratedMessageReflection::GetRepeatedStringReference( 1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field, 1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, string* scratch) const { 1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING); 1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetExtensionSet(message).GetRepeatedString(field->number(), index); 1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1078d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 1079d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 1080d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 1081d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return GetRepeatedPtrField<string>(message, field, index); 1082d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1083d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 1084d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_LOG(FATAL) << "Can't get here."; 1085a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return GetEmptyString(); // Make compiler happy. 1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetRepeatedString( 1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, 1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, const string& value) const { 1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING); 1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->SetRepeatedString( 1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->number(), index, value); 1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1098d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 1099d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 1100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 1101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville *MutableRepeatedField<string>(message, field, index) = value; 1102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 1103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::AddString( 1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, 1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& value) const { 1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(AddString, REPEATED, STRING); 1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->AddString(field->number(), 1114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field->type(), value, field); 1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 1117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // TODO(kenton): Support other string reps. 1118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 1119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville *AddField<string>(message, field) = value; 1120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville break; 1121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst EnumValueDescriptor* GeneratedMessageReflection::GetEnum( 1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field) const { 1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetEnum, SINGULAR, ENUM); 1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int value; 1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value = GetExtensionSet(message).GetEnum( 1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->number(), field->default_value_enum()->number()); 1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value = GetField<int>(message, field); 1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* result = 1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->enum_type()->FindValueByNumber(value); 1141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field " 1142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << field->full_name() << " of type " 1143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << field->enum_type()->full_name() << "."; 1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetEnum( 1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, 1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* value) const { 1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(SetEnum, SINGULAR, ENUM); 1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ENUM_VALUE(SetEnum); 1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->SetEnum(field->number(), field->type(), 1155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville value->number(), field); 1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetField<int>(message, field, value->number()); 1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum( 1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field, int index) const { 1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetRepeatedEnum, REPEATED, ENUM); 1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int value; 1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index); 1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value = GetRepeatedField<int>(message, field, index); 1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* result = 1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->enum_type()->FindValueByNumber(value); 1173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field " 1174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << field->full_name() << " of type " 1175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << field->enum_type()->full_name() << "."; 1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetRepeatedEnum( 1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, 1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int index, 1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* value) const { 1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM); 1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum); 1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->SetRepeatedEnum( 1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->number(), index, value->number()); 1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetRepeatedField<int>(message, field, index, value->number()); 1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::AddEnum( 1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, 1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* value) const { 1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM); 1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ENUM_VALUE(AddEnum); 1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->AddEnum(field->number(), field->type(), 1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->options().packed(), 1203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville value->number(), field); 1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField<int>(message, field, value->number()); 1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst Message& GeneratedMessageReflection::GetMessage( 1212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const Message& message, const FieldDescriptor* field, 1213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageFactory* factory) const { 1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE); 1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (factory == NULL) factory = message_factory_; 1217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<const Message&>( 1220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GetExtensionSet(message).GetMessage( 1221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->number(), field->message_type(), factory)); 1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message* result; 1224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson result = GetRaw<const Message*>(message, field); 1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (result == NULL) { 1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result = DefaultRaw<const Message*>(field); 1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return *result; 1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessage* GeneratedMessageReflection::MutableMessage( 1233d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Message* message, const FieldDescriptor* field, 1234d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageFactory* factory) const { 1235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (factory == NULL) factory = message_factory_; 1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Message*>( 1239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableExtensionSet(message)->MutableMessage(field, factory)); 1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* result; 1242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message** result_holder = MutableRaw<Message*>(message, field); 1243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof()) { 1245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (!HasOneofField(*message, field)) { 1246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message, field->containing_oneof()); 1247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson result_holder = MutableField<Message*>(message, field); 1248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message* default_message = DefaultRaw<const Message*>(field); 1249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *result_holder = default_message->New(); 1250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 1252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetBit(message, field); 1253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (*result_holder == NULL) { 1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message* default_message = DefaultRaw<const Message*>(field); 1257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *result_holder = default_message->New(); 1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson result = *result_holder; 1260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return result; 1261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SetAllocatedMessage( 1265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, 1266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* sub_message, 1267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field) const { 1268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE); 1269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->is_extension()) { 1271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableExtensionSet(message)->SetAllocatedMessage( 1272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->number(), field->type(), field, sub_message); 1273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 1274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof()) { 1275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (sub_message == NULL) { 1276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message, field->containing_oneof()); 1277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return; 1278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message, field->containing_oneof()); 1280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableRaw<Message*>(message, field) = sub_message; 1281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetOneofCase(message, field); 1282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return; 1283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (sub_message == NULL) { 1286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearBit(message, field); 1287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 1288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetBit(message, field); 1289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message** sub_message_holder = MutableRaw<Message*>(message, field); 1291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson delete *sub_message_holder; 1292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *sub_message_holder = sub_message; 1293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessage* GeneratedMessageReflection::ReleaseMessage( 1297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, 1298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field, 1299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MessageFactory* factory) const { 1300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE); 1301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (factory == NULL) factory = message_factory_; 1303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->is_extension()) { 1305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return static_cast<Message*>( 1306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableExtensionSet(message)->ReleaseMessage(field, factory)); 1307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 1308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearBit(message, field); 1309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof()) { 1310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (HasOneofField(*message, field)) { 1311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableOneofCase(message, field->containing_oneof()) = 0; 1312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 1313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return NULL; 1314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message** result = MutableRaw<Message*>(message, field); 1317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* ret = *result; 1318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *result = NULL; 1319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return ret; 1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst Message& GeneratedMessageReflection::GetRepeatedMessage( 1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field, int index) const { 1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE); 1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<const Message&>( 1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtensionSet(message).GetRepeatedMessage(field->number(), index)); 1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetRaw<RepeatedPtrFieldBase>(message, field) 1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .Get<GenericTypeHandler<Message> >(index); 1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessage* GeneratedMessageReflection::MutableRepeatedMessage( 1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, int index) const { 1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE); 1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Message*>( 1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableExtensionSet(message)->MutableRepeatedMessage( 1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->number(), index)); 1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return MutableRaw<RepeatedPtrFieldBase>(message, field) 1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->Mutable<GenericTypeHandler<Message> >(index); 1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessage* GeneratedMessageReflection::AddMessage( 1351d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Message* message, const FieldDescriptor* field, 1352d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageFactory* factory) const { 1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE); 1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1355d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (factory == NULL) factory = message_factory_; 1356d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_extension()) { 1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Message*>( 1359d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MutableExtensionSet(message)->AddMessage(field, factory)); 1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't 1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // know how to allocate one. 1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrFieldBase* repeated = 1364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MutableRaw<RepeatedPtrFieldBase>(message, field); 1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* result = repeated->AddFromCleared<GenericTypeHandler<Message> >(); 1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (result == NULL) { 1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We must allocate a new object. 1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message* prototype; 1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (repeated->size() == 0) { 1370d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville prototype = factory->GetPrototype(field->message_type()); 1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville prototype = &repeated->Get<GenericTypeHandler<Message> >(0); 1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result = prototype->New(); 1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville repeated->AddAllocated<GenericTypeHandler<Message> >(result); 1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid* GeneratedMessageReflection::MutableRawRepeatedField( 1382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, const FieldDescriptor* field, 1383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptor::CppType cpptype, 1384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int ctype, const Descriptor* desc) const { 1385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson USAGE_CHECK_REPEATED("MutableRawRepeatedField"); 1386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->cpp_type() != cpptype) 1387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ReportReflectionUsageTypeError(descriptor_, 1388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field, "MutableRawRepeatedField", cpptype); 1389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (ctype >= 0) 1390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch"; 1391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (desc != NULL) 1392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type"; 1393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->is_extension()) 1394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return MutableExtensionSet(message)->MutableRawRepeatedField( 1395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->number(), field->type(), field->is_packed(), field); 1396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else 1397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return reinterpret_cast<uint8*>(message) + offsets_[field->index()]; 1398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonconst FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor( 1401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message& message, 1402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* oneof_descriptor) const { 1403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson uint32 field_number = GetOneofCase(message, oneof_descriptor); 1404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field_number == 0) { 1405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return NULL; 1406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return descriptor_->FindFieldByNumber(field_number); 1408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ----------------------------------------------------------------------------- 1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName( 1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name) const { 1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (extensions_offset_ == -1) return NULL; 1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name); 1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (result != NULL && result->containing_type() == descriptor_) { 1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (descriptor_->options().message_set_wire_format()) { 1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // MessageSet extensions may be identified by type name. 1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name); 1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (type != NULL) { 1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Look for a matching extension in the foreign type's scope. 1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < type->extension_count(); i++) { 1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension = type->extension(i); 1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (extension->containing_type() == descriptor_ && 1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension->type() == FieldDescriptor::TYPE_MESSAGE && 1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension->is_optional() && 1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension->message_type() == type) { 1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Found it. 1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return extension; 1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return NULL; 1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber( 1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number) const { 1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (extensions_offset_ == -1) return NULL; 1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return descriptor_pool_->FindExtensionByNumber(descriptor_, number); 1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Some private helpers. 1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// These simple template accessors obtain pointers (or references) to 1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the given field. 1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::GetRaw( 1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field) const { 1456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof() && !HasOneofField(message, field)) { 1457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return DefaultRaw<Type>(field); 1458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int index = field->containing_oneof() ? 1460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor_->field_count() + field->containing_oneof()->index() : 1461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->index(); 1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const void* ptr = reinterpret_cast<const uint8*>(&message) + 1463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson offsets_[index]; 1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return *reinterpret_cast<const Type*>(ptr); 1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::MutableRaw( 1469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field) const { 1470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int index = field->containing_oneof() ? 1471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor_->field_count() + field->containing_oneof()->index() : 1472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->index(); 1473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void* ptr = reinterpret_cast<uint8*>(message) + offsets_[index]; 1474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return reinterpret_cast<Type*>(ptr); 1475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::DefaultRaw( 1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const { 1480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const void* ptr = field->containing_oneof() ? 1481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reinterpret_cast<const uint8*>(default_oneof_instance_) + 1482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson offsets_[field->index()] : 1483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reinterpret_cast<const uint8*>(default_instance_) + 1484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson offsets_[field->index()]; 1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return *reinterpret_cast<const Type*>(ptr); 1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const uint32* GeneratedMessageReflection::GetHasBits( 1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message) const { 1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const void* ptr = reinterpret_cast<const uint8*>(&message) + has_bits_offset_; 1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return reinterpret_cast<const uint32*>(ptr); 1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32* GeneratedMessageReflection::MutableHasBits( 1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message) const { 1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void* ptr = reinterpret_cast<uint8*>(message) + has_bits_offset_; 1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return reinterpret_cast<uint32*>(ptr); 1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline uint32 GeneratedMessageReflection::GetOneofCase( 1500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message& message, 1501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* oneof_descriptor) const { 1502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const void* ptr = reinterpret_cast<const uint8*>(&message) 1503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + oneof_case_offset_; 1504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return reinterpret_cast<const uint32*>(ptr)[oneof_descriptor->index()]; 1505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline uint32* GeneratedMessageReflection::MutableOneofCase( 1508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, 1509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* oneof_descriptor) const { 1510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void* ptr = reinterpret_cast<uint8*>(message) + oneof_case_offset_; 1511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return &(reinterpret_cast<uint32*>(ptr)[oneof_descriptor->index()]); 1512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet( 1515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message) const { 1516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DCHECK_NE(extensions_offset_, -1); 1517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const void* ptr = reinterpret_cast<const uint8*>(&message) + 1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extensions_offset_; 1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return *reinterpret_cast<const ExtensionSet*>(ptr); 1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet( 1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message) const { 1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DCHECK_NE(extensions_offset_, -1); 1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void* ptr = reinterpret_cast<uint8*>(message) + extensions_offset_; 1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return reinterpret_cast<ExtensionSet*>(ptr); 1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Simple accessors for manipulating has_bits_. 1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool GeneratedMessageReflection::HasBit( 1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field) const { 1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetHasBits(message)[field->index() / 32] & 1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (1 << (field->index() % 32)); 1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::SetBit( 1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field) const { 1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32)); 1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::ClearBit( 1541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field) const { 1542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32)); 1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::SwapBit( 1546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message1, Message* message2, const FieldDescriptor* field) const { 1547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool temp_has_bit = HasBit(*message1, field); 1548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (HasBit(*message2, field)) { 1549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetBit(message1, field); 1550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 1551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearBit(message1, field); 1552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (temp_has_bit) { 1554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetBit(message2, field); 1555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 1556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearBit(message2, field); 1557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline bool GeneratedMessageReflection::HasOneof( 1561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message& message, const OneofDescriptor* oneof_descriptor) const { 1562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return (GetOneofCase(message, oneof_descriptor) > 0); 1563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline bool GeneratedMessageReflection::HasOneofField( 1566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message& message, const FieldDescriptor* field) const { 1567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return (GetOneofCase(message, field->containing_oneof()) == field->number()); 1568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::SetOneofCase( 1571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, const FieldDescriptor* field) const { 1572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableOneofCase(message, field->containing_oneof()) = field->number(); 1573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::ClearOneofField( 1576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, const FieldDescriptor* field) const { 1577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (HasOneofField(*message, field)) { 1578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message, field->containing_oneof()); 1579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::ClearOneof( 1583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* message, const OneofDescriptor* oneof_descriptor) const { 1584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TODO(jieluo): Consider to cache the unused object instead of deleting 1585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // it. It will be much faster if an aplication switches a lot from 1586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // a few oneof fields. Time/space tradeoff 1587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson uint32 oneof_case = GetOneofCase(*message, oneof_descriptor); 1588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (oneof_case > 0) { 1589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = descriptor_->FindFieldByNumber(oneof_case); 1590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field->cpp_type()) { 1591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_STRING: { 1592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field->options().ctype()) { 1593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: // TODO(kenton): Support other string reps. 1594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldOptions::STRING: 1595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson delete *MutableRaw<string*>(message, field); 1596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 1597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 1599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_MESSAGE: 1602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson delete *MutableRaw<Message*>(message, field); 1603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 1604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 1605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 1606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson *MutableOneofCase(message, oneof_descriptor) = 0; 1609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Template implementations of basic accessors. Inline because each 1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// template instance is only called from one location. These are 1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// used for all types except messages. 1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::GetField( 1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field) const { 1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetRaw<Type>(message, field); 1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::SetField( 1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, const Type& value) const { 1624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (field->containing_oneof() && !HasOneofField(*message, field)) { 1625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClearOneof(message, field->containing_oneof()); 1626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *MutableRaw<Type>(message, field) = value; 1628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->containing_oneof() ? 1629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetOneofCase(message, field) : SetBit(message, field); 1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::MutableField( 1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field) const { 1635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->containing_oneof() ? 1636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetOneofCase(message, field) : SetBit(message, field); 1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return MutableRaw<Type>(message, field); 1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1641d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const Type& GeneratedMessageReflection::GetRepeatedField( 1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field, int index) const { 1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetRaw<RepeatedField<Type> >(message, field).Get(index); 1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::GetRepeatedPtrField( 1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field, int index) const { 1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetRaw<RepeatedPtrField<Type> >(message, field).Get(index); 1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::SetRepeatedField( 1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, 1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, Type value) const { 1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value); 1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::MutableRepeatedField( 1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, int index) const { 1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<Type>* repeated = 1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedPtrField<Type> >(message, field); 1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return repeated->Mutable(index); 1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::AddField( 1669d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Message* message, const FieldDescriptor* field, const Type& value) const { 1670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedField<Type> >(message, field)->Add(value); 1671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 1674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::AddField( 1675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field) const { 1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<Type>* repeated = 1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRaw<RepeatedPtrField<Type> >(message, field); 1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return repeated->Add(); 1679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace internal 1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 1684