1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
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 <google/protobuf/stubs/hash.h>
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/once.h>
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/extension_set.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message_lite.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/coded_stream.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/zero_copy_stream_impl.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format_lite_inl.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/repeated_field.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/map-util.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline WireFormatLite::FieldType real_type(FieldType type) {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE);
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return static_cast<WireFormatLite::FieldType>(type);
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline WireFormatLite::CppType cpp_type(FieldType type) {
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WireFormatLite::FieldTypeToCppType(real_type(type));
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Registry stuff.
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef hash_map<pair<const MessageLite*, int>,
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 ExtensionInfo> ExtensionRegistry;
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleExtensionRegistry* registry_ = NULL;
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_);
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid DeleteRegistry() {
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete registry_;
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  registry_ = NULL;
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid InitRegistry() {
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  registry_ = new ExtensionRegistry;
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  internal::OnShutdown(&DeleteRegistry);
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This function is only called at startup, so there is no need for thread-
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// safety.
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid Register(const MessageLite* containing_type,
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              int number, ExtensionInfo info) {
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ::google::protobuf::GoogleOnceInit(&registry_init_, &InitRegistry);
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!InsertIfNotPresent(registry_, make_pair(containing_type, number),
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          info)) {
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \""
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               << containing_type->GetTypeName()
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               << "\", field number " << number << ".";
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst ExtensionInfo* FindRegisteredExtension(
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const MessageLite* containing_type, int number) {
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return (registry_ == NULL) ? NULL :
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         FindOrNull(*registry_, make_pair(containing_type, number));
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleExtensionFinder::~ExtensionFinder() {}
100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillebool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) {
102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  const ExtensionInfo* extension =
103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      FindRegisteredExtension(containing_type_, number);
104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (extension == NULL) {
105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return false;
106d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  } else {
107d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    *output = *extension;
108d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return true;
109d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::RegisterExtension(const MessageLite* containing_type,
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     int number, FieldType type,
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     bool is_repeated, bool is_packed) {
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_ENUM);
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_MESSAGE);
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_GROUP);
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExtensionInfo info(type, is_repeated, is_packed);
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Register(containing_type, number, info);
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillestatic bool CallNoArgValidityFunc(const void* arg, int number) {
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Note:  Must use C-style cast here rather than reinterpret_cast because
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   the C++ standard at one point did not allow casts between function and
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   data pointers and some compilers enforce this for C++-style casts.  No
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   compiler enforces it for C-style casts since lots of C-style code has
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   relied on these kinds of casts for a long time, despite being
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   technically undefined.  See:
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //     http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Also note:  Some compilers do not allow function pointers to be "const".
131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   Which makes sense, I suppose, because it's meaningless.
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return ((EnumValidityFunc*)arg)(number);
133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type,
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                         int number, FieldType type,
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                         bool is_repeated, bool is_packed,
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                         EnumValidityFunc* is_valid) {
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM);
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExtensionInfo info(type, is_repeated, is_packed);
141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  info.enum_validity_check.func = CallNoArgValidityFunc;
142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // See comment in CallNoArgValidityFunc() about why we use a c-style cast.
143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  info.enum_validity_check.arg = (void*)is_valid;
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Register(containing_type, number, info);
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::RegisterMessageExtension(const MessageLite* containing_type,
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                            int number, FieldType type,
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                            bool is_repeated, bool is_packed,
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                            const MessageLite* prototype) {
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(type == WireFormatLite::TYPE_MESSAGE ||
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        type == WireFormatLite::TYPE_GROUP);
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExtensionInfo info(type, is_repeated, is_packed);
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  info.message_prototype = prototype;
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Register(containing_type, number, info);
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Constructors and basic methods.
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleExtensionSet::ExtensionSet() {}
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleExtensionSet::~ExtensionSet() {
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (map<int, Extension>::iterator iter = extensions_.begin();
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       iter != extensions_.end(); ++iter) {
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    iter->second.Free();
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// void ExtensionSet::AppendToList(const Descriptor* containing_type,
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                 const DescriptorPool* pool,
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                 vector<const FieldDescriptor*>* output) const
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ExtensionSet::Has(int number) const {
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (iter == extensions_.end()) return false;
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK(!iter->second.is_repeated);
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return !iter->second.is_cleared;
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::ExtensionSize(int number) const {
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (iter == extensions_.end()) return false;
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return iter->second.GetSize();
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::ClearExtension(int number) {
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::iterator iter = extensions_.find(number);
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (iter == extensions_.end()) return;
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  iter->second.Clear();
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Field accessors
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleenum Cardinality {
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  REPEATED,
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  OPTIONAL
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)                             \
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL);         \
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE)
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Primitives
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE)                   \
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                               \
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleLOWERCASE ExtensionSet::Get##CAMELCASE(int number,                             \
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                       LOWERCASE default_value) const {        \
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);         \
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (iter == extensions_.end() || iter->second.is_cleared) {                  \
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return default_value;                                                      \
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {                                                                     \
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE);                            \
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return iter->second.LOWERCASE##_value;                                     \
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }                                                                            \
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}                                                                              \
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                               \
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Set##CAMELCASE(int number, FieldType type,                  \
228d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                  LOWERCASE value,                             \
229d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                  const FieldDescriptor* descriptor) {         \
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;                                                        \
231d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {                     \
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;                                                    \
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = false;                                            \
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {                                                                     \
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE);                              \
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }                                                                            \
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->is_cleared = false;                                               \
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->LOWERCASE##_value = value;                                        \
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}                                                                              \
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                               \
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleLOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const {  \
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);         \
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return iter->second.repeated_##LOWERCASE##_value->Get(index);                \
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}                                                                              \
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                               \
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::SetRepeated##CAMELCASE(                                     \
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number, int index, LOWERCASE value) {                                  \
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::iterator iter = extensions_.find(number);               \
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  iter->second.repeated_##LOWERCASE##_value->Set(index, value);                \
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}                                                                              \
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                               \
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Add##CAMELCASE(int number, FieldType type,                  \
258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                  bool packed, LOWERCASE value,                \
259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                  const FieldDescriptor* descriptor) {         \
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;                                                        \
261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {                     \
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;                                                    \
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = true;                                             \
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_packed = packed;                                             \
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->repeated_##LOWERCASE##_value = new RepeatedField<LOWERCASE>();  \
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {                                                                     \
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE);                              \
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(extension->is_packed, packed);                                   \
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }                                                                            \
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->repeated_##LOWERCASE##_value->Add(value);                         \
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePRIMITIVE_ACCESSORS( INT32,  int32,  Int32)
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePRIMITIVE_ACCESSORS( INT64,  int64,  Int64)
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePRIMITIVE_ACCESSORS( FLOAT,  float,  Float)
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePRIMITIVE_ACCESSORS(DOUBLE, double, Double)
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePRIMITIVE_ACCESSORS(  BOOL,   bool,   Bool)
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PRIMITIVE_ACCESSORS
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Enums
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::GetEnum(int number, int default_value) const {
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (iter == extensions_.end() || iter->second.is_cleared) {
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Not present.  Return the default value.
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return default_value;
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM);
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return iter->second.enum_value;
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
298d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillevoid ExtensionSet::SetEnum(int number, FieldType type, int value,
299d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           const FieldDescriptor* descriptor) {
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;
301d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = false;
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM);
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->is_cleared = false;
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->enum_value = value;
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::GetRepeatedEnum(int number, int index) const {
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return iter->second.repeated_enum_value->Get(index);
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::SetRepeatedEnum(int number, int index, int value) {
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::iterator iter = extensions_.find(number);
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  iter->second.repeated_enum_value->Set(index, value);
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::AddEnum(int number, FieldType type,
327d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           bool packed, int value,
328d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           const FieldDescriptor* descriptor) {
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;
330d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = true;
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_packed = packed;
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->repeated_enum_value = new RepeatedField<int>();
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM);
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(extension->is_packed, packed);
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->repeated_enum_value->Add(value);
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Strings
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& ExtensionSet::GetString(int number,
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      const string& default_value) const {
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (iter == extensions_.end() || iter->second.is_cleared) {
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Not present.  Return the default value.
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return default_value;
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING);
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return *iter->second.string_value;
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
358d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillestring* ExtensionSet::MutableString(int number, FieldType type,
359d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                    const FieldDescriptor* descriptor) {
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;
361d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = false;
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->string_value = new string;
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING);
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->is_cleared = false;
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return extension->string_value;
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& ExtensionSet::GetRepeatedString(int number, int index) const {
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return iter->second.repeated_string_value->Get(index);
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring* ExtensionSet::MutableRepeatedString(int number, int index) {
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::iterator iter = extensions_.find(number);
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return iter->second.repeated_string_value->Mutable(index);
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
387d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillestring* ExtensionSet::AddString(int number, FieldType type,
388d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                const FieldDescriptor* descriptor) {
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;
390d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = true;
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_packed = false;
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->repeated_string_value = new RepeatedPtrField<string>();
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING);
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return extension->repeated_string_value->Add();
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Messages
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst MessageLite& ExtensionSet::GetMessage(
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number, const MessageLite& default_value) const {
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (iter == extensions_.end()) {
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Not present.  Return the default value.
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return default_value;
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return *iter->second.message_value;
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// const MessageLite& ExtensionSet::GetMessage(int number,
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                             const Descriptor* message_type,
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                             MessageFactory* factory) const
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
423d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                          const MessageLite& prototype,
424d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                          const FieldDescriptor* descriptor) {
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;
426d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = false;
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->message_value = prototype.New();
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extension->is_cleared = false;
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return extension->message_value;
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                           const Descriptor* message_type,
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                           MessageFactory* factory)
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst MessageLite& ExtensionSet::GetRepeatedMessage(
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number, int index) const {
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter = extensions_.find(number);
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return iter->second.repeated_message_value->Get(index);
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) {
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::iterator iter = extensions_.find(number);
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return iter->second.repeated_message_value->Mutable(index);
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageLite* ExtensionSet::AddMessage(int number, FieldType type,
459d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                      const MessageLite& prototype,
460d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                      const FieldDescriptor* descriptor) {
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension;
462d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (MaybeNewExtension(number, descriptor, &extension)) {
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->type = type;
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->is_repeated = true;
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->repeated_message_value =
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      new RepeatedPtrField<MessageLite>();
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE);
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // RepeatedPtrField<MessageLite> does not know how to Add() since it cannot
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // allocate an abstract object, so we have to be tricky.
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MessageLite* result = extension->repeated_message_value
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ->AddFromCleared<internal::GenericTypeHandler<MessageLite> >();
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (result == NULL) {
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result = prototype.New();
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension->repeated_message_value->AddAllocated(result);
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return result;
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                       const Descriptor* message_type,
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                       MessageFactory* factory)
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK_TYPE
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::RemoveLast(int number) {
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::iterator iter = extensions_.find(number);
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension = &iter->second;
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK(extension->is_repeated);
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  switch(cpp_type(extension->type)) {
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_INT32:
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_int32_value->RemoveLast();
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_INT64:
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_int64_value->RemoveLast();
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_UINT32:
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_uint32_value->RemoveLast();
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_UINT64:
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_uint64_value->RemoveLast();
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_FLOAT:
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_float_value->RemoveLast();
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_DOUBLE:
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_double_value->RemoveLast();
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_BOOL:
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_bool_value->RemoveLast();
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_ENUM:
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_enum_value->RemoveLast();
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_STRING:
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_string_value->RemoveLast();
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_MESSAGE:
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_message_value->RemoveLast();
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::SwapElements(int number, int index1, int index2) {
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::iterator iter = extensions_.find(number);
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Extension* extension = &iter->second;
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK(extension->is_repeated);
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  switch(cpp_type(extension->type)) {
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_INT32:
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_int32_value->SwapElements(index1, index2);
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_INT64:
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_int64_value->SwapElements(index1, index2);
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_UINT32:
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_uint32_value->SwapElements(index1, index2);
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_UINT64:
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_uint64_value->SwapElements(index1, index2);
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_FLOAT:
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_float_value->SwapElements(index1, index2);
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_DOUBLE:
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_double_value->SwapElements(index1, index2);
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_BOOL:
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_bool_value->SwapElements(index1, index2);
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_ENUM:
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_enum_value->SwapElements(index1, index2);
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_STRING:
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_string_value->SwapElements(index1, index2);
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_MESSAGE:
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension->repeated_message_value->SwapElements(index1, index2);
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      break;
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Clear() {
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (map<int, Extension>::iterator iter = extensions_.begin();
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       iter != extensions_.end(); ++iter) {
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    iter->second.Clear();
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::MergeFrom(const ExtensionSet& other) {
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (map<int, Extension>::const_iterator iter = other.extensions_.begin();
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       iter != other.extensions_.end(); ++iter) {
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Extension& other_extension = iter->second;
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (other_extension.is_repeated) {
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Extension* extension;
588d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      bool is_new = MaybeNewExtension(iter->first, other_extension.descriptor,
589d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                      &extension);
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (is_new) {
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // Extension did not already exist in set.
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        extension->type = other_extension.type;
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        extension->is_repeated = true;
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        GOOGLE_DCHECK(extension->is_repeated);
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (cpp_type(other_extension.type)) {
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE)             \
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (is_new) {                                              \
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            extension->repeated_##LOWERCASE##_value =                \
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              new REPEATED_TYPE;                                     \
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }                                                          \
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          extension->repeated_##LOWERCASE##_value->MergeFrom(        \
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *other_extension.repeated_##LOWERCASE##_value);          \
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  INT32,   int32, RepeatedField   <  int32>);
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  INT64,   int64, RepeatedField   <  int64>);
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( UINT32,  uint32, RepeatedField   < uint32>);
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( UINT64,  uint64, RepeatedField   < uint64>);
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  FLOAT,   float, RepeatedField   <  float>);
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( DOUBLE,  double, RepeatedField   < double>);
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   BOOL,    bool, RepeatedField   <   bool>);
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   ENUM,    enum, RepeatedField   <    int>);
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( STRING,  string, RepeatedPtrField< string>);
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::CPPTYPE_MESSAGE:
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (is_new) {
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            extension->repeated_message_value =
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              new RepeatedPtrField<MessageLite>();
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // it would attempt to allocate new objects.
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          RepeatedPtrField<MessageLite>* other_repeated_message =
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              other_extension.repeated_message_value;
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          for (int i = 0; i < other_repeated_message->size(); i++) {
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            const MessageLite& other_message = other_repeated_message->Get(i);
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            MessageLite* target = extension->repeated_message_value
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     ->AddFromCleared<GenericTypeHandler<MessageLite> >();
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            if (target == NULL) {
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              target = other_message.New();
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              extension->repeated_message_value->AddAllocated(target);
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            }
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            target->CheckTypeAndMergeFrom(other_message);
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!other_extension.is_cleared) {
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        switch (cpp_type(other_extension.type)) {
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE)                         \
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          case WireFormatLite::CPPTYPE_##UPPERCASE:                          \
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            Set##CAMELCASE(iter->first, other_extension.type,                \
648d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           other_extension.LOWERCASE##_value,                \
649d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           other_extension.descriptor);                      \
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            break;
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE( INT32,  int32,  Int32);
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE( INT64,  int64,  Int64);
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE(UINT32, uint32, UInt32);
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE(UINT64, uint64, UInt64);
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE( FLOAT,  float,  Float);
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE(DOUBLE, double, Double);
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE(  BOOL,   bool,   Bool);
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          HANDLE_TYPE(  ENUM,   enum,   Enum);
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          case WireFormatLite::CPPTYPE_STRING:
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            SetString(iter->first, other_extension.type,
663d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                      *other_extension.string_value,
664d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                      other_extension.descriptor);
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            break;
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          case WireFormatLite::CPPTYPE_MESSAGE:
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            MutableMessage(iter->first, other_extension.type,
668d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           *other_extension.message_value,
669d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           other_extension.descriptor)
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              ->CheckTypeAndMergeFrom(*other_extension.message_value);
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            break;
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Swap(ExtensionSet* x) {
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extensions_.swap(x->extensions_);
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ExtensionSet::IsInitialized() const {
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Extensions are never required.  However, we need to check that all
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // embedded messages are initialized.
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (map<int, Extension>::const_iterator iter = extensions_.begin();
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       iter != extensions_.end(); ++iter) {
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Extension& extension = iter->second;
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) {
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (extension.is_repeated) {
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        for (int i = 0; i < extension.repeated_message_value->size(); i++) {
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (!extension.repeated_message_value->Get(i).IsInitialized()) {
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            return false;
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!extension.is_cleared) {
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (!extension.message_value->IsInitialized()) return false;
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
707d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                              ExtensionFinder* extension_finder,
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                              FieldSkipper* field_skipper) {
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int number = WireFormatLite::GetTagFieldNumber(tag);
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
712d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  ExtensionInfo extension;
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_unknown;
714d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (!extension_finder->Find(number, &extension)) {
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    is_unknown = true;
716d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  } else if (extension.is_packed) {
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    is_unknown = (wire_type != WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    WireFormatLite::WireType expected_wire_type =
720d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        WireFormatLite::WireTypeForFieldType(real_type(extension.type));
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    is_unknown = (wire_type != expected_wire_type);
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (is_unknown) {
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field_skipper->SkipField(input, tag);
726d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  } else if (extension.is_packed) {
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint32 size;
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (!input->ReadVarint32(&size)) return false;
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::CodedInputStream::Limit limit = input->PushLimit(size);
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
731d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (extension.type) {
732d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)        \
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_##UPPERCASE:                                   \
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        while (input->BytesUntilLimit() > 0) {                                 \
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CPP_LOWERCASE value;                                                 \
736d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          if (!WireFormatLite::ReadPrimitive<                                  \
737d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                  CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(            \
738d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                input, &value)) return false;                                  \
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \
740d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                             true, value, extension.descriptor);               \
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }                                                                      \
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
744d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(   INT32,  Int32,   int32);
745d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(   INT64,  Int64,   int64);
746d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  UINT32, UInt32,  uint32);
747d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  UINT64, UInt64,  uint64);
748d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  SINT32,  Int32,   int32);
749d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  SINT64,  Int64,   int64);
750d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE( FIXED32, UInt32,  uint32);
751d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE( FIXED64, UInt64,  uint64);
752d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(SFIXED32,  Int32,   int32);
753d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(SFIXED64,  Int64,   int64);
754d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(   FLOAT,  Float,   float);
755d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  DOUBLE, Double,  double);
756d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(    BOOL,   Bool,    bool);
757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_ENUM:
760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        while (input->BytesUntilLimit() > 0) {
761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          int value;
762d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
763d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                  input, &value)) return false;
764d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          if (extension.enum_validity_check.func(
765d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                  extension.enum_validity_check.arg, value)) {
766d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            AddEnum(number, WireFormatLite::TYPE_ENUM, true, value,
767d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                    extension.descriptor);
768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }
769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_STRING:
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_BYTES:
774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_GROUP:
775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_MESSAGE:
776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    input->PopLimit(limit);
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
782d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (extension.type) {
783d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)                   \
784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_##UPPERCASE: {                                 \
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CPP_LOWERCASE value;                                                   \
786d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        if (!WireFormatLite::ReadPrimitive<                                    \
787d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(              \
788d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               input, &value)) return false;                                   \
789d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        if (extension.is_repeated) {                                          \
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \
791d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                             false, value, extension.descriptor);              \
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        } else {                                                               \
793d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value,  \
794d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                             extension.descriptor);                            \
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }                                                                      \
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } break
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
798d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(   INT32,  Int32,   int32);
799d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(   INT64,  Int64,   int64);
800d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  UINT32, UInt32,  uint32);
801d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  UINT64, UInt64,  uint64);
802d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  SINT32,  Int32,   int32);
803d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  SINT64,  Int64,   int64);
804d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE( FIXED32, UInt32,  uint32);
805d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE( FIXED64, UInt64,  uint64);
806d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(SFIXED32,  Int32,   int32);
807d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(SFIXED64,  Int64,   int64);
808d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(   FLOAT,  Float,   float);
809d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(  DOUBLE, Double,  double);
810d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      HANDLE_TYPE(    BOOL,   Bool,    bool);
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_ENUM: {
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        int value;
815d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
816d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                input, &value)) return false;
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
818d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        if (!extension.enum_validity_check.func(
819d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                extension.enum_validity_check.arg, value)) {
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // Invalid value.  Treat as unknown.
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          field_skipper->SkipUnknownEnum(number, value);
822d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        } else if (extension.is_repeated) {
823d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          AddEnum(number, WireFormatLite::TYPE_ENUM, false, value,
824d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                  extension.descriptor);
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        } else {
826d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          SetEnum(number, WireFormatLite::TYPE_ENUM, value,
827d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                  extension.descriptor);
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_STRING:  {
833d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        string* value = extension.is_repeated ?
834d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) :
835d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          MutableString(number, WireFormatLite::TYPE_STRING,
836d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        extension.descriptor);
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!WireFormatLite::ReadString(input, value)) return false;
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_BYTES:  {
842d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        string* value = extension.is_repeated ?
843d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) :
844d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          MutableString(number, WireFormatLite::TYPE_STRING,
845d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        extension.descriptor);
846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!WireFormatLite::ReadBytes(input, value)) return false;
847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_GROUP: {
851d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        MessageLite* value = extension.is_repeated ?
852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            AddMessage(number, WireFormatLite::TYPE_GROUP,
853d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                       *extension.message_prototype, extension.descriptor) :
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            MutableMessage(number, WireFormatLite::TYPE_GROUP,
855d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           *extension.message_prototype, extension.descriptor);
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!WireFormatLite::ReadGroup(number, input, value)) return false;
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_MESSAGE: {
861d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        MessageLite* value = extension.is_repeated ?
862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            AddMessage(number, WireFormatLite::TYPE_MESSAGE,
863d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                       *extension.message_prototype, extension.descriptor) :
864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            MutableMessage(number, WireFormatLite::TYPE_MESSAGE,
865d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                           *extension.message_prototype, extension.descriptor);
866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!WireFormatLite::ReadMessage(input, value)) return false;
867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                              const MessageLite* containing_type) {
877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FieldSkipper skipper;
878d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  GeneratedExtensionFinder finder(containing_type);
879d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return ParseField(tag, input, &finder, &skipper);
880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                               const MessageLite* containing_type,
885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                               UnknownFieldSet* unknown_fields)
886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
888d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                   ExtensionFinder* extension_finder,
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                   FieldSkipper* field_skipper) {
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  while (true) {
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint32 tag = input->ReadTag();
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (tag) {
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case 0:
894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return true;
895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::kMessageSetItemStartTag:
896d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        if (!ParseMessageSetItem(input, extension_finder, field_skipper)) {
897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          return false;
898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      default:
901d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        if (!ParseField(tag, input, extension_finder, field_skipper)) {
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          return false;
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                   const MessageLite* containing_type) {
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FieldSkipper skipper;
912d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  GeneratedExtensionFinder finder(containing_type);
913d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return ParseMessageSet(input, &finder, &skipper);
914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                    const MessageLite* containing_type,
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                                    UnknownFieldSet* unknown_fields);
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ExtensionSet::ParseMessageSetItem(io::CodedInputStream* input,
922d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                       ExtensionFinder* extension_finder,
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                       FieldSkipper* field_skipper) {
924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // TODO(kenton):  It would be nice to share code between this and
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // WireFormatLite::ParseAndMergeMessageSetItem(), but I think the
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // differences would be hard to factor out.
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This method parses a group which should contain two fields:
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   required int32 type_id = 2;
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   required data message = 3;
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Once we see a type_id, we'll construct a fake tag for this extension
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which is the tag it would have had under the proto2 extensions wire
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // format.
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 fake_tag = 0;
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If we see message data before the type_id, we'll append it to this so
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // we can parse it later.  This will probably never happen in practice,
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // as no MessageSet encoder I know of writes the message before the type ID.
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // But, it's technically valid so we should allow it.
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // TODO(kenton):  Use a Cord instead?  Do I care?
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string message_data;
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  while (true) {
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint32 tag = input->ReadTag();
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (tag == 0) return false;
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (tag) {
949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::kMessageSetTypeIdTag: {
950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        uint32 type_id;
951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!input->ReadVarint32(&type_id)) return false;
952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        fake_tag = WireFormatLite::MakeTag(type_id,
953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!message_data.empty()) {
956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // We saw some message data before the type_id.  Have to parse it
957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // now.
958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          io::CodedInputStream sub_input(
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              reinterpret_cast<const uint8*>(message_data.data()),
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              message_data.size());
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (!ParseField(fake_tag, &sub_input,
962d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                          extension_finder, field_skipper)) {
963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            return false;
964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          message_data.clear();
966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::kMessageSetMessageTag: {
972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (fake_tag == 0) {
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // We haven't seen a type_id yet.  Append this data to message_data.
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          string temp;
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          uint32 length;
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (!input->ReadVarint32(&length)) return false;
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (!input->ReadString(&temp, length)) return false;
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          message_data.append(temp);
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        } else {
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // Already saw type_id, so we can parse this directly.
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (!ParseField(fake_tag, input,
982d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                          extension_finder, field_skipper)) {
983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            return false;
984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }
985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::kMessageSetItemEndTag: {
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return true;
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      default: {
995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (!field_skipper->SkipField(input, tag)) return false;
996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::SerializeWithCachedSizes(
1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int start_field_number, int end_field_number,
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::CodedOutputStream* output) const {
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter;
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (iter = extensions_.lower_bound(start_field_number);
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       iter != extensions_.end() && iter->first < end_field_number;
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       ++iter) {
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    iter->second.SerializeFieldWithCachedSizes(iter->first, output);
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::SerializeMessageSetWithCachedSizes(
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::CodedOutputStream* output) const {
1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  map<int, Extension>::const_iterator iter;
1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) {
1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output);
1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::ByteSize() const {
1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int total_size = 0;
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (map<int, Extension>::const_iterator iter = extensions_.begin();
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       iter != extensions_.end(); ++iter) {
1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    total_size += iter->second.ByteSize(iter->first);
1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return total_size;
1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::MessageSetByteSize() const {
1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int total_size = 0;
1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (map<int, Extension>::const_iterator iter = extensions_.begin();
1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       iter != extensions_.end(); ++iter) {
1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    total_size += iter->second.MessageSetItemByteSize(iter->first);
1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return total_size;
1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// int ExtensionSet::SpaceUsedExcludingSelf() const
1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1045d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillebool ExtensionSet::MaybeNewExtension(int number,
1046d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                     const FieldDescriptor* descriptor,
1047d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                     Extension** result) {
1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  pair<map<int, Extension>::iterator, bool> insert_result =
1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extensions_.insert(make_pair(number, Extension()));
1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *result = &insert_result.first->second;
1051d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  (*result)->descriptor = descriptor;
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return insert_result.second;
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Methods of ExtensionSet::Extension
1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Extension::Clear() {
1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (is_repeated) {
1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (cpp_type(type)) {
1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \
1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        repeated_##LOWERCASE##_value->Clear();                     \
1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  INT32,   int32);
1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  INT64,   int64);
1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( UINT32,  uint32);
1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( UINT64,  uint64);
1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  FLOAT,   float);
1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( DOUBLE,  double);
1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   BOOL,    bool);
1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   ENUM,    enum);
1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( STRING,  string);
1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(MESSAGE, message);
1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (!is_cleared) {
1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (cpp_type(type)) {
1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::CPPTYPE_STRING:
1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          string_value->clear();
1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::CPPTYPE_MESSAGE:
1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          message_value->Clear();
1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        default:
1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // No need to do anything.  Get*() will return the default value
1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // as long as is_cleared is true and Set*() will overwrite the
1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // previous value.
1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      is_cleared = true;
1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Extension::SerializeFieldWithCachedSizes(
1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number,
1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::CodedOutputStream* output) const {
1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (is_repeated) {
1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (is_packed) {
1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (cached_size == 0) return;
1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      WireFormatLite::WriteTag(number,
1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      output->WriteVarint32(cached_size);
1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (real_type(type)) {
1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_##UPPERCASE:                              \
1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            WireFormatLite::Write##CAMELCASE##NoTag(                        \
1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              repeated_##LOWERCASE##_value->Get(i), output);                \
1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }                                                                 \
1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break
1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT32,    Int32,   int32);
1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT64,    Int64,   int64);
1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT32,   SInt32,   int32);
1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT64,   SInt64,   int64);
1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED32, SFixed32,   int32);
1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED64, SFixed64,   int64);
1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   FLOAT,    Float,   float);
1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  DOUBLE,   Double,  double);
1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    BOOL,     Bool,    bool);
1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    ENUM,     Enum,    enum);
1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_STRING:
1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_BYTES:
1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_GROUP:
1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_MESSAGE:
1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (real_type(type)) {
1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_##UPPERCASE:                              \
1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            WireFormatLite::Write##CAMELCASE(number,                        \
1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              repeated_##LOWERCASE##_value->Get(i), output);                \
1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }                                                                 \
1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break
1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT32,    Int32,   int32);
1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT64,    Int64,   int64);
1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT32,   SInt32,   int32);
1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT64,   SInt64,   int64);
1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED32, SFixed32,   int32);
1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED64, SFixed64,   int64);
1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   FLOAT,    Float,   float);
1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  DOUBLE,   Double,  double);
1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    BOOL,     Bool,    bool);
1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  STRING,   String,  string);
1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   BYTES,    Bytes,  string);
1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    ENUM,     Enum,    enum);
1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   GROUP,    Group, message);
1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( MESSAGE,  Message, message);
1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else if (!is_cleared) {
1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (real_type(type)) {
1175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)                 \
1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_##UPPERCASE:                     \
1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        WireFormatLite::Write##CAMELCASE(number, VALUE, output); \
1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   INT32,    Int32,    int32_value);
1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   INT64,    Int64,    int64_value);
1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);
1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);
1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);
1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);
1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FIXED32,  Fixed32,   uint32_value);
1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FIXED64,  Fixed64,   uint64_value);
1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(SFIXED32, SFixed32,    int32_value);
1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(SFIXED64, SFixed64,    int64_value);
1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   FLOAT,    Float,    float_value);
1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  DOUBLE,   Double,   double_value);
1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(    BOOL,     Bool,     bool_value);
1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  STRING,   String,  *string_value);
1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);
1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(    ENUM,     Enum,     enum_value);
1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   GROUP,    Group, *message_value);
1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( MESSAGE,  Message, *message_value);
1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizes(
1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number,
1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::CodedOutputStream* output) const {
1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {
1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Not a valid MessageSet extension, but serialize it the normal way.
1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SerializeFieldWithCachedSizes(number, output);
1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return;
1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (is_cleared) return;
1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Start group.
1215d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  output->WriteTag(WireFormatLite::kMessageSetItemStartTag);
1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Write type ID.
1218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber,
1219d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                              number,
1220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                              output);
1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Write message.
1222d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  WireFormatLite::WriteMessageMaybeToArray(
1223d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      WireFormatLite::kMessageSetMessageNumber,
1224d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      *message_value,
1225d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      output);
1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // End group.
1228d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  output->WriteTag(WireFormatLite::kMessageSetItemEndTag);
1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::Extension::ByteSize(int number) const {
1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int result = 0;
1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (is_repeated) {
1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (is_packed) {
1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (real_type(type)) {
1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_##UPPERCASE:                              \
1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            result += WireFormatLite::CAMELCASE##Size(                      \
1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              repeated_##LOWERCASE##_value->Get(i));                        \
1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }                                                                 \
1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break
1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT32,    Int32,   int32);
1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT64,    Int64,   int64);
1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT32,   SInt32,   int32);
1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT64,   SInt64,   int64);
1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    ENUM,     Enum,    enum);
1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // Stuff with fixed size.
1255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_##UPPERCASE:                              \
1257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          result += WireFormatLite::k##CAMELCASE##Size *                    \
1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    repeated_##LOWERCASE##_value->size();                   \
1259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break
1260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED32,  Fixed32, uint32);
1261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED64,  Fixed64, uint64);
1262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED32, SFixed32,  int32);
1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED64, SFixed64,  int64);
1264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   FLOAT,    Float,  float);
1265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  DOUBLE,   Double, double);
1266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    BOOL,     Bool,   bool);
1267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_STRING:
1270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_BYTES:
1271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_GROUP:
1272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_MESSAGE:
1273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
1274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
1275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      cached_size = result;
1278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (result > 0) {
1279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += io::CodedOutputStream::VarintSize32(result);
1280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += io::CodedOutputStream::VarintSize32(
1281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            WireFormatLite::MakeTag(number,
1282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
1283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
1285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      int tag_size = WireFormatLite::TagSize(number, real_type(type));
1286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (real_type(type)) {
1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_##UPPERCASE:                              \
1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          result += tag_size * repeated_##LOWERCASE##_value->size();        \
1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            result += WireFormatLite::CAMELCASE##Size(                      \
1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              repeated_##LOWERCASE##_value->Get(i));                        \
1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }                                                                 \
1295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break
1296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT32,    Int32,   int32);
1298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   INT64,    Int64,   int64);
1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT32,   SInt32,   int32);
1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  SINT64,   SInt64,   int64);
1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  STRING,   String,  string);
1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   BYTES,    Bytes,  string);
1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    ENUM,     Enum,    enum);
1306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   GROUP,    Group, message);
1307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( MESSAGE,  Message, message);
1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // Stuff with fixed size.
1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
1312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case WireFormatLite::TYPE_##UPPERCASE:                              \
1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          result += (tag_size + WireFormatLite::k##CAMELCASE##Size) *       \
1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    repeated_##LOWERCASE##_value->size();                   \
1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break
1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED32,  Fixed32, uint32);
1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FIXED64,  Fixed64, uint64);
1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED32, SFixed32,  int32);
1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(SFIXED64, SFixed64,  int64);
1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(   FLOAT,    Float,  float);
1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  DOUBLE,   Double, double);
1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(    BOOL,     Bool,   bool);
1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else if (!is_cleared) {
1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result += WireFormatLite::TagSize(number, real_type(type));
1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (real_type(type)) {
1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                      \
1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_##UPPERCASE:                              \
1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += WireFormatLite::CAMELCASE##Size(LOWERCASE);             \
1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   INT32,    Int32,    int32_value);
1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   INT64,    Int64,    int64_value);
1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);
1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);
1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);
1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);
1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  STRING,   String,  *string_value);
1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);
1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(    ENUM,     Enum,     enum_value);
1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   GROUP,    Group, *message_value);
1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( MESSAGE,  Message, *message_value);
1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Stuff with fixed size.
1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, CAMELCASE)                                 \
1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::TYPE_##UPPERCASE:                              \
1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += WireFormatLite::k##CAMELCASE##Size;                     \
1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FIXED32,  Fixed32);
1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FIXED64,  Fixed64);
1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(SFIXED32, SFixed32);
1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(SFIXED64, SFixed64);
1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   FLOAT,    Float);
1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  DOUBLE,   Double);
1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(    BOOL,     Bool);
1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return result;
1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::Extension::MessageSetItemByteSize(int number) const {
1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {
1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Not a valid MessageSet extension, but compute the byte size for it the
1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // normal way.
1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ByteSize(number);
1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (is_cleared) return 0;
1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int our_size = WireFormatLite::kMessageSetItemTagsSize;
1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // type_id
1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  our_size += io::CodedOutputStream::VarintSize32(number);
1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message
1381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int message_size = message_value->ByteSize();
1382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  our_size += io::CodedOutputStream::VarintSize32(message_size);
1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  our_size += message_size;
1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return our_size;
1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint ExtensionSet::Extension::GetSize() const {
1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK(is_repeated);
1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  switch (cpp_type(type)) {
1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                        \
1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
1394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return repeated_##LOWERCASE##_value->size()
1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE(  INT32,   int32);
1397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE(  INT64,   int64);
1398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE( UINT32,  uint32);
1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE( UINT64,  uint64);
1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE(  FLOAT,   float);
1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE( DOUBLE,  double);
1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE(   BOOL,    bool);
1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE(   ENUM,    enum);
1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE( STRING,  string);
1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    HANDLE_TYPE(MESSAGE, message);
1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return 0;
1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ExtensionSet::Extension::Free() {
1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (is_repeated) {
1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (cpp_type(type)) {
1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \
1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        delete repeated_##LOWERCASE##_value;                       \
1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  INT32,   int32);
1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  INT64,   int64);
1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( UINT32,  uint32);
1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( UINT64,  uint64);
1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  FLOAT,   float);
1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( DOUBLE,  double);
1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   BOOL,    bool);
1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(   ENUM,    enum);
1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( STRING,  string);
1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(MESSAGE, message);
1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (cpp_type(type)) {
1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::CPPTYPE_STRING:
1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        delete string_value;
1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case WireFormatLite::CPPTYPE_MESSAGE:
1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        delete message_value;
1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      default:
1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in extension_set_heavy.cc.
1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// int ExtensionSet::Extension::SpaceUsedExcludingSelf() const
1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
1453