xref: /aosp_15_r20/external/cronet/third_party/protobuf/objectivec/GPBDictionary.m (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format
2*6777b538SAndroid Build Coastguard Worker// Copyright 2008 Google Inc.  All rights reserved.
3*6777b538SAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/
4*6777b538SAndroid Build Coastguard Worker//
5*6777b538SAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without
6*6777b538SAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are
7*6777b538SAndroid Build Coastguard Worker// met:
8*6777b538SAndroid Build Coastguard Worker//
9*6777b538SAndroid Build Coastguard Worker//     * Redistributions of source code must retain the above copyright
10*6777b538SAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer.
11*6777b538SAndroid Build Coastguard Worker//     * Redistributions in binary form must reproduce the above
12*6777b538SAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer
13*6777b538SAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the
14*6777b538SAndroid Build Coastguard Worker// distribution.
15*6777b538SAndroid Build Coastguard Worker//     * Neither the name of Google Inc. nor the names of its
16*6777b538SAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from
17*6777b538SAndroid Build Coastguard Worker// this software without specific prior written permission.
18*6777b538SAndroid Build Coastguard Worker//
19*6777b538SAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*6777b538SAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*6777b538SAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*6777b538SAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*6777b538SAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*6777b538SAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*6777b538SAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*6777b538SAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*6777b538SAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*6777b538SAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*6777b538SAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker#import "GPBDictionary_PackagePrivate.h"
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker#import "GPBCodedInputStream_PackagePrivate.h"
34*6777b538SAndroid Build Coastguard Worker#import "GPBCodedOutputStream_PackagePrivate.h"
35*6777b538SAndroid Build Coastguard Worker#import "GPBDescriptor_PackagePrivate.h"
36*6777b538SAndroid Build Coastguard Worker#import "GPBMessage_PackagePrivate.h"
37*6777b538SAndroid Build Coastguard Worker#import "GPBUtilities_PackagePrivate.h"
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker// ------------------------------ NOTE ------------------------------
40*6777b538SAndroid Build Coastguard Worker// At the moment, this is all using NSNumbers in NSDictionaries under
41*6777b538SAndroid Build Coastguard Worker// the hood, but it is all hidden so we can come back and optimize
42*6777b538SAndroid Build Coastguard Worker// with direct CFDictionary usage later.  The reason that wasn't
43*6777b538SAndroid Build Coastguard Worker// done yet is needing to support 32bit iOS builds.  Otherwise
44*6777b538SAndroid Build Coastguard Worker// it would be pretty simple to store all this data in CFDictionaries
45*6777b538SAndroid Build Coastguard Worker// directly.
46*6777b538SAndroid Build Coastguard Worker// ------------------------------------------------------------------
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker// Direct access is use for speed, to avoid even internally declaring things
49*6777b538SAndroid Build Coastguard Worker// read/write, etc. The warning is enabled in the project to ensure code calling
50*6777b538SAndroid Build Coastguard Worker// protos can turn on -Wdirect-ivar-access without issues.
51*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic push
52*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wdirect-ivar-access"
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker// Used to include code only visible to specific versions of the static
55*6777b538SAndroid Build Coastguard Worker// analyzer. Useful for wrapping code that only exists to silence the analyzer.
56*6777b538SAndroid Build Coastguard Worker// Determine the values you want to use for BEGIN_APPLE_BUILD_VERSION,
57*6777b538SAndroid Build Coastguard Worker// END_APPLE_BUILD_VERSION using:
58*6777b538SAndroid Build Coastguard Worker//   xcrun clang -dM -E -x c /dev/null | grep __apple_build_version__
59*6777b538SAndroid Build Coastguard Worker// Example usage:
60*6777b538SAndroid Build Coastguard Worker//  #if GPB_STATIC_ANALYZER_ONLY(5621, 5623) ... #endif
61*6777b538SAndroid Build Coastguard Worker#define GPB_STATIC_ANALYZER_ONLY(BEGIN_APPLE_BUILD_VERSION, END_APPLE_BUILD_VERSION) \
62*6777b538SAndroid Build Coastguard Worker    (defined(__clang_analyzer__) && \
63*6777b538SAndroid Build Coastguard Worker     (__apple_build_version__ >= BEGIN_APPLE_BUILD_VERSION && \
64*6777b538SAndroid Build Coastguard Worker      __apple_build_version__ <= END_APPLE_BUILD_VERSION))
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Workerenum {
67*6777b538SAndroid Build Coastguard Worker  kMapKeyFieldNumber = 1,
68*6777b538SAndroid Build Coastguard Worker  kMapValueFieldNumber = 2,
69*6777b538SAndroid Build Coastguard Worker};
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Workerstatic BOOL DictDefault_IsValidValue(int32_t value) {
72*6777b538SAndroid Build Coastguard Worker  // Anything but the bad value marker is allowed.
73*6777b538SAndroid Build Coastguard Worker  return (value != kGPBUnrecognizedEnumeratorValue);
74*6777b538SAndroid Build Coastguard Worker}
75*6777b538SAndroid Build Coastguard Worker
76*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_2_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME1, GPBDATATYPE_NAME2)
77*6777b538SAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
78*6777b538SAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
79*6777b538SAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value);
80*6777b538SAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
81*6777b538SAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value);
82*6777b538SAndroid Build Coastguard Worker//%  } else {
83*6777b538SAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
84*6777b538SAndroid Build Coastguard Worker//%    return 0;
85*6777b538SAndroid Build Coastguard Worker//%  }
86*6777b538SAndroid Build Coastguard Worker//%}
87*6777b538SAndroid Build Coastguard Worker//%
88*6777b538SAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
89*6777b538SAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
90*6777b538SAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME1##:fieldNum value:value];
91*6777b538SAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
92*6777b538SAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME2##:fieldNum value:value];
93*6777b538SAndroid Build Coastguard Worker//%  } else {
94*6777b538SAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
95*6777b538SAndroid Build Coastguard Worker//%  }
96*6777b538SAndroid Build Coastguard Worker//%}
97*6777b538SAndroid Build Coastguard Worker//%
98*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_3_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME1, GPBDATATYPE_NAME2, GPBDATATYPE_NAME3)
99*6777b538SAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
100*6777b538SAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
101*6777b538SAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value);
102*6777b538SAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
103*6777b538SAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value);
104*6777b538SAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) {
105*6777b538SAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME3##Size(fieldNum, value);
106*6777b538SAndroid Build Coastguard Worker//%  } else {
107*6777b538SAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
108*6777b538SAndroid Build Coastguard Worker//%    return 0;
109*6777b538SAndroid Build Coastguard Worker//%  }
110*6777b538SAndroid Build Coastguard Worker//%}
111*6777b538SAndroid Build Coastguard Worker//%
112*6777b538SAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
113*6777b538SAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
114*6777b538SAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME1##:fieldNum value:value];
115*6777b538SAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
116*6777b538SAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME2##:fieldNum value:value];
117*6777b538SAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) {
118*6777b538SAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME3##:fieldNum value:value];
119*6777b538SAndroid Build Coastguard Worker//%  } else {
120*6777b538SAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
121*6777b538SAndroid Build Coastguard Worker//%  }
122*6777b538SAndroid Build Coastguard Worker//%}
123*6777b538SAndroid Build Coastguard Worker//%
124*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SIMPLE_SERIALIZE_SUPPORT(VALUE_NAME, VALUE_TYPE, VisP)
125*6777b538SAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) {
126*6777b538SAndroid Build Coastguard Worker//%  NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
127*6777b538SAndroid Build Coastguard Worker//%  #pragma unused(dataType)  // For when asserts are off in release.
128*6777b538SAndroid Build Coastguard Worker//%  return GPBCompute##VALUE_NAME##Size(fieldNum, value);
129*6777b538SAndroid Build Coastguard Worker//%}
130*6777b538SAndroid Build Coastguard Worker//%
131*6777b538SAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) {
132*6777b538SAndroid Build Coastguard Worker//%  NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
133*6777b538SAndroid Build Coastguard Worker//%  #pragma unused(dataType)  // For when asserts are off in release.
134*6777b538SAndroid Build Coastguard Worker//%  [stream write##VALUE_NAME##:fieldNum value:value];
135*6777b538SAndroid Build Coastguard Worker//%}
136*6777b538SAndroid Build Coastguard Worker//%
137*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_HELPERS()
138*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Int32, int32_t, Int32, SInt32, SFixed32)
139*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_2_TYPE(UInt32, uint32_t, UInt32, Fixed32)
140*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Int64, int64_t, Int64, SInt64, SFixed64)
141*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_2_TYPE(UInt64, uint64_t, UInt64, Fixed64)
142*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Bool, BOOL, )
143*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Enum, int32_t, )
144*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Float, float, )
145*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Double, double, )
146*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(String, NSString, *)
147*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Object, id, Message, String, Bytes)
148*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND SERIALIZE_SUPPORT_HELPERS()
149*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
150*6777b538SAndroid Build Coastguard Worker// clang-format off
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictInt32FieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) {
153*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt32) {
154*6777b538SAndroid Build Coastguard Worker    return GPBComputeInt32Size(fieldNum, value);
155*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt32) {
156*6777b538SAndroid Build Coastguard Worker    return GPBComputeSInt32Size(fieldNum, value);
157*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed32) {
158*6777b538SAndroid Build Coastguard Worker    return GPBComputeSFixed32Size(fieldNum, value);
159*6777b538SAndroid Build Coastguard Worker  } else {
160*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
161*6777b538SAndroid Build Coastguard Worker    return 0;
162*6777b538SAndroid Build Coastguard Worker  }
163*6777b538SAndroid Build Coastguard Worker}
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Workerstatic void WriteDictInt32Field(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, GPBDataType dataType) {
166*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt32) {
167*6777b538SAndroid Build Coastguard Worker    [stream writeInt32:fieldNum value:value];
168*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt32) {
169*6777b538SAndroid Build Coastguard Worker    [stream writeSInt32:fieldNum value:value];
170*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed32) {
171*6777b538SAndroid Build Coastguard Worker    [stream writeSFixed32:fieldNum value:value];
172*6777b538SAndroid Build Coastguard Worker  } else {
173*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
174*6777b538SAndroid Build Coastguard Worker  }
175*6777b538SAndroid Build Coastguard Worker}
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictUInt32FieldSize(uint32_t value, uint32_t fieldNum, GPBDataType dataType) {
178*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt32) {
179*6777b538SAndroid Build Coastguard Worker    return GPBComputeUInt32Size(fieldNum, value);
180*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed32) {
181*6777b538SAndroid Build Coastguard Worker    return GPBComputeFixed32Size(fieldNum, value);
182*6777b538SAndroid Build Coastguard Worker  } else {
183*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
184*6777b538SAndroid Build Coastguard Worker    return 0;
185*6777b538SAndroid Build Coastguard Worker  }
186*6777b538SAndroid Build Coastguard Worker}
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Workerstatic void WriteDictUInt32Field(GPBCodedOutputStream *stream, uint32_t value, uint32_t fieldNum, GPBDataType dataType) {
189*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt32) {
190*6777b538SAndroid Build Coastguard Worker    [stream writeUInt32:fieldNum value:value];
191*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed32) {
192*6777b538SAndroid Build Coastguard Worker    [stream writeFixed32:fieldNum value:value];
193*6777b538SAndroid Build Coastguard Worker  } else {
194*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
195*6777b538SAndroid Build Coastguard Worker  }
196*6777b538SAndroid Build Coastguard Worker}
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictInt64FieldSize(int64_t value, uint32_t fieldNum, GPBDataType dataType) {
199*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt64) {
200*6777b538SAndroid Build Coastguard Worker    return GPBComputeInt64Size(fieldNum, value);
201*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt64) {
202*6777b538SAndroid Build Coastguard Worker    return GPBComputeSInt64Size(fieldNum, value);
203*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed64) {
204*6777b538SAndroid Build Coastguard Worker    return GPBComputeSFixed64Size(fieldNum, value);
205*6777b538SAndroid Build Coastguard Worker  } else {
206*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
207*6777b538SAndroid Build Coastguard Worker    return 0;
208*6777b538SAndroid Build Coastguard Worker  }
209*6777b538SAndroid Build Coastguard Worker}
210*6777b538SAndroid Build Coastguard Worker
211*6777b538SAndroid Build Coastguard Workerstatic void WriteDictInt64Field(GPBCodedOutputStream *stream, int64_t value, uint32_t fieldNum, GPBDataType dataType) {
212*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt64) {
213*6777b538SAndroid Build Coastguard Worker    [stream writeInt64:fieldNum value:value];
214*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt64) {
215*6777b538SAndroid Build Coastguard Worker    [stream writeSInt64:fieldNum value:value];
216*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed64) {
217*6777b538SAndroid Build Coastguard Worker    [stream writeSFixed64:fieldNum value:value];
218*6777b538SAndroid Build Coastguard Worker  } else {
219*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
220*6777b538SAndroid Build Coastguard Worker  }
221*6777b538SAndroid Build Coastguard Worker}
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictUInt64FieldSize(uint64_t value, uint32_t fieldNum, GPBDataType dataType) {
224*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt64) {
225*6777b538SAndroid Build Coastguard Worker    return GPBComputeUInt64Size(fieldNum, value);
226*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed64) {
227*6777b538SAndroid Build Coastguard Worker    return GPBComputeFixed64Size(fieldNum, value);
228*6777b538SAndroid Build Coastguard Worker  } else {
229*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
230*6777b538SAndroid Build Coastguard Worker    return 0;
231*6777b538SAndroid Build Coastguard Worker  }
232*6777b538SAndroid Build Coastguard Worker}
233*6777b538SAndroid Build Coastguard Worker
234*6777b538SAndroid Build Coastguard Workerstatic void WriteDictUInt64Field(GPBCodedOutputStream *stream, uint64_t value, uint32_t fieldNum, GPBDataType dataType) {
235*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt64) {
236*6777b538SAndroid Build Coastguard Worker    [stream writeUInt64:fieldNum value:value];
237*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed64) {
238*6777b538SAndroid Build Coastguard Worker    [stream writeFixed64:fieldNum value:value];
239*6777b538SAndroid Build Coastguard Worker  } else {
240*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
241*6777b538SAndroid Build Coastguard Worker  }
242*6777b538SAndroid Build Coastguard Worker}
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictBoolFieldSize(BOOL value, uint32_t fieldNum, GPBDataType dataType) {
245*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
246*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
247*6777b538SAndroid Build Coastguard Worker  return GPBComputeBoolSize(fieldNum, value);
248*6777b538SAndroid Build Coastguard Worker}
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Workerstatic void WriteDictBoolField(GPBCodedOutputStream *stream, BOOL value, uint32_t fieldNum, GPBDataType dataType) {
251*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
252*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
253*6777b538SAndroid Build Coastguard Worker  [stream writeBool:fieldNum value:value];
254*6777b538SAndroid Build Coastguard Worker}
255*6777b538SAndroid Build Coastguard Worker
256*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictEnumFieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) {
257*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
258*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
259*6777b538SAndroid Build Coastguard Worker  return GPBComputeEnumSize(fieldNum, value);
260*6777b538SAndroid Build Coastguard Worker}
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Workerstatic void WriteDictEnumField(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, GPBDataType dataType) {
263*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
264*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
265*6777b538SAndroid Build Coastguard Worker  [stream writeEnum:fieldNum value:value];
266*6777b538SAndroid Build Coastguard Worker}
267*6777b538SAndroid Build Coastguard Worker
268*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictFloatFieldSize(float value, uint32_t fieldNum, GPBDataType dataType) {
269*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
270*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
271*6777b538SAndroid Build Coastguard Worker  return GPBComputeFloatSize(fieldNum, value);
272*6777b538SAndroid Build Coastguard Worker}
273*6777b538SAndroid Build Coastguard Worker
274*6777b538SAndroid Build Coastguard Workerstatic void WriteDictFloatField(GPBCodedOutputStream *stream, float value, uint32_t fieldNum, GPBDataType dataType) {
275*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
276*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
277*6777b538SAndroid Build Coastguard Worker  [stream writeFloat:fieldNum value:value];
278*6777b538SAndroid Build Coastguard Worker}
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictDoubleFieldSize(double value, uint32_t fieldNum, GPBDataType dataType) {
281*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
282*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
283*6777b538SAndroid Build Coastguard Worker  return GPBComputeDoubleSize(fieldNum, value);
284*6777b538SAndroid Build Coastguard Worker}
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Workerstatic void WriteDictDoubleField(GPBCodedOutputStream *stream, double value, uint32_t fieldNum, GPBDataType dataType) {
287*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
288*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
289*6777b538SAndroid Build Coastguard Worker  [stream writeDouble:fieldNum value:value];
290*6777b538SAndroid Build Coastguard Worker}
291*6777b538SAndroid Build Coastguard Worker
292*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictStringFieldSize(NSString *value, uint32_t fieldNum, GPBDataType dataType) {
293*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
294*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
295*6777b538SAndroid Build Coastguard Worker  return GPBComputeStringSize(fieldNum, value);
296*6777b538SAndroid Build Coastguard Worker}
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Workerstatic void WriteDictStringField(GPBCodedOutputStream *stream, NSString *value, uint32_t fieldNum, GPBDataType dataType) {
299*6777b538SAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
300*6777b538SAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
301*6777b538SAndroid Build Coastguard Worker  [stream writeString:fieldNum value:value];
302*6777b538SAndroid Build Coastguard Worker}
303*6777b538SAndroid Build Coastguard Worker
304*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictObjectFieldSize(id value, uint32_t fieldNum, GPBDataType dataType) {
305*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeMessage) {
306*6777b538SAndroid Build Coastguard Worker    return GPBComputeMessageSize(fieldNum, value);
307*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeString) {
308*6777b538SAndroid Build Coastguard Worker    return GPBComputeStringSize(fieldNum, value);
309*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeBytes) {
310*6777b538SAndroid Build Coastguard Worker    return GPBComputeBytesSize(fieldNum, value);
311*6777b538SAndroid Build Coastguard Worker  } else {
312*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
313*6777b538SAndroid Build Coastguard Worker    return 0;
314*6777b538SAndroid Build Coastguard Worker  }
315*6777b538SAndroid Build Coastguard Worker}
316*6777b538SAndroid Build Coastguard Worker
317*6777b538SAndroid Build Coastguard Workerstatic void WriteDictObjectField(GPBCodedOutputStream *stream, id value, uint32_t fieldNum, GPBDataType dataType) {
318*6777b538SAndroid Build Coastguard Worker  if (dataType == GPBDataTypeMessage) {
319*6777b538SAndroid Build Coastguard Worker    [stream writeMessage:fieldNum value:value];
320*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeString) {
321*6777b538SAndroid Build Coastguard Worker    [stream writeString:fieldNum value:value];
322*6777b538SAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeBytes) {
323*6777b538SAndroid Build Coastguard Worker    [stream writeBytes:fieldNum value:value];
324*6777b538SAndroid Build Coastguard Worker  } else {
325*6777b538SAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
326*6777b538SAndroid Build Coastguard Worker  }
327*6777b538SAndroid Build Coastguard Worker}
328*6777b538SAndroid Build Coastguard Worker
329*6777b538SAndroid Build Coastguard Worker// clang-format on
330*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END SERIALIZE_SUPPORT_HELPERS()
331*6777b538SAndroid Build Coastguard Worker
332*6777b538SAndroid Build Coastguard Workersize_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
333*6777b538SAndroid Build Coastguard Worker  GPBDataType mapValueType = GPBGetFieldDataType(field);
334*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
335*6777b538SAndroid Build Coastguard Worker  NSString *key;
336*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [dict keyEnumerator];
337*6777b538SAndroid Build Coastguard Worker  while ((key = [keys nextObject])) {
338*6777b538SAndroid Build Coastguard Worker    id obj = dict[key];
339*6777b538SAndroid Build Coastguard Worker    size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key);
340*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueType);
341*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
342*6777b538SAndroid Build Coastguard Worker  }
343*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
344*6777b538SAndroid Build Coastguard Worker  result += tagSize * dict.count;
345*6777b538SAndroid Build Coastguard Worker  return result;
346*6777b538SAndroid Build Coastguard Worker}
347*6777b538SAndroid Build Coastguard Worker
348*6777b538SAndroid Build Coastguard Workervoid GPBDictionaryWriteToStreamInternalHelper(GPBCodedOutputStream *outputStream,
349*6777b538SAndroid Build Coastguard Worker                                              NSDictionary *dict,
350*6777b538SAndroid Build Coastguard Worker                                              GPBFieldDescriptor *field) {
351*6777b538SAndroid Build Coastguard Worker  NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
352*6777b538SAndroid Build Coastguard Worker  GPBDataType mapValueType = GPBGetFieldDataType(field);
353*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
354*6777b538SAndroid Build Coastguard Worker  NSString *key;
355*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [dict keyEnumerator];
356*6777b538SAndroid Build Coastguard Worker  while ((key = [keys nextObject])) {
357*6777b538SAndroid Build Coastguard Worker    id obj = dict[key];
358*6777b538SAndroid Build Coastguard Worker    // Write the tag.
359*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
360*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
361*6777b538SAndroid Build Coastguard Worker    size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key);
362*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueType);
363*6777b538SAndroid Build Coastguard Worker
364*6777b538SAndroid Build Coastguard Worker    // Write the size and fields.
365*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
366*6777b538SAndroid Build Coastguard Worker    [outputStream writeString:kMapKeyFieldNumber value:key];
367*6777b538SAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, obj, kMapValueFieldNumber, mapValueType);
368*6777b538SAndroid Build Coastguard Worker  }
369*6777b538SAndroid Build Coastguard Worker}
370*6777b538SAndroid Build Coastguard Worker
371*6777b538SAndroid Build Coastguard WorkerBOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
372*6777b538SAndroid Build Coastguard Worker  NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
373*6777b538SAndroid Build Coastguard Worker  NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeMessage, @"Unexpected value type");
374*6777b538SAndroid Build Coastguard Worker  #pragma unused(field)  // For when asserts are off in release.
375*6777b538SAndroid Build Coastguard Worker  GPBMessage *msg;
376*6777b538SAndroid Build Coastguard Worker  NSEnumerator *objects = [dict objectEnumerator];
377*6777b538SAndroid Build Coastguard Worker  while ((msg = [objects nextObject])) {
378*6777b538SAndroid Build Coastguard Worker    if (!msg.initialized) {
379*6777b538SAndroid Build Coastguard Worker      return NO;
380*6777b538SAndroid Build Coastguard Worker    }
381*6777b538SAndroid Build Coastguard Worker  }
382*6777b538SAndroid Build Coastguard Worker  return YES;
383*6777b538SAndroid Build Coastguard Worker}
384*6777b538SAndroid Build Coastguard Worker
385*6777b538SAndroid Build Coastguard Worker// Note: if the type is an object, it the retain pass back to the caller.
386*6777b538SAndroid Build Coastguard Workerstatic void ReadValue(GPBCodedInputStream *stream,
387*6777b538SAndroid Build Coastguard Worker                      GPBGenericValue *valueToFill,
388*6777b538SAndroid Build Coastguard Worker                      GPBDataType type,
389*6777b538SAndroid Build Coastguard Worker                      GPBExtensionRegistry *registry,
390*6777b538SAndroid Build Coastguard Worker                      GPBFieldDescriptor *field) {
391*6777b538SAndroid Build Coastguard Worker  switch (type) {
392*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeBool:
393*6777b538SAndroid Build Coastguard Worker      valueToFill->valueBool = GPBCodedInputStreamReadBool(&stream->state_);
394*6777b538SAndroid Build Coastguard Worker      break;
395*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeFixed32:
396*6777b538SAndroid Build Coastguard Worker      valueToFill->valueUInt32 = GPBCodedInputStreamReadFixed32(&stream->state_);
397*6777b538SAndroid Build Coastguard Worker      break;
398*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeSFixed32:
399*6777b538SAndroid Build Coastguard Worker      valueToFill->valueInt32 = GPBCodedInputStreamReadSFixed32(&stream->state_);
400*6777b538SAndroid Build Coastguard Worker      break;
401*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeFloat:
402*6777b538SAndroid Build Coastguard Worker      valueToFill->valueFloat = GPBCodedInputStreamReadFloat(&stream->state_);
403*6777b538SAndroid Build Coastguard Worker      break;
404*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeFixed64:
405*6777b538SAndroid Build Coastguard Worker      valueToFill->valueUInt64 = GPBCodedInputStreamReadFixed64(&stream->state_);
406*6777b538SAndroid Build Coastguard Worker      break;
407*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeSFixed64:
408*6777b538SAndroid Build Coastguard Worker      valueToFill->valueInt64 = GPBCodedInputStreamReadSFixed64(&stream->state_);
409*6777b538SAndroid Build Coastguard Worker      break;
410*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeDouble:
411*6777b538SAndroid Build Coastguard Worker      valueToFill->valueDouble = GPBCodedInputStreamReadDouble(&stream->state_);
412*6777b538SAndroid Build Coastguard Worker      break;
413*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeInt32:
414*6777b538SAndroid Build Coastguard Worker      valueToFill->valueInt32 = GPBCodedInputStreamReadInt32(&stream->state_);
415*6777b538SAndroid Build Coastguard Worker      break;
416*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeInt64:
417*6777b538SAndroid Build Coastguard Worker      valueToFill->valueInt64 = GPBCodedInputStreamReadInt64(&stream->state_);
418*6777b538SAndroid Build Coastguard Worker      break;
419*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeSInt32:
420*6777b538SAndroid Build Coastguard Worker      valueToFill->valueInt32 = GPBCodedInputStreamReadSInt32(&stream->state_);
421*6777b538SAndroid Build Coastguard Worker      break;
422*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeSInt64:
423*6777b538SAndroid Build Coastguard Worker      valueToFill->valueInt64 = GPBCodedInputStreamReadSInt64(&stream->state_);
424*6777b538SAndroid Build Coastguard Worker      break;
425*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeUInt32:
426*6777b538SAndroid Build Coastguard Worker      valueToFill->valueUInt32 = GPBCodedInputStreamReadUInt32(&stream->state_);
427*6777b538SAndroid Build Coastguard Worker      break;
428*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeUInt64:
429*6777b538SAndroid Build Coastguard Worker      valueToFill->valueUInt64 = GPBCodedInputStreamReadUInt64(&stream->state_);
430*6777b538SAndroid Build Coastguard Worker      break;
431*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeBytes:
432*6777b538SAndroid Build Coastguard Worker      [valueToFill->valueData release];
433*6777b538SAndroid Build Coastguard Worker      valueToFill->valueData = GPBCodedInputStreamReadRetainedBytes(&stream->state_);
434*6777b538SAndroid Build Coastguard Worker      break;
435*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeString:
436*6777b538SAndroid Build Coastguard Worker      [valueToFill->valueString release];
437*6777b538SAndroid Build Coastguard Worker      valueToFill->valueString = GPBCodedInputStreamReadRetainedString(&stream->state_);
438*6777b538SAndroid Build Coastguard Worker      break;
439*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeMessage: {
440*6777b538SAndroid Build Coastguard Worker      GPBMessage *message = [[field.msgClass alloc] init];
441*6777b538SAndroid Build Coastguard Worker      [stream readMessage:message extensionRegistry:registry];
442*6777b538SAndroid Build Coastguard Worker      [valueToFill->valueMessage release];
443*6777b538SAndroid Build Coastguard Worker      valueToFill->valueMessage = message;
444*6777b538SAndroid Build Coastguard Worker      break;
445*6777b538SAndroid Build Coastguard Worker    }
446*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeGroup:
447*6777b538SAndroid Build Coastguard Worker      NSCAssert(NO, @"Can't happen");
448*6777b538SAndroid Build Coastguard Worker      break;
449*6777b538SAndroid Build Coastguard Worker    case GPBDataTypeEnum:
450*6777b538SAndroid Build Coastguard Worker      valueToFill->valueEnum = GPBCodedInputStreamReadEnum(&stream->state_);
451*6777b538SAndroid Build Coastguard Worker      break;
452*6777b538SAndroid Build Coastguard Worker  }
453*6777b538SAndroid Build Coastguard Worker}
454*6777b538SAndroid Build Coastguard Worker
455*6777b538SAndroid Build Coastguard Workervoid GPBDictionaryReadEntry(id mapDictionary,
456*6777b538SAndroid Build Coastguard Worker                            GPBCodedInputStream *stream,
457*6777b538SAndroid Build Coastguard Worker                            GPBExtensionRegistry *registry,
458*6777b538SAndroid Build Coastguard Worker                            GPBFieldDescriptor *field,
459*6777b538SAndroid Build Coastguard Worker                            GPBMessage *parentMessage) {
460*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
461*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
462*6777b538SAndroid Build Coastguard Worker
463*6777b538SAndroid Build Coastguard Worker  GPBGenericValue key;
464*6777b538SAndroid Build Coastguard Worker  GPBGenericValue value;
465*6777b538SAndroid Build Coastguard Worker  // Zero them (but pick up any enum default for proto2).
466*6777b538SAndroid Build Coastguard Worker  key.valueString = value.valueString = nil;
467*6777b538SAndroid Build Coastguard Worker  if (valueDataType == GPBDataTypeEnum) {
468*6777b538SAndroid Build Coastguard Worker    value = field.defaultValue;
469*6777b538SAndroid Build Coastguard Worker  }
470*6777b538SAndroid Build Coastguard Worker
471*6777b538SAndroid Build Coastguard Worker  GPBCodedInputStreamState *state = &stream->state_;
472*6777b538SAndroid Build Coastguard Worker  uint32_t keyTag =
473*6777b538SAndroid Build Coastguard Worker      GPBWireFormatMakeTag(kMapKeyFieldNumber, GPBWireFormatForType(keyDataType, NO));
474*6777b538SAndroid Build Coastguard Worker  uint32_t valueTag =
475*6777b538SAndroid Build Coastguard Worker      GPBWireFormatMakeTag(kMapValueFieldNumber, GPBWireFormatForType(valueDataType, NO));
476*6777b538SAndroid Build Coastguard Worker
477*6777b538SAndroid Build Coastguard Worker  BOOL hitError = NO;
478*6777b538SAndroid Build Coastguard Worker  while (YES) {
479*6777b538SAndroid Build Coastguard Worker    uint32_t tag = GPBCodedInputStreamReadTag(state);
480*6777b538SAndroid Build Coastguard Worker    if (tag == keyTag) {
481*6777b538SAndroid Build Coastguard Worker      ReadValue(stream, &key, keyDataType, registry, field);
482*6777b538SAndroid Build Coastguard Worker    } else if (tag == valueTag) {
483*6777b538SAndroid Build Coastguard Worker      ReadValue(stream, &value, valueDataType, registry, field);
484*6777b538SAndroid Build Coastguard Worker    } else if (tag == 0) {
485*6777b538SAndroid Build Coastguard Worker      // zero signals EOF / limit reached
486*6777b538SAndroid Build Coastguard Worker      break;
487*6777b538SAndroid Build Coastguard Worker    } else {  // Unknown
488*6777b538SAndroid Build Coastguard Worker      if (![stream skipField:tag]){
489*6777b538SAndroid Build Coastguard Worker        hitError = YES;
490*6777b538SAndroid Build Coastguard Worker        break;
491*6777b538SAndroid Build Coastguard Worker      }
492*6777b538SAndroid Build Coastguard Worker    }
493*6777b538SAndroid Build Coastguard Worker  }
494*6777b538SAndroid Build Coastguard Worker
495*6777b538SAndroid Build Coastguard Worker  if (!hitError) {
496*6777b538SAndroid Build Coastguard Worker    // Handle the special defaults and/or missing key/value.
497*6777b538SAndroid Build Coastguard Worker    if ((keyDataType == GPBDataTypeString) && (key.valueString == nil)) {
498*6777b538SAndroid Build Coastguard Worker      key.valueString = [@"" retain];
499*6777b538SAndroid Build Coastguard Worker    }
500*6777b538SAndroid Build Coastguard Worker    if (GPBDataTypeIsObject(valueDataType) && value.valueString == nil) {
501*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic push
502*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wswitch-enum"
503*6777b538SAndroid Build Coastguard Worker      switch (valueDataType) {
504*6777b538SAndroid Build Coastguard Worker        case GPBDataTypeString:
505*6777b538SAndroid Build Coastguard Worker          value.valueString = [@"" retain];
506*6777b538SAndroid Build Coastguard Worker          break;
507*6777b538SAndroid Build Coastguard Worker        case GPBDataTypeBytes:
508*6777b538SAndroid Build Coastguard Worker          value.valueData = [GPBEmptyNSData() retain];
509*6777b538SAndroid Build Coastguard Worker          break;
510*6777b538SAndroid Build Coastguard Worker#if defined(__clang_analyzer__)
511*6777b538SAndroid Build Coastguard Worker        case GPBDataTypeGroup:
512*6777b538SAndroid Build Coastguard Worker          // Maps can't really have Groups as the value type, but this case is needed
513*6777b538SAndroid Build Coastguard Worker          // so the analyzer won't report the possibility of send nil in for the value
514*6777b538SAndroid Build Coastguard Worker          // in the NSMutableDictionary case below.
515*6777b538SAndroid Build Coastguard Worker#endif
516*6777b538SAndroid Build Coastguard Worker        case GPBDataTypeMessage: {
517*6777b538SAndroid Build Coastguard Worker          value.valueMessage = [[field.msgClass alloc] init];
518*6777b538SAndroid Build Coastguard Worker          break;
519*6777b538SAndroid Build Coastguard Worker        }
520*6777b538SAndroid Build Coastguard Worker        default:
521*6777b538SAndroid Build Coastguard Worker          // Nothing
522*6777b538SAndroid Build Coastguard Worker          break;
523*6777b538SAndroid Build Coastguard Worker      }
524*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic pop
525*6777b538SAndroid Build Coastguard Worker    }
526*6777b538SAndroid Build Coastguard Worker
527*6777b538SAndroid Build Coastguard Worker    if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) {
528*6777b538SAndroid Build Coastguard Worker#if GPB_STATIC_ANALYZER_ONLY(6020053, 7000181)
529*6777b538SAndroid Build Coastguard Worker     // Limited to Xcode 6.4 - 7.2, are known to fail here. The upper end can
530*6777b538SAndroid Build Coastguard Worker     // be raised as needed for new Xcodes.
531*6777b538SAndroid Build Coastguard Worker     //
532*6777b538SAndroid Build Coastguard Worker     // This is only needed on a "shallow" analyze; on a "deep" analyze, the
533*6777b538SAndroid Build Coastguard Worker     // existing code path gets this correct. In shallow, the analyzer decides
534*6777b538SAndroid Build Coastguard Worker     // GPBDataTypeIsObject(valueDataType) is both false and true on a single
535*6777b538SAndroid Build Coastguard Worker     // path through this function, allowing nil to be used for the
536*6777b538SAndroid Build Coastguard Worker     // setObject:forKey:.
537*6777b538SAndroid Build Coastguard Worker     if (value.valueString == nil) {
538*6777b538SAndroid Build Coastguard Worker       value.valueString = [@"" retain];
539*6777b538SAndroid Build Coastguard Worker     }
540*6777b538SAndroid Build Coastguard Worker#endif
541*6777b538SAndroid Build Coastguard Worker      // mapDictionary is an NSMutableDictionary
542*6777b538SAndroid Build Coastguard Worker      [(NSMutableDictionary *)mapDictionary setObject:value.valueString
543*6777b538SAndroid Build Coastguard Worker                                               forKey:key.valueString];
544*6777b538SAndroid Build Coastguard Worker    } else {
545*6777b538SAndroid Build Coastguard Worker      if (valueDataType == GPBDataTypeEnum) {
546*6777b538SAndroid Build Coastguard Worker        if (GPBHasPreservingUnknownEnumSemantics([parentMessage descriptor].file.syntax) ||
547*6777b538SAndroid Build Coastguard Worker            [field isValidEnumValue:value.valueEnum]) {
548*6777b538SAndroid Build Coastguard Worker          [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key];
549*6777b538SAndroid Build Coastguard Worker        } else {
550*6777b538SAndroid Build Coastguard Worker          NSData *data = [mapDictionary serializedDataForUnknownValue:value.valueEnum
551*6777b538SAndroid Build Coastguard Worker                                                               forKey:&key
552*6777b538SAndroid Build Coastguard Worker                                                          keyDataType:keyDataType];
553*6777b538SAndroid Build Coastguard Worker          [parentMessage addUnknownMapEntry:GPBFieldNumber(field) value:data];
554*6777b538SAndroid Build Coastguard Worker        }
555*6777b538SAndroid Build Coastguard Worker      } else {
556*6777b538SAndroid Build Coastguard Worker        [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key];
557*6777b538SAndroid Build Coastguard Worker      }
558*6777b538SAndroid Build Coastguard Worker    }
559*6777b538SAndroid Build Coastguard Worker  }
560*6777b538SAndroid Build Coastguard Worker
561*6777b538SAndroid Build Coastguard Worker  if (GPBDataTypeIsObject(keyDataType)) {
562*6777b538SAndroid Build Coastguard Worker    [key.valueString release];
563*6777b538SAndroid Build Coastguard Worker  }
564*6777b538SAndroid Build Coastguard Worker  if (GPBDataTypeIsObject(valueDataType)) {
565*6777b538SAndroid Build Coastguard Worker    [value.valueString release];
566*6777b538SAndroid Build Coastguard Worker  }
567*6777b538SAndroid Build Coastguard Worker}
568*6777b538SAndroid Build Coastguard Worker
569*6777b538SAndroid Build Coastguard Worker//
570*6777b538SAndroid Build Coastguard Worker// Macros for the common basic cases.
571*6777b538SAndroid Build Coastguard Worker//
572*6777b538SAndroid Build Coastguard Worker
573*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_IMPL_FOR_POD_KEY(KEY_NAME, KEY_TYPE)
574*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, , POD)
575*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, Object, id)
576*6777b538SAndroid Build Coastguard Worker
577*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, KisP, KHELPER)
578*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt32, uint32_t, KHELPER)
579*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int32, int32_t, KHELPER)
580*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt64, uint64_t, KHELPER)
581*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int64, int64_t, KHELPER)
582*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Bool, BOOL, KHELPER)
583*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Float, float, KHELPER)
584*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Double, double, KHELPER)
585*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, Enum, int32_t, KHELPER)
586*6777b538SAndroid Build Coastguard Worker
587*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
588*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD, VALUE_NAME, value)
589*6777b538SAndroid Build Coastguard Worker
590*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, VALUE_NAME, VALUE_TYPE)
591*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, , VALUE_NAME, VALUE_TYPE, POD, OBJECT, Object, object)
592*6777b538SAndroid Build Coastguard Worker
593*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR)
594*6777b538SAndroid Build Coastguard Worker//%#pragma mark - KEY_NAME -> VALUE_NAME
595*6777b538SAndroid Build Coastguard Worker//%
596*6777b538SAndroid Build Coastguard Worker//%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary {
597*6777b538SAndroid Build Coastguard Worker//% @package
598*6777b538SAndroid Build Coastguard Worker//%  NSMutableDictionary *_dictionary;
599*6777b538SAndroid Build Coastguard Worker//%}
600*6777b538SAndroid Build Coastguard Worker//%
601*6777b538SAndroid Build Coastguard Worker//%- (instancetype)init {
602*6777b538SAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
603*6777b538SAndroid Build Coastguard Worker//%}
604*6777b538SAndroid Build Coastguard Worker//%
605*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWith##VNAME##s:(const VALUE_TYPE [])##VNAME_VAR##s
606*6777b538SAndroid Build Coastguard Worker//%                ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
607*6777b538SAndroid Build Coastguard Worker//%                ##VNAME$S##    count:(NSUInteger)count {
608*6777b538SAndroid Build Coastguard Worker//%  self = [super init];
609*6777b538SAndroid Build Coastguard Worker//%  if (self) {
610*6777b538SAndroid Build Coastguard Worker//%    _dictionary = [[NSMutableDictionary alloc] init];
611*6777b538SAndroid Build Coastguard Worker//%    if (count && VNAME_VAR##s && keys) {
612*6777b538SAndroid Build Coastguard Worker//%      for (NSUInteger i = 0; i < count; ++i) {
613*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME_VAR##s[i], ______)##DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______)        [_dictionary setObject:WRAPPED##VHELPER(VNAME_VAR##s[i]) forKey:WRAPPED##KHELPER(keys[i])];
614*6777b538SAndroid Build Coastguard Worker//%      }
615*6777b538SAndroid Build Coastguard Worker//%    }
616*6777b538SAndroid Build Coastguard Worker//%  }
617*6777b538SAndroid Build Coastguard Worker//%  return self;
618*6777b538SAndroid Build Coastguard Worker//%}
619*6777b538SAndroid Build Coastguard Worker//%
620*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary {
621*6777b538SAndroid Build Coastguard Worker//%  self = [self initWith##VNAME##s:NULL forKeys:NULL count:0];
622*6777b538SAndroid Build Coastguard Worker//%  if (self) {
623*6777b538SAndroid Build Coastguard Worker//%    if (dictionary) {
624*6777b538SAndroid Build Coastguard Worker//%      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
625*6777b538SAndroid Build Coastguard Worker//%    }
626*6777b538SAndroid Build Coastguard Worker//%  }
627*6777b538SAndroid Build Coastguard Worker//%  return self;
628*6777b538SAndroid Build Coastguard Worker//%}
629*6777b538SAndroid Build Coastguard Worker//%
630*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithCapacity:(NSUInteger)numItems {
631*6777b538SAndroid Build Coastguard Worker//%  #pragma unused(numItems)
632*6777b538SAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
633*6777b538SAndroid Build Coastguard Worker//%}
634*6777b538SAndroid Build Coastguard Worker//%
635*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, )
636*6777b538SAndroid Build Coastguard Worker//%
637*6777b538SAndroid Build Coastguard Worker//%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
638*6777b538SAndroid Build Coastguard Worker//%
639*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, )
640*6777b538SAndroid Build Coastguard Worker//%
641*6777b538SAndroid Build Coastguard Worker//%@end
642*6777b538SAndroid Build Coastguard Worker//%
643*6777b538SAndroid Build Coastguard Worker
644*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
645*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD)
646*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER)
647*6777b538SAndroid Build Coastguard Worker//%#pragma mark - KEY_NAME -> VALUE_NAME
648*6777b538SAndroid Build Coastguard Worker//%
649*6777b538SAndroid Build Coastguard Worker//%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary {
650*6777b538SAndroid Build Coastguard Worker//% @package
651*6777b538SAndroid Build Coastguard Worker//%  NSMutableDictionary *_dictionary;
652*6777b538SAndroid Build Coastguard Worker//%  GPBEnumValidationFunc _validationFunc;
653*6777b538SAndroid Build Coastguard Worker//%}
654*6777b538SAndroid Build Coastguard Worker//%
655*6777b538SAndroid Build Coastguard Worker//%@synthesize validationFunc = _validationFunc;
656*6777b538SAndroid Build Coastguard Worker//%
657*6777b538SAndroid Build Coastguard Worker//%- (instancetype)init {
658*6777b538SAndroid Build Coastguard Worker//%  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
659*6777b538SAndroid Build Coastguard Worker//%}
660*6777b538SAndroid Build Coastguard Worker//%
661*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
662*6777b538SAndroid Build Coastguard Worker//%  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
663*6777b538SAndroid Build Coastguard Worker//%}
664*6777b538SAndroid Build Coastguard Worker//%
665*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
666*6777b538SAndroid Build Coastguard Worker//%                                 rawValues:(const VALUE_TYPE [])rawValues
667*6777b538SAndroid Build Coastguard Worker//%                                   forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
668*6777b538SAndroid Build Coastguard Worker//%                                     count:(NSUInteger)count {
669*6777b538SAndroid Build Coastguard Worker//%  self = [super init];
670*6777b538SAndroid Build Coastguard Worker//%  if (self) {
671*6777b538SAndroid Build Coastguard Worker//%    _dictionary = [[NSMutableDictionary alloc] init];
672*6777b538SAndroid Build Coastguard Worker//%    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
673*6777b538SAndroid Build Coastguard Worker//%    if (count && rawValues && keys) {
674*6777b538SAndroid Build Coastguard Worker//%      for (NSUInteger i = 0; i < count; ++i) {
675*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______)        [_dictionary setObject:WRAPPED##VHELPER(rawValues[i]) forKey:WRAPPED##KHELPER(keys[i])];
676*6777b538SAndroid Build Coastguard Worker//%      }
677*6777b538SAndroid Build Coastguard Worker//%    }
678*6777b538SAndroid Build Coastguard Worker//%  }
679*6777b538SAndroid Build Coastguard Worker//%  return self;
680*6777b538SAndroid Build Coastguard Worker//%}
681*6777b538SAndroid Build Coastguard Worker//%
682*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary {
683*6777b538SAndroid Build Coastguard Worker//%  self = [self initWithValidationFunction:dictionary.validationFunc
684*6777b538SAndroid Build Coastguard Worker//%                                rawValues:NULL
685*6777b538SAndroid Build Coastguard Worker//%                                  forKeys:NULL
686*6777b538SAndroid Build Coastguard Worker//%                                    count:0];
687*6777b538SAndroid Build Coastguard Worker//%  if (self) {
688*6777b538SAndroid Build Coastguard Worker//%    if (dictionary) {
689*6777b538SAndroid Build Coastguard Worker//%      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
690*6777b538SAndroid Build Coastguard Worker//%    }
691*6777b538SAndroid Build Coastguard Worker//%  }
692*6777b538SAndroid Build Coastguard Worker//%  return self;
693*6777b538SAndroid Build Coastguard Worker//%}
694*6777b538SAndroid Build Coastguard Worker//%
695*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
696*6777b538SAndroid Build Coastguard Worker//%                                  capacity:(NSUInteger)numItems {
697*6777b538SAndroid Build Coastguard Worker//%  #pragma unused(numItems)
698*6777b538SAndroid Build Coastguard Worker//%  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
699*6777b538SAndroid Build Coastguard Worker//%}
700*6777b538SAndroid Build Coastguard Worker//%
701*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, value, Raw)
702*6777b538SAndroid Build Coastguard Worker//%
703*6777b538SAndroid Build Coastguard Worker//%- (BOOL)getEnum:(VALUE_TYPE *)value forKey:(KEY_TYPE##KisP$S##KisP)key {
704*6777b538SAndroid Build Coastguard Worker//%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
705*6777b538SAndroid Build Coastguard Worker//%  if (wrapped && value) {
706*6777b538SAndroid Build Coastguard Worker//%    VALUE_TYPE result = UNWRAP##VALUE_NAME(wrapped);
707*6777b538SAndroid Build Coastguard Worker//%    if (!_validationFunc(result)) {
708*6777b538SAndroid Build Coastguard Worker//%      result = kGPBUnrecognizedEnumeratorValue;
709*6777b538SAndroid Build Coastguard Worker//%    }
710*6777b538SAndroid Build Coastguard Worker//%    *value = result;
711*6777b538SAndroid Build Coastguard Worker//%  }
712*6777b538SAndroid Build Coastguard Worker//%  return (wrapped != NULL);
713*6777b538SAndroid Build Coastguard Worker//%}
714*6777b538SAndroid Build Coastguard Worker//%
715*6777b538SAndroid Build Coastguard Worker//%- (BOOL)getRawValue:(VALUE_TYPE *)rawValue forKey:(KEY_TYPE##KisP$S##KisP)key {
716*6777b538SAndroid Build Coastguard Worker//%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
717*6777b538SAndroid Build Coastguard Worker//%  if (wrapped && rawValue) {
718*6777b538SAndroid Build Coastguard Worker//%    *rawValue = UNWRAP##VALUE_NAME(wrapped);
719*6777b538SAndroid Build Coastguard Worker//%  }
720*6777b538SAndroid Build Coastguard Worker//%  return (wrapped != NULL);
721*6777b538SAndroid Build Coastguard Worker//%}
722*6777b538SAndroid Build Coastguard Worker//%
723*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateKeysAndEnumsUsingBlock:
724*6777b538SAndroid Build Coastguard Worker//%    (void (NS_NOESCAPE ^)(KEY_TYPE KisP##key, VALUE_TYPE value, BOOL *stop))block {
725*6777b538SAndroid Build Coastguard Worker//%  GPBEnumValidationFunc func = _validationFunc;
726*6777b538SAndroid Build Coastguard Worker//%  BOOL stop = NO;
727*6777b538SAndroid Build Coastguard Worker//%  NSEnumerator *keys = [_dictionary keyEnumerator];
728*6777b538SAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
729*6777b538SAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
730*6777b538SAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##aValue = _dictionary[aKey];
731*6777b538SAndroid Build Coastguard Worker//%      VALUE_TYPE unwrapped = UNWRAP##VALUE_NAME(aValue);
732*6777b538SAndroid Build Coastguard Worker//%      if (!func(unwrapped)) {
733*6777b538SAndroid Build Coastguard Worker//%        unwrapped = kGPBUnrecognizedEnumeratorValue;
734*6777b538SAndroid Build Coastguard Worker//%      }
735*6777b538SAndroid Build Coastguard Worker//%    block(UNWRAP##KEY_NAME(aKey), unwrapped, &stop);
736*6777b538SAndroid Build Coastguard Worker//%    if (stop) {
737*6777b538SAndroid Build Coastguard Worker//%      break;
738*6777b538SAndroid Build Coastguard Worker//%    }
739*6777b538SAndroid Build Coastguard Worker//%  }
740*6777b538SAndroid Build Coastguard Worker//%}
741*6777b538SAndroid Build Coastguard Worker//%
742*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, Enum, value, Raw)
743*6777b538SAndroid Build Coastguard Worker//%
744*6777b538SAndroid Build Coastguard Worker//%- (void)setEnum:(VALUE_TYPE)value forKey:(KEY_TYPE##KisP$S##KisP)key {
745*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_KEY_##KHELPER(key, )  if (!_validationFunc(value)) {
746*6777b538SAndroid Build Coastguard Worker//%    [NSException raise:NSInvalidArgumentException
747*6777b538SAndroid Build Coastguard Worker//%                format:@"GPB##KEY_NAME##VALUE_NAME##Dictionary: Attempt to set an unknown enum value (%d)",
748*6777b538SAndroid Build Coastguard Worker//%                       value];
749*6777b538SAndroid Build Coastguard Worker//%  }
750*6777b538SAndroid Build Coastguard Worker//%
751*6777b538SAndroid Build Coastguard Worker//%  [_dictionary setObject:WRAPPED##VHELPER(value) forKey:WRAPPED##KHELPER(key)];
752*6777b538SAndroid Build Coastguard Worker//%  if (_autocreator) {
753*6777b538SAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
754*6777b538SAndroid Build Coastguard Worker//%  }
755*6777b538SAndroid Build Coastguard Worker//%}
756*6777b538SAndroid Build Coastguard Worker//%
757*6777b538SAndroid Build Coastguard Worker//%@end
758*6777b538SAndroid Build Coastguard Worker//%
759*6777b538SAndroid Build Coastguard Worker
760*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ACCESSOR_NAME)
761*6777b538SAndroid Build Coastguard Worker//%- (void)dealloc {
762*6777b538SAndroid Build Coastguard Worker//%  NSAssert(!_autocreator,
763*6777b538SAndroid Build Coastguard Worker//%           @"%@: Autocreator must be cleared before release, autocreator: %@",
764*6777b538SAndroid Build Coastguard Worker//%           [self class], _autocreator);
765*6777b538SAndroid Build Coastguard Worker//%  [_dictionary release];
766*6777b538SAndroid Build Coastguard Worker//%  [super dealloc];
767*6777b538SAndroid Build Coastguard Worker//%}
768*6777b538SAndroid Build Coastguard Worker//%
769*6777b538SAndroid Build Coastguard Worker//%- (instancetype)copyWithZone:(NSZone *)zone {
770*6777b538SAndroid Build Coastguard Worker//%  return [[GPB##KEY_NAME##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self];
771*6777b538SAndroid Build Coastguard Worker//%}
772*6777b538SAndroid Build Coastguard Worker//%
773*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isEqual:(id)other {
774*6777b538SAndroid Build Coastguard Worker//%  if (self == other) {
775*6777b538SAndroid Build Coastguard Worker//%    return YES;
776*6777b538SAndroid Build Coastguard Worker//%  }
777*6777b538SAndroid Build Coastguard Worker//%  if (![other isKindOfClass:[GPB##KEY_NAME##VALUE_NAME##Dictionary class]]) {
778*6777b538SAndroid Build Coastguard Worker//%    return NO;
779*6777b538SAndroid Build Coastguard Worker//%  }
780*6777b538SAndroid Build Coastguard Worker//%  GPB##KEY_NAME##VALUE_NAME##Dictionary *otherDictionary = other;
781*6777b538SAndroid Build Coastguard Worker//%  return [_dictionary isEqual:otherDictionary->_dictionary];
782*6777b538SAndroid Build Coastguard Worker//%}
783*6777b538SAndroid Build Coastguard Worker//%
784*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)hash {
785*6777b538SAndroid Build Coastguard Worker//%  return _dictionary.count;
786*6777b538SAndroid Build Coastguard Worker//%}
787*6777b538SAndroid Build Coastguard Worker//%
788*6777b538SAndroid Build Coastguard Worker//%- (NSString *)description {
789*6777b538SAndroid Build Coastguard Worker//%  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
790*6777b538SAndroid Build Coastguard Worker//%}
791*6777b538SAndroid Build Coastguard Worker//%
792*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)count {
793*6777b538SAndroid Build Coastguard Worker//%  return _dictionary.count;
794*6777b538SAndroid Build Coastguard Worker//%}
795*6777b538SAndroid Build Coastguard Worker//%
796*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:
797*6777b538SAndroid Build Coastguard Worker//%    (void (NS_NOESCAPE ^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop))block {
798*6777b538SAndroid Build Coastguard Worker//%  BOOL stop = NO;
799*6777b538SAndroid Build Coastguard Worker//%  NSDictionary *internal = _dictionary;
800*6777b538SAndroid Build Coastguard Worker//%  NSEnumerator *keys = [internal keyEnumerator];
801*6777b538SAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
802*6777b538SAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
803*6777b538SAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
804*6777b538SAndroid Build Coastguard Worker//%    block(UNWRAP##KEY_NAME(aKey), UNWRAP##VALUE_NAME(a##VNAME_VAR$u), &stop);
805*6777b538SAndroid Build Coastguard Worker//%    if (stop) {
806*6777b538SAndroid Build Coastguard Worker//%      break;
807*6777b538SAndroid Build Coastguard Worker//%    }
808*6777b538SAndroid Build Coastguard Worker//%  }
809*6777b538SAndroid Build Coastguard Worker//%}
810*6777b538SAndroid Build Coastguard Worker//%
811*6777b538SAndroid Build Coastguard Worker//%EXTRA_METHODS_##VHELPER(KEY_NAME, VALUE_NAME)- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
812*6777b538SAndroid Build Coastguard Worker//%  NSDictionary *internal = _dictionary;
813*6777b538SAndroid Build Coastguard Worker//%  NSUInteger count = internal.count;
814*6777b538SAndroid Build Coastguard Worker//%  if (count == 0) {
815*6777b538SAndroid Build Coastguard Worker//%    return 0;
816*6777b538SAndroid Build Coastguard Worker//%  }
817*6777b538SAndroid Build Coastguard Worker//%
818*6777b538SAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
819*6777b538SAndroid Build Coastguard Worker//%  GPBDataType keyDataType = field.mapKeyDataType;
820*6777b538SAndroid Build Coastguard Worker//%  size_t result = 0;
821*6777b538SAndroid Build Coastguard Worker//%  NSEnumerator *keys = [internal keyEnumerator];
822*6777b538SAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
823*6777b538SAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
824*6777b538SAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
825*6777b538SAndroid Build Coastguard Worker//%    size_t msgSize = ComputeDict##KEY_NAME##FieldSize(UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType);
826*6777b538SAndroid Build Coastguard Worker//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME_VAR$u), kMapValueFieldNumber, valueDataType);
827*6777b538SAndroid Build Coastguard Worker//%    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
828*6777b538SAndroid Build Coastguard Worker//%  }
829*6777b538SAndroid Build Coastguard Worker//%  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
830*6777b538SAndroid Build Coastguard Worker//%  result += tagSize * count;
831*6777b538SAndroid Build Coastguard Worker//%  return result;
832*6777b538SAndroid Build Coastguard Worker//%}
833*6777b538SAndroid Build Coastguard Worker//%
834*6777b538SAndroid Build Coastguard Worker//%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
835*6777b538SAndroid Build Coastguard Worker//%                         asField:(GPBFieldDescriptor *)field {
836*6777b538SAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
837*6777b538SAndroid Build Coastguard Worker//%  GPBDataType keyDataType = field.mapKeyDataType;
838*6777b538SAndroid Build Coastguard Worker//%  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
839*6777b538SAndroid Build Coastguard Worker//%  NSDictionary *internal = _dictionary;
840*6777b538SAndroid Build Coastguard Worker//%  NSEnumerator *keys = [internal keyEnumerator];
841*6777b538SAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
842*6777b538SAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
843*6777b538SAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
844*6777b538SAndroid Build Coastguard Worker//%    [outputStream writeInt32NoTag:tag];
845*6777b538SAndroid Build Coastguard Worker//%    // Write the size of the message.
846*6777b538SAndroid Build Coastguard Worker//%    KEY_TYPE KisP##unwrappedKey = UNWRAP##KEY_NAME(aKey);
847*6777b538SAndroid Build Coastguard Worker//%    VALUE_TYPE unwrappedValue = UNWRAP##VALUE_NAME(a##VNAME_VAR$u);
848*6777b538SAndroid Build Coastguard Worker//%    size_t msgSize = ComputeDict##KEY_NAME##FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
849*6777b538SAndroid Build Coastguard Worker//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
850*6777b538SAndroid Build Coastguard Worker//%    [outputStream writeInt32NoTag:(int32_t)msgSize];
851*6777b538SAndroid Build Coastguard Worker//%    // Write the fields.
852*6777b538SAndroid Build Coastguard Worker//%    WriteDict##KEY_NAME##Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
853*6777b538SAndroid Build Coastguard Worker//%    WriteDict##VALUE_NAME##Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
854*6777b538SAndroid Build Coastguard Worker//%  }
855*6777b538SAndroid Build Coastguard Worker//%}
856*6777b538SAndroid Build Coastguard Worker//%
857*6777b538SAndroid Build Coastguard Worker//%SERIAL_DATA_FOR_ENTRY_##VHELPER(KEY_NAME, VALUE_NAME)- (void)setGPBGenericValue:(GPBGenericValue *)value
858*6777b538SAndroid Build Coastguard Worker//%     forGPBGenericValueKey:(GPBGenericValue *)key {
859*6777b538SAndroid Build Coastguard Worker//%  [_dictionary setObject:WRAPPED##VHELPER(value->##GPBVALUE_##VHELPER(VALUE_NAME)##) forKey:WRAPPED##KHELPER(key->value##KEY_NAME)];
860*6777b538SAndroid Build Coastguard Worker//%}
861*6777b538SAndroid Build Coastguard Worker//%
862*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
863*6777b538SAndroid Build Coastguard Worker//%  [self enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:^(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop) {
864*6777b538SAndroid Build Coastguard Worker//%      #pragma unused(stop)
865*6777b538SAndroid Build Coastguard Worker//%      block(TEXT_FORMAT_OBJ##KEY_NAME(key), TEXT_FORMAT_OBJ##VALUE_NAME(VNAME_VAR));
866*6777b538SAndroid Build Coastguard Worker//%  }];
867*6777b538SAndroid Build Coastguard Worker//%}
868*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ACCESSOR_NAME)
869*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME, VNAME_VAR, ACCESSOR_NAME)
870*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_REMOVE, VNAME_VAR, ACCESSOR_NAME)
871*6777b538SAndroid Build Coastguard Worker//%- (void)add##ACCESSOR_NAME##EntriesFromDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)otherDictionary {
872*6777b538SAndroid Build Coastguard Worker//%  if (otherDictionary) {
873*6777b538SAndroid Build Coastguard Worker//%    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
874*6777b538SAndroid Build Coastguard Worker//%    if (_autocreator) {
875*6777b538SAndroid Build Coastguard Worker//%      GPBAutocreatedDictionaryModified(_autocreator, self);
876*6777b538SAndroid Build Coastguard Worker//%    }
877*6777b538SAndroid Build Coastguard Worker//%  }
878*6777b538SAndroid Build Coastguard Worker//%}
879*6777b538SAndroid Build Coastguard Worker//%
880*6777b538SAndroid Build Coastguard Worker//%- (void)set##ACCESSOR_NAME##VNAME##:(VALUE_TYPE)VNAME_VAR forKey:(KEY_TYPE##KisP$S##KisP)key {
881*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME_VAR, )##DICTIONARY_VALIDATE_KEY_##KHELPER(key, )  [_dictionary setObject:WRAPPED##VHELPER(VNAME_VAR) forKey:WRAPPED##KHELPER(key)];
882*6777b538SAndroid Build Coastguard Worker//%  if (_autocreator) {
883*6777b538SAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
884*6777b538SAndroid Build Coastguard Worker//%  }
885*6777b538SAndroid Build Coastguard Worker//%}
886*6777b538SAndroid Build Coastguard Worker//%
887*6777b538SAndroid Build Coastguard Worker//%- (void)remove##VNAME_REMOVE##ForKey:(KEY_TYPE##KisP$S##KisP)aKey {
888*6777b538SAndroid Build Coastguard Worker//%  [_dictionary removeObjectForKey:WRAPPED##KHELPER(aKey)];
889*6777b538SAndroid Build Coastguard Worker//%}
890*6777b538SAndroid Build Coastguard Worker//%
891*6777b538SAndroid Build Coastguard Worker//%- (void)removeAll {
892*6777b538SAndroid Build Coastguard Worker//%  [_dictionary removeAllObjects];
893*6777b538SAndroid Build Coastguard Worker//%}
894*6777b538SAndroid Build Coastguard Worker
895*6777b538SAndroid Build Coastguard Worker//
896*6777b538SAndroid Build Coastguard Worker// Custom Generation for Bool keys
897*6777b538SAndroid Build Coastguard Worker//
898*6777b538SAndroid Build Coastguard Worker
899*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_POD_IMPL(VALUE_NAME, VALUE_TYPE)
900*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, POD, VALUE_NAME, value)
901*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(VALUE_NAME, VALUE_TYPE)
902*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, OBJECT, Object, object)
903*6777b538SAndroid Build Coastguard Worker
904*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, HELPER, VNAME, VNAME_VAR)
905*6777b538SAndroid Build Coastguard Worker//%#pragma mark - Bool -> VALUE_NAME
906*6777b538SAndroid Build Coastguard Worker//%
907*6777b538SAndroid Build Coastguard Worker//%@implementation GPBBool##VALUE_NAME##Dictionary {
908*6777b538SAndroid Build Coastguard Worker//% @package
909*6777b538SAndroid Build Coastguard Worker//%  VALUE_TYPE _values[2];
910*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_HAS_STORAGE_##HELPER()}
911*6777b538SAndroid Build Coastguard Worker//%
912*6777b538SAndroid Build Coastguard Worker//%- (instancetype)init {
913*6777b538SAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
914*6777b538SAndroid Build Coastguard Worker//%}
915*6777b538SAndroid Build Coastguard Worker//%
916*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_INITS_##HELPER(VALUE_NAME, VALUE_TYPE)
917*6777b538SAndroid Build Coastguard Worker//%
918*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithCapacity:(NSUInteger)numItems {
919*6777b538SAndroid Build Coastguard Worker//%  #pragma unused(numItems)
920*6777b538SAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
921*6777b538SAndroid Build Coastguard Worker//%}
922*6777b538SAndroid Build Coastguard Worker//%
923*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_DEALLOC##HELPER()
924*6777b538SAndroid Build Coastguard Worker//%
925*6777b538SAndroid Build Coastguard Worker//%- (instancetype)copyWithZone:(NSZone *)zone {
926*6777b538SAndroid Build Coastguard Worker//%  return [[GPBBool##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self];
927*6777b538SAndroid Build Coastguard Worker//%}
928*6777b538SAndroid Build Coastguard Worker//%
929*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isEqual:(id)other {
930*6777b538SAndroid Build Coastguard Worker//%  if (self == other) {
931*6777b538SAndroid Build Coastguard Worker//%    return YES;
932*6777b538SAndroid Build Coastguard Worker//%  }
933*6777b538SAndroid Build Coastguard Worker//%  if (![other isKindOfClass:[GPBBool##VALUE_NAME##Dictionary class]]) {
934*6777b538SAndroid Build Coastguard Worker//%    return NO;
935*6777b538SAndroid Build Coastguard Worker//%  }
936*6777b538SAndroid Build Coastguard Worker//%  GPBBool##VALUE_NAME##Dictionary *otherDictionary = other;
937*6777b538SAndroid Build Coastguard Worker//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) != BOOL_DICT_W_HAS##HELPER(0, otherDictionary->)) ||
938*6777b538SAndroid Build Coastguard Worker//%      (BOOL_DICT_W_HAS##HELPER(1, ) != BOOL_DICT_W_HAS##HELPER(1, otherDictionary->))) {
939*6777b538SAndroid Build Coastguard Worker//%    return NO;
940*6777b538SAndroid Build Coastguard Worker//%  }
941*6777b538SAndroid Build Coastguard Worker//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) && (NEQ_##HELPER(_values[0], otherDictionary->_values[0]))) ||
942*6777b538SAndroid Build Coastguard Worker//%      (BOOL_DICT_W_HAS##HELPER(1, ) && (NEQ_##HELPER(_values[1], otherDictionary->_values[1])))) {
943*6777b538SAndroid Build Coastguard Worker//%    return NO;
944*6777b538SAndroid Build Coastguard Worker//%  }
945*6777b538SAndroid Build Coastguard Worker//%  return YES;
946*6777b538SAndroid Build Coastguard Worker//%}
947*6777b538SAndroid Build Coastguard Worker//%
948*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)hash {
949*6777b538SAndroid Build Coastguard Worker//%  return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0);
950*6777b538SAndroid Build Coastguard Worker//%}
951*6777b538SAndroid Build Coastguard Worker//%
952*6777b538SAndroid Build Coastguard Worker//%- (NSString *)description {
953*6777b538SAndroid Build Coastguard Worker//%  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
954*6777b538SAndroid Build Coastguard Worker//%  if (BOOL_DICT_W_HAS##HELPER(0, )) {
955*6777b538SAndroid Build Coastguard Worker//%    [result appendFormat:@"NO: STR_FORMAT_##HELPER(VALUE_NAME)", _values[0]];
956*6777b538SAndroid Build Coastguard Worker//%  }
957*6777b538SAndroid Build Coastguard Worker//%  if (BOOL_DICT_W_HAS##HELPER(1, )) {
958*6777b538SAndroid Build Coastguard Worker//%    [result appendFormat:@"YES: STR_FORMAT_##HELPER(VALUE_NAME)", _values[1]];
959*6777b538SAndroid Build Coastguard Worker//%  }
960*6777b538SAndroid Build Coastguard Worker//%  [result appendString:@" }"];
961*6777b538SAndroid Build Coastguard Worker//%  return result;
962*6777b538SAndroid Build Coastguard Worker//%}
963*6777b538SAndroid Build Coastguard Worker//%
964*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)count {
965*6777b538SAndroid Build Coastguard Worker//%  return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0);
966*6777b538SAndroid Build Coastguard Worker//%}
967*6777b538SAndroid Build Coastguard Worker//%
968*6777b538SAndroid Build Coastguard Worker//%BOOL_VALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE)
969*6777b538SAndroid Build Coastguard Worker//%
970*6777b538SAndroid Build Coastguard Worker//%BOOL_SET_GPBVALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE, VisP)
971*6777b538SAndroid Build Coastguard Worker//%
972*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
973*6777b538SAndroid Build Coastguard Worker//%  if (BOOL_DICT_HAS##HELPER(0, )) {
974*6777b538SAndroid Build Coastguard Worker//%    block(@"false", TEXT_FORMAT_OBJ##VALUE_NAME(_values[0]));
975*6777b538SAndroid Build Coastguard Worker//%  }
976*6777b538SAndroid Build Coastguard Worker//%  if (BOOL_DICT_W_HAS##HELPER(1, )) {
977*6777b538SAndroid Build Coastguard Worker//%    block(@"true", TEXT_FORMAT_OBJ##VALUE_NAME(_values[1]));
978*6777b538SAndroid Build Coastguard Worker//%  }
979*6777b538SAndroid Build Coastguard Worker//%}
980*6777b538SAndroid Build Coastguard Worker//%
981*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateKeysAnd##VNAME##sUsingBlock:
982*6777b538SAndroid Build Coastguard Worker//%    (void (NS_NOESCAPE ^)(BOOL key, VALUE_TYPE VNAME_VAR, BOOL *stop))block {
983*6777b538SAndroid Build Coastguard Worker//%  BOOL stop = NO;
984*6777b538SAndroid Build Coastguard Worker//%  if (BOOL_DICT_HAS##HELPER(0, )) {
985*6777b538SAndroid Build Coastguard Worker//%    block(NO, _values[0], &stop);
986*6777b538SAndroid Build Coastguard Worker//%  }
987*6777b538SAndroid Build Coastguard Worker//%  if (!stop && BOOL_DICT_W_HAS##HELPER(1, )) {
988*6777b538SAndroid Build Coastguard Worker//%    block(YES, _values[1], &stop);
989*6777b538SAndroid Build Coastguard Worker//%  }
990*6777b538SAndroid Build Coastguard Worker//%}
991*6777b538SAndroid Build Coastguard Worker//%
992*6777b538SAndroid Build Coastguard Worker//%BOOL_EXTRA_METHODS_##HELPER(Bool, VALUE_NAME)- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
993*6777b538SAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
994*6777b538SAndroid Build Coastguard Worker//%  NSUInteger count = 0;
995*6777b538SAndroid Build Coastguard Worker//%  size_t result = 0;
996*6777b538SAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
997*6777b538SAndroid Build Coastguard Worker//%    if (BOOL_DICT_HAS##HELPER(i, )) {
998*6777b538SAndroid Build Coastguard Worker//%      ++count;
999*6777b538SAndroid Build Coastguard Worker//%      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1000*6777b538SAndroid Build Coastguard Worker//%      msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
1001*6777b538SAndroid Build Coastguard Worker//%      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1002*6777b538SAndroid Build Coastguard Worker//%    }
1003*6777b538SAndroid Build Coastguard Worker//%  }
1004*6777b538SAndroid Build Coastguard Worker//%  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1005*6777b538SAndroid Build Coastguard Worker//%  result += tagSize * count;
1006*6777b538SAndroid Build Coastguard Worker//%  return result;
1007*6777b538SAndroid Build Coastguard Worker//%}
1008*6777b538SAndroid Build Coastguard Worker//%
1009*6777b538SAndroid Build Coastguard Worker//%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1010*6777b538SAndroid Build Coastguard Worker//%                         asField:(GPBFieldDescriptor *)field {
1011*6777b538SAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
1012*6777b538SAndroid Build Coastguard Worker//%  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1013*6777b538SAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
1014*6777b538SAndroid Build Coastguard Worker//%    if (BOOL_DICT_HAS##HELPER(i, )) {
1015*6777b538SAndroid Build Coastguard Worker//%      // Write the tag.
1016*6777b538SAndroid Build Coastguard Worker//%      [outputStream writeInt32NoTag:tag];
1017*6777b538SAndroid Build Coastguard Worker//%      // Write the size of the message.
1018*6777b538SAndroid Build Coastguard Worker//%      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1019*6777b538SAndroid Build Coastguard Worker//%      msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
1020*6777b538SAndroid Build Coastguard Worker//%      [outputStream writeInt32NoTag:(int32_t)msgSize];
1021*6777b538SAndroid Build Coastguard Worker//%      // Write the fields.
1022*6777b538SAndroid Build Coastguard Worker//%      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1023*6777b538SAndroid Build Coastguard Worker//%      WriteDict##VALUE_NAME##Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
1024*6777b538SAndroid Build Coastguard Worker//%    }
1025*6777b538SAndroid Build Coastguard Worker//%  }
1026*6777b538SAndroid Build Coastguard Worker//%}
1027*6777b538SAndroid Build Coastguard Worker//%
1028*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_MUTATIONS_##HELPER(VALUE_NAME, VALUE_TYPE)
1029*6777b538SAndroid Build Coastguard Worker//%
1030*6777b538SAndroid Build Coastguard Worker//%@end
1031*6777b538SAndroid Build Coastguard Worker//%
1032*6777b538SAndroid Build Coastguard Worker
1033*6777b538SAndroid Build Coastguard Worker
1034*6777b538SAndroid Build Coastguard Worker//
1035*6777b538SAndroid Build Coastguard Worker// Helpers for PODs
1036*6777b538SAndroid Build Coastguard Worker//
1037*6777b538SAndroid Build Coastguard Worker
1038*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER)
1039*6777b538SAndroid Build Coastguard Worker//%- (BOOL)get##VALUE_NAME##:(nullable VALUE_TYPE *)value forKey:(KEY_TYPE)key {
1040*6777b538SAndroid Build Coastguard Worker//%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
1041*6777b538SAndroid Build Coastguard Worker//%  if (wrapped && value) {
1042*6777b538SAndroid Build Coastguard Worker//%    *value = UNWRAP##VALUE_NAME(wrapped);
1043*6777b538SAndroid Build Coastguard Worker//%  }
1044*6777b538SAndroid Build Coastguard Worker//%  return (wrapped != NULL);
1045*6777b538SAndroid Build Coastguard Worker//%}
1046*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE WRAPPEDPOD(VALUE)
1047*6777b538SAndroid Build Coastguard Worker//%@(VALUE)
1048*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPUInt32(VALUE)
1049*6777b538SAndroid Build Coastguard Worker//%[VALUE unsignedIntValue]
1050*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPInt32(VALUE)
1051*6777b538SAndroid Build Coastguard Worker//%[VALUE intValue]
1052*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPUInt64(VALUE)
1053*6777b538SAndroid Build Coastguard Worker//%[VALUE unsignedLongLongValue]
1054*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPInt64(VALUE)
1055*6777b538SAndroid Build Coastguard Worker//%[VALUE longLongValue]
1056*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPBool(VALUE)
1057*6777b538SAndroid Build Coastguard Worker//%[VALUE boolValue]
1058*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPFloat(VALUE)
1059*6777b538SAndroid Build Coastguard Worker//%[VALUE floatValue]
1060*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPDouble(VALUE)
1061*6777b538SAndroid Build Coastguard Worker//%[VALUE doubleValue]
1062*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPEnum(VALUE)
1063*6777b538SAndroid Build Coastguard Worker//%[VALUE intValue]
1064*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJUInt32(VALUE)
1065*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%u", VALUE]
1066*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJInt32(VALUE)
1067*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%d", VALUE]
1068*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJUInt64(VALUE)
1069*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%llu", VALUE]
1070*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJInt64(VALUE)
1071*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%lld", VALUE]
1072*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJBool(VALUE)
1073*6777b538SAndroid Build Coastguard Worker//%(VALUE ? @"true" : @"false")
1074*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJFloat(VALUE)
1075*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%.*g", FLT_DIG, VALUE]
1076*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJDouble(VALUE)
1077*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%.*lg", DBL_DIG, VALUE]
1078*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJEnum(VALUE)
1079*6777b538SAndroid Build Coastguard Worker//%@(VALUE)
1080*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEPOD(TYPE)
1081*6777b538SAndroid Build Coastguard Worker//%NSNumber *
1082*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE NEQ_POD(VAL1, VAL2)
1083*6777b538SAndroid Build Coastguard Worker//%VAL1 != VAL2
1084*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME)
1085*6777b538SAndroid Build Coastguard Worker// Empty
1086*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME)
1087*6777b538SAndroid Build Coastguard Worker// Empty
1088*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD(KEY_NAME, VALUE_NAME)
1089*6777b538SAndroid Build Coastguard Worker//%SERIAL_DATA_FOR_ENTRY_POD_##VALUE_NAME(KEY_NAME)
1090*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt32(KEY_NAME)
1091*6777b538SAndroid Build Coastguard Worker// Empty
1092*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int32(KEY_NAME)
1093*6777b538SAndroid Build Coastguard Worker// Empty
1094*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt64(KEY_NAME)
1095*6777b538SAndroid Build Coastguard Worker// Empty
1096*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int64(KEY_NAME)
1097*6777b538SAndroid Build Coastguard Worker// Empty
1098*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Bool(KEY_NAME)
1099*6777b538SAndroid Build Coastguard Worker// Empty
1100*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Float(KEY_NAME)
1101*6777b538SAndroid Build Coastguard Worker// Empty
1102*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Double(KEY_NAME)
1103*6777b538SAndroid Build Coastguard Worker// Empty
1104*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Enum(KEY_NAME)
1105*6777b538SAndroid Build Coastguard Worker//%- (NSData *)serializedDataForUnknownValue:(int32_t)value
1106*6777b538SAndroid Build Coastguard Worker//%                                   forKey:(GPBGenericValue *)key
1107*6777b538SAndroid Build Coastguard Worker//%                              keyDataType:(GPBDataType)keyDataType {
1108*6777b538SAndroid Build Coastguard Worker//%  size_t msgSize = ComputeDict##KEY_NAME##FieldSize(key->value##KEY_NAME, kMapKeyFieldNumber, keyDataType);
1109*6777b538SAndroid Build Coastguard Worker//%  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
1110*6777b538SAndroid Build Coastguard Worker//%  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
1111*6777b538SAndroid Build Coastguard Worker//%  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
1112*6777b538SAndroid Build Coastguard Worker//%  WriteDict##KEY_NAME##Field(outputStream, key->value##KEY_NAME, kMapKeyFieldNumber, keyDataType);
1113*6777b538SAndroid Build Coastguard Worker//%  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
1114*6777b538SAndroid Build Coastguard Worker//%  [outputStream release];
1115*6777b538SAndroid Build Coastguard Worker//%  return data;
1116*6777b538SAndroid Build Coastguard Worker//%}
1117*6777b538SAndroid Build Coastguard Worker//%
1118*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE GPBVALUE_POD(VALUE_NAME)
1119*6777b538SAndroid Build Coastguard Worker//%value##VALUE_NAME
1120*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_POD(VALUE_NAME, EXTRA_INDENT)
1121*6777b538SAndroid Build Coastguard Worker// Empty
1122*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_POD(KEY_NAME, EXTRA_INDENT)
1123*6777b538SAndroid Build Coastguard Worker// Empty
1124*6777b538SAndroid Build Coastguard Worker
1125*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_POD()
1126*6777b538SAndroid Build Coastguard Worker//%  BOOL _valueSet[2];
1127*6777b538SAndroid Build Coastguard Worker//%
1128*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_INITS_POD(VALUE_NAME, VALUE_TYPE)
1129*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWith##VALUE_NAME##s:(const VALUE_TYPE [])values
1130*6777b538SAndroid Build Coastguard Worker//%                 ##VALUE_NAME$S## forKeys:(const BOOL [])keys
1131*6777b538SAndroid Build Coastguard Worker//%                 ##VALUE_NAME$S##   count:(NSUInteger)count {
1132*6777b538SAndroid Build Coastguard Worker//%  self = [super init];
1133*6777b538SAndroid Build Coastguard Worker//%  if (self) {
1134*6777b538SAndroid Build Coastguard Worker//%    for (NSUInteger i = 0; i < count; ++i) {
1135*6777b538SAndroid Build Coastguard Worker//%      int idx = keys[i] ? 1 : 0;
1136*6777b538SAndroid Build Coastguard Worker//%      _values[idx] = values[i];
1137*6777b538SAndroid Build Coastguard Worker//%      _valueSet[idx] = YES;
1138*6777b538SAndroid Build Coastguard Worker//%    }
1139*6777b538SAndroid Build Coastguard Worker//%  }
1140*6777b538SAndroid Build Coastguard Worker//%  return self;
1141*6777b538SAndroid Build Coastguard Worker//%}
1142*6777b538SAndroid Build Coastguard Worker//%
1143*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)dictionary {
1144*6777b538SAndroid Build Coastguard Worker//%  self = [self initWith##VALUE_NAME##s:NULL forKeys:NULL count:0];
1145*6777b538SAndroid Build Coastguard Worker//%  if (self) {
1146*6777b538SAndroid Build Coastguard Worker//%    if (dictionary) {
1147*6777b538SAndroid Build Coastguard Worker//%      for (int i = 0; i < 2; ++i) {
1148*6777b538SAndroid Build Coastguard Worker//%        if (dictionary->_valueSet[i]) {
1149*6777b538SAndroid Build Coastguard Worker//%          _values[i] = dictionary->_values[i];
1150*6777b538SAndroid Build Coastguard Worker//%          _valueSet[i] = YES;
1151*6777b538SAndroid Build Coastguard Worker//%        }
1152*6777b538SAndroid Build Coastguard Worker//%      }
1153*6777b538SAndroid Build Coastguard Worker//%    }
1154*6777b538SAndroid Build Coastguard Worker//%  }
1155*6777b538SAndroid Build Coastguard Worker//%  return self;
1156*6777b538SAndroid Build Coastguard Worker//%}
1157*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_DEALLOCPOD()
1158*6777b538SAndroid Build Coastguard Worker//%#if !defined(NS_BLOCK_ASSERTIONS)
1159*6777b538SAndroid Build Coastguard Worker//%- (void)dealloc {
1160*6777b538SAndroid Build Coastguard Worker//%  NSAssert(!_autocreator,
1161*6777b538SAndroid Build Coastguard Worker//%           @"%@: Autocreator must be cleared before release, autocreator: %@",
1162*6777b538SAndroid Build Coastguard Worker//%           [self class], _autocreator);
1163*6777b538SAndroid Build Coastguard Worker//%  [super dealloc];
1164*6777b538SAndroid Build Coastguard Worker//%}
1165*6777b538SAndroid Build Coastguard Worker//%#endif  // !defined(NS_BLOCK_ASSERTIONS)
1166*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_W_HASPOD(IDX, REF)
1167*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_HASPOD(IDX, REF)
1168*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HASPOD(IDX, REF)
1169*6777b538SAndroid Build Coastguard Worker//%REF##_valueSet[IDX]
1170*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE)
1171*6777b538SAndroid Build Coastguard Worker//%- (BOOL)get##VALUE_NAME##:(VALUE_TYPE *)value forKey:(BOOL)key {
1172*6777b538SAndroid Build Coastguard Worker//%  int idx = (key ? 1 : 0);
1173*6777b538SAndroid Build Coastguard Worker//%  if (_valueSet[idx]) {
1174*6777b538SAndroid Build Coastguard Worker//%    if (value) {
1175*6777b538SAndroid Build Coastguard Worker//%      *value = _values[idx];
1176*6777b538SAndroid Build Coastguard Worker//%    }
1177*6777b538SAndroid Build Coastguard Worker//%    return YES;
1178*6777b538SAndroid Build Coastguard Worker//%  }
1179*6777b538SAndroid Build Coastguard Worker//%  return NO;
1180*6777b538SAndroid Build Coastguard Worker//%}
1181*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE, VisP)
1182*6777b538SAndroid Build Coastguard Worker//%- (void)setGPBGenericValue:(GPBGenericValue *)value
1183*6777b538SAndroid Build Coastguard Worker//%     forGPBGenericValueKey:(GPBGenericValue *)key {
1184*6777b538SAndroid Build Coastguard Worker//%  int idx = (key->valueBool ? 1 : 0);
1185*6777b538SAndroid Build Coastguard Worker//%  _values[idx] = value->value##VALUE_NAME;
1186*6777b538SAndroid Build Coastguard Worker//%  _valueSet[idx] = YES;
1187*6777b538SAndroid Build Coastguard Worker//%}
1188*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_MUTATIONS_POD(VALUE_NAME, VALUE_TYPE)
1189*6777b538SAndroid Build Coastguard Worker//%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDictionary {
1190*6777b538SAndroid Build Coastguard Worker//%  if (otherDictionary) {
1191*6777b538SAndroid Build Coastguard Worker//%    for (int i = 0; i < 2; ++i) {
1192*6777b538SAndroid Build Coastguard Worker//%      if (otherDictionary->_valueSet[i]) {
1193*6777b538SAndroid Build Coastguard Worker//%        _valueSet[i] = YES;
1194*6777b538SAndroid Build Coastguard Worker//%        _values[i] = otherDictionary->_values[i];
1195*6777b538SAndroid Build Coastguard Worker//%      }
1196*6777b538SAndroid Build Coastguard Worker//%    }
1197*6777b538SAndroid Build Coastguard Worker//%    if (_autocreator) {
1198*6777b538SAndroid Build Coastguard Worker//%      GPBAutocreatedDictionaryModified(_autocreator, self);
1199*6777b538SAndroid Build Coastguard Worker//%    }
1200*6777b538SAndroid Build Coastguard Worker//%  }
1201*6777b538SAndroid Build Coastguard Worker//%}
1202*6777b538SAndroid Build Coastguard Worker//%
1203*6777b538SAndroid Build Coastguard Worker//%- (void)set##VALUE_NAME:(VALUE_TYPE)value forKey:(BOOL)key {
1204*6777b538SAndroid Build Coastguard Worker//%  int idx = (key ? 1 : 0);
1205*6777b538SAndroid Build Coastguard Worker//%  _values[idx] = value;
1206*6777b538SAndroid Build Coastguard Worker//%  _valueSet[idx] = YES;
1207*6777b538SAndroid Build Coastguard Worker//%  if (_autocreator) {
1208*6777b538SAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
1209*6777b538SAndroid Build Coastguard Worker//%  }
1210*6777b538SAndroid Build Coastguard Worker//%}
1211*6777b538SAndroid Build Coastguard Worker//%
1212*6777b538SAndroid Build Coastguard Worker//%- (void)remove##VALUE_NAME##ForKey:(BOOL)aKey {
1213*6777b538SAndroid Build Coastguard Worker//%  _valueSet[aKey ? 1 : 0] = NO;
1214*6777b538SAndroid Build Coastguard Worker//%}
1215*6777b538SAndroid Build Coastguard Worker//%
1216*6777b538SAndroid Build Coastguard Worker//%- (void)removeAll {
1217*6777b538SAndroid Build Coastguard Worker//%  _valueSet[0] = NO;
1218*6777b538SAndroid Build Coastguard Worker//%  _valueSet[1] = NO;
1219*6777b538SAndroid Build Coastguard Worker//%}
1220*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_POD(VALUE_NAME)
1221*6777b538SAndroid Build Coastguard Worker//%STR_FORMAT_##VALUE_NAME()
1222*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_UInt32()
1223*6777b538SAndroid Build Coastguard Worker//%%u
1224*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Int32()
1225*6777b538SAndroid Build Coastguard Worker//%%d
1226*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_UInt64()
1227*6777b538SAndroid Build Coastguard Worker//%%llu
1228*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Int64()
1229*6777b538SAndroid Build Coastguard Worker//%%lld
1230*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Bool()
1231*6777b538SAndroid Build Coastguard Worker//%%d
1232*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Float()
1233*6777b538SAndroid Build Coastguard Worker//%%f
1234*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Double()
1235*6777b538SAndroid Build Coastguard Worker//%%lf
1236*6777b538SAndroid Build Coastguard Worker
1237*6777b538SAndroid Build Coastguard Worker//
1238*6777b538SAndroid Build Coastguard Worker// Helpers for Objects
1239*6777b538SAndroid Build Coastguard Worker//
1240*6777b538SAndroid Build Coastguard Worker
1241*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE VALUE_FOR_KEY_OBJECT(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER)
1242*6777b538SAndroid Build Coastguard Worker//%- (VALUE_TYPE)objectForKey:(KEY_TYPE)key {
1243*6777b538SAndroid Build Coastguard Worker//%  VALUE_TYPE result = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
1244*6777b538SAndroid Build Coastguard Worker//%  return result;
1245*6777b538SAndroid Build Coastguard Worker//%}
1246*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE WRAPPEDOBJECT(VALUE)
1247*6777b538SAndroid Build Coastguard Worker//%VALUE
1248*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPString(VALUE)
1249*6777b538SAndroid Build Coastguard Worker//%VALUE
1250*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPObject(VALUE)
1251*6777b538SAndroid Build Coastguard Worker//%VALUE
1252*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJString(VALUE)
1253*6777b538SAndroid Build Coastguard Worker//%VALUE
1254*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJObject(VALUE)
1255*6777b538SAndroid Build Coastguard Worker//%VALUE
1256*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT(TYPE)
1257*6777b538SAndroid Build Coastguard Worker//%ENUM_TYPEOBJECT_##TYPE()
1258*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT_NSString()
1259*6777b538SAndroid Build Coastguard Worker//%NSString *
1260*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT_id()
1261*6777b538SAndroid Build Coastguard Worker//%id ##
1262*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE NEQ_OBJECT(VAL1, VAL2)
1263*6777b538SAndroid Build Coastguard Worker//%![VAL1 isEqual:VAL2]
1264*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME)
1265*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isInitialized {
1266*6777b538SAndroid Build Coastguard Worker//%  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
1267*6777b538SAndroid Build Coastguard Worker//%    if (!msg.initialized) {
1268*6777b538SAndroid Build Coastguard Worker//%      return NO;
1269*6777b538SAndroid Build Coastguard Worker//%    }
1270*6777b538SAndroid Build Coastguard Worker//%  }
1271*6777b538SAndroid Build Coastguard Worker//%  return YES;
1272*6777b538SAndroid Build Coastguard Worker//%}
1273*6777b538SAndroid Build Coastguard Worker//%
1274*6777b538SAndroid Build Coastguard Worker//%- (instancetype)deepCopyWithZone:(NSZone *)zone {
1275*6777b538SAndroid Build Coastguard Worker//%  GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict =
1276*6777b538SAndroid Build Coastguard Worker//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
1277*6777b538SAndroid Build Coastguard Worker//%  NSEnumerator *keys = [_dictionary keyEnumerator];
1278*6777b538SAndroid Build Coastguard Worker//%  id aKey;
1279*6777b538SAndroid Build Coastguard Worker//%  NSMutableDictionary *internalDict = newDict->_dictionary;
1280*6777b538SAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
1281*6777b538SAndroid Build Coastguard Worker//%    GPBMessage *msg = _dictionary[aKey];
1282*6777b538SAndroid Build Coastguard Worker//%    GPBMessage *copiedMsg = [msg copyWithZone:zone];
1283*6777b538SAndroid Build Coastguard Worker//%    [internalDict setObject:copiedMsg forKey:aKey];
1284*6777b538SAndroid Build Coastguard Worker//%    [copiedMsg release];
1285*6777b538SAndroid Build Coastguard Worker//%  }
1286*6777b538SAndroid Build Coastguard Worker//%  return newDict;
1287*6777b538SAndroid Build Coastguard Worker//%}
1288*6777b538SAndroid Build Coastguard Worker//%
1289*6777b538SAndroid Build Coastguard Worker//%
1290*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME)
1291*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isInitialized {
1292*6777b538SAndroid Build Coastguard Worker//%  if (_values[0] && ![_values[0] isInitialized]) {
1293*6777b538SAndroid Build Coastguard Worker//%    return NO;
1294*6777b538SAndroid Build Coastguard Worker//%  }
1295*6777b538SAndroid Build Coastguard Worker//%  if (_values[1] && ![_values[1] isInitialized]) {
1296*6777b538SAndroid Build Coastguard Worker//%    return NO;
1297*6777b538SAndroid Build Coastguard Worker//%  }
1298*6777b538SAndroid Build Coastguard Worker//%  return YES;
1299*6777b538SAndroid Build Coastguard Worker//%}
1300*6777b538SAndroid Build Coastguard Worker//%
1301*6777b538SAndroid Build Coastguard Worker//%- (instancetype)deepCopyWithZone:(NSZone *)zone {
1302*6777b538SAndroid Build Coastguard Worker//%  GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict =
1303*6777b538SAndroid Build Coastguard Worker//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
1304*6777b538SAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
1305*6777b538SAndroid Build Coastguard Worker//%    if (_values[i] != nil) {
1306*6777b538SAndroid Build Coastguard Worker//%      newDict->_values[i] = [_values[i] copyWithZone:zone];
1307*6777b538SAndroid Build Coastguard Worker//%    }
1308*6777b538SAndroid Build Coastguard Worker//%  }
1309*6777b538SAndroid Build Coastguard Worker//%  return newDict;
1310*6777b538SAndroid Build Coastguard Worker//%}
1311*6777b538SAndroid Build Coastguard Worker//%
1312*6777b538SAndroid Build Coastguard Worker//%
1313*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_OBJECT(KEY_NAME, VALUE_NAME)
1314*6777b538SAndroid Build Coastguard Worker// Empty
1315*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE GPBVALUE_OBJECT(VALUE_NAME)
1316*6777b538SAndroid Build Coastguard Worker//%valueString
1317*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_OBJECT(VALUE_NAME, EXTRA_INDENT)
1318*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  if (!##VALUE_NAME) {
1319*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##    [NSException raise:NSInvalidArgumentException
1320*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##                format:@"Attempting to add nil object to a Dictionary"];
1321*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  }
1322*6777b538SAndroid Build Coastguard Worker//%
1323*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_OBJECT(KEY_NAME, EXTRA_INDENT)
1324*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  if (!##KEY_NAME) {
1325*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##    [NSException raise:NSInvalidArgumentException
1326*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##                format:@"Attempting to add nil key to a Dictionary"];
1327*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  }
1328*6777b538SAndroid Build Coastguard Worker//%
1329*6777b538SAndroid Build Coastguard Worker
1330*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_OBJECT()
1331*6777b538SAndroid Build Coastguard Worker// Empty
1332*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_INITS_OBJECT(VALUE_NAME, VALUE_TYPE)
1333*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithObjects:(const VALUE_TYPE [])objects
1334*6777b538SAndroid Build Coastguard Worker//%                        forKeys:(const BOOL [])keys
1335*6777b538SAndroid Build Coastguard Worker//%                          count:(NSUInteger)count {
1336*6777b538SAndroid Build Coastguard Worker//%  self = [super init];
1337*6777b538SAndroid Build Coastguard Worker//%  if (self) {
1338*6777b538SAndroid Build Coastguard Worker//%    for (NSUInteger i = 0; i < count; ++i) {
1339*6777b538SAndroid Build Coastguard Worker//%      if (!objects[i]) {
1340*6777b538SAndroid Build Coastguard Worker//%        [NSException raise:NSInvalidArgumentException
1341*6777b538SAndroid Build Coastguard Worker//%                    format:@"Attempting to add nil object to a Dictionary"];
1342*6777b538SAndroid Build Coastguard Worker//%      }
1343*6777b538SAndroid Build Coastguard Worker//%      int idx = keys[i] ? 1 : 0;
1344*6777b538SAndroid Build Coastguard Worker//%      [_values[idx] release];
1345*6777b538SAndroid Build Coastguard Worker//%      _values[idx] = (VALUE_TYPE)[objects[i] retain];
1346*6777b538SAndroid Build Coastguard Worker//%    }
1347*6777b538SAndroid Build Coastguard Worker//%  }
1348*6777b538SAndroid Build Coastguard Worker//%  return self;
1349*6777b538SAndroid Build Coastguard Worker//%}
1350*6777b538SAndroid Build Coastguard Worker//%
1351*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)dictionary {
1352*6777b538SAndroid Build Coastguard Worker//%  self = [self initWithObjects:NULL forKeys:NULL count:0];
1353*6777b538SAndroid Build Coastguard Worker//%  if (self) {
1354*6777b538SAndroid Build Coastguard Worker//%    if (dictionary) {
1355*6777b538SAndroid Build Coastguard Worker//%      _values[0] = [dictionary->_values[0] retain];
1356*6777b538SAndroid Build Coastguard Worker//%      _values[1] = [dictionary->_values[1] retain];
1357*6777b538SAndroid Build Coastguard Worker//%    }
1358*6777b538SAndroid Build Coastguard Worker//%  }
1359*6777b538SAndroid Build Coastguard Worker//%  return self;
1360*6777b538SAndroid Build Coastguard Worker//%}
1361*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_DEALLOCOBJECT()
1362*6777b538SAndroid Build Coastguard Worker//%- (void)dealloc {
1363*6777b538SAndroid Build Coastguard Worker//%  NSAssert(!_autocreator,
1364*6777b538SAndroid Build Coastguard Worker//%           @"%@: Autocreator must be cleared before release, autocreator: %@",
1365*6777b538SAndroid Build Coastguard Worker//%           [self class], _autocreator);
1366*6777b538SAndroid Build Coastguard Worker//%  [_values[0] release];
1367*6777b538SAndroid Build Coastguard Worker//%  [_values[1] release];
1368*6777b538SAndroid Build Coastguard Worker//%  [super dealloc];
1369*6777b538SAndroid Build Coastguard Worker//%}
1370*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_W_HASOBJECT(IDX, REF)
1371*6777b538SAndroid Build Coastguard Worker//%(BOOL_DICT_HASOBJECT(IDX, REF))
1372*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HASOBJECT(IDX, REF)
1373*6777b538SAndroid Build Coastguard Worker//%REF##_values[IDX] != nil
1374*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE)
1375*6777b538SAndroid Build Coastguard Worker//%- (VALUE_TYPE)objectForKey:(BOOL)key {
1376*6777b538SAndroid Build Coastguard Worker//%  return _values[key ? 1 : 0];
1377*6777b538SAndroid Build Coastguard Worker//%}
1378*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE, VisP)
1379*6777b538SAndroid Build Coastguard Worker//%- (void)setGPBGenericValue:(GPBGenericValue *)value
1380*6777b538SAndroid Build Coastguard Worker//%     forGPBGenericValueKey:(GPBGenericValue *)key {
1381*6777b538SAndroid Build Coastguard Worker//%  int idx = (key->valueBool ? 1 : 0);
1382*6777b538SAndroid Build Coastguard Worker//%  [_values[idx] release];
1383*6777b538SAndroid Build Coastguard Worker//%  _values[idx] = [value->valueString retain];
1384*6777b538SAndroid Build Coastguard Worker//%}
1385*6777b538SAndroid Build Coastguard Worker
1386*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_MUTATIONS_OBJECT(VALUE_NAME, VALUE_TYPE)
1387*6777b538SAndroid Build Coastguard Worker//%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDictionary {
1388*6777b538SAndroid Build Coastguard Worker//%  if (otherDictionary) {
1389*6777b538SAndroid Build Coastguard Worker//%    for (int i = 0; i < 2; ++i) {
1390*6777b538SAndroid Build Coastguard Worker//%      if (otherDictionary->_values[i] != nil) {
1391*6777b538SAndroid Build Coastguard Worker//%        [_values[i] release];
1392*6777b538SAndroid Build Coastguard Worker//%        _values[i] = [otherDictionary->_values[i] retain];
1393*6777b538SAndroid Build Coastguard Worker//%      }
1394*6777b538SAndroid Build Coastguard Worker//%    }
1395*6777b538SAndroid Build Coastguard Worker//%    if (_autocreator) {
1396*6777b538SAndroid Build Coastguard Worker//%      GPBAutocreatedDictionaryModified(_autocreator, self);
1397*6777b538SAndroid Build Coastguard Worker//%    }
1398*6777b538SAndroid Build Coastguard Worker//%  }
1399*6777b538SAndroid Build Coastguard Worker//%}
1400*6777b538SAndroid Build Coastguard Worker//%
1401*6777b538SAndroid Build Coastguard Worker//%- (void)setObject:(VALUE_TYPE)object forKey:(BOOL)key {
1402*6777b538SAndroid Build Coastguard Worker//%  if (!object) {
1403*6777b538SAndroid Build Coastguard Worker//%    [NSException raise:NSInvalidArgumentException
1404*6777b538SAndroid Build Coastguard Worker//%                format:@"Attempting to add nil object to a Dictionary"];
1405*6777b538SAndroid Build Coastguard Worker//%  }
1406*6777b538SAndroid Build Coastguard Worker//%  int idx = (key ? 1 : 0);
1407*6777b538SAndroid Build Coastguard Worker//%  [_values[idx] release];
1408*6777b538SAndroid Build Coastguard Worker//%  _values[idx] = [object retain];
1409*6777b538SAndroid Build Coastguard Worker//%  if (_autocreator) {
1410*6777b538SAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
1411*6777b538SAndroid Build Coastguard Worker//%  }
1412*6777b538SAndroid Build Coastguard Worker//%}
1413*6777b538SAndroid Build Coastguard Worker//%
1414*6777b538SAndroid Build Coastguard Worker//%- (void)removeObjectForKey:(BOOL)aKey {
1415*6777b538SAndroid Build Coastguard Worker//%  int idx = (aKey ? 1 : 0);
1416*6777b538SAndroid Build Coastguard Worker//%  [_values[idx] release];
1417*6777b538SAndroid Build Coastguard Worker//%  _values[idx] = nil;
1418*6777b538SAndroid Build Coastguard Worker//%}
1419*6777b538SAndroid Build Coastguard Worker//%
1420*6777b538SAndroid Build Coastguard Worker//%- (void)removeAll {
1421*6777b538SAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
1422*6777b538SAndroid Build Coastguard Worker//%    [_values[i] release];
1423*6777b538SAndroid Build Coastguard Worker//%    _values[i] = nil;
1424*6777b538SAndroid Build Coastguard Worker//%  }
1425*6777b538SAndroid Build Coastguard Worker//%}
1426*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_OBJECT(VALUE_NAME)
1427*6777b538SAndroid Build Coastguard Worker//%%@
1428*6777b538SAndroid Build Coastguard Worker
1429*6777b538SAndroid Build Coastguard Worker
1430*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt32, uint32_t)
1431*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
1432*6777b538SAndroid Build Coastguard Worker// clang-format off
1433*6777b538SAndroid Build Coastguard Worker
1434*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> UInt32
1435*6777b538SAndroid Build Coastguard Worker
1436*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32UInt32Dictionary {
1437*6777b538SAndroid Build Coastguard Worker @package
1438*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1439*6777b538SAndroid Build Coastguard Worker}
1440*6777b538SAndroid Build Coastguard Worker
1441*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
1442*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
1443*6777b538SAndroid Build Coastguard Worker}
1444*6777b538SAndroid Build Coastguard Worker
1445*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
1446*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
1447*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
1448*6777b538SAndroid Build Coastguard Worker  self = [super init];
1449*6777b538SAndroid Build Coastguard Worker  if (self) {
1450*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
1451*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
1452*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
1453*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1454*6777b538SAndroid Build Coastguard Worker      }
1455*6777b538SAndroid Build Coastguard Worker    }
1456*6777b538SAndroid Build Coastguard Worker  }
1457*6777b538SAndroid Build Coastguard Worker  return self;
1458*6777b538SAndroid Build Coastguard Worker}
1459*6777b538SAndroid Build Coastguard Worker
1460*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary {
1461*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
1462*6777b538SAndroid Build Coastguard Worker  if (self) {
1463*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
1464*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1465*6777b538SAndroid Build Coastguard Worker    }
1466*6777b538SAndroid Build Coastguard Worker  }
1467*6777b538SAndroid Build Coastguard Worker  return self;
1468*6777b538SAndroid Build Coastguard Worker}
1469*6777b538SAndroid Build Coastguard Worker
1470*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
1471*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
1472*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
1473*6777b538SAndroid Build Coastguard Worker}
1474*6777b538SAndroid Build Coastguard Worker
1475*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
1476*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
1477*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
1478*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
1479*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
1480*6777b538SAndroid Build Coastguard Worker  [super dealloc];
1481*6777b538SAndroid Build Coastguard Worker}
1482*6777b538SAndroid Build Coastguard Worker
1483*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
1484*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
1485*6777b538SAndroid Build Coastguard Worker}
1486*6777b538SAndroid Build Coastguard Worker
1487*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
1488*6777b538SAndroid Build Coastguard Worker  if (self == other) {
1489*6777b538SAndroid Build Coastguard Worker    return YES;
1490*6777b538SAndroid Build Coastguard Worker  }
1491*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32UInt32Dictionary class]]) {
1492*6777b538SAndroid Build Coastguard Worker    return NO;
1493*6777b538SAndroid Build Coastguard Worker  }
1494*6777b538SAndroid Build Coastguard Worker  GPBUInt32UInt32Dictionary *otherDictionary = other;
1495*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
1496*6777b538SAndroid Build Coastguard Worker}
1497*6777b538SAndroid Build Coastguard Worker
1498*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
1499*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
1500*6777b538SAndroid Build Coastguard Worker}
1501*6777b538SAndroid Build Coastguard Worker
1502*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
1503*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
1504*6777b538SAndroid Build Coastguard Worker}
1505*6777b538SAndroid Build Coastguard Worker
1506*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
1507*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
1508*6777b538SAndroid Build Coastguard Worker}
1509*6777b538SAndroid Build Coastguard Worker
1510*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
1511*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, uint32_t value, BOOL *stop))block {
1512*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
1513*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1514*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1515*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1516*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1517*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1518*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue unsignedIntValue], &stop);
1519*6777b538SAndroid Build Coastguard Worker    if (stop) {
1520*6777b538SAndroid Build Coastguard Worker      break;
1521*6777b538SAndroid Build Coastguard Worker    }
1522*6777b538SAndroid Build Coastguard Worker  }
1523*6777b538SAndroid Build Coastguard Worker}
1524*6777b538SAndroid Build Coastguard Worker
1525*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1526*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1527*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
1528*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
1529*6777b538SAndroid Build Coastguard Worker    return 0;
1530*6777b538SAndroid Build Coastguard Worker  }
1531*6777b538SAndroid Build Coastguard Worker
1532*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1533*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1534*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
1535*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1536*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1537*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1538*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1539*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
1540*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
1541*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1542*6777b538SAndroid Build Coastguard Worker  }
1543*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1544*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
1545*6777b538SAndroid Build Coastguard Worker  return result;
1546*6777b538SAndroid Build Coastguard Worker}
1547*6777b538SAndroid Build Coastguard Worker
1548*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1549*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
1550*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1551*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1552*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1553*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1554*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1555*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1556*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1557*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1558*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
1559*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
1560*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
1561*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
1562*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
1563*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
1564*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
1565*6777b538SAndroid Build Coastguard Worker    // Write the fields.
1566*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
1567*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
1568*6777b538SAndroid Build Coastguard Worker  }
1569*6777b538SAndroid Build Coastguard Worker}
1570*6777b538SAndroid Build Coastguard Worker
1571*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
1572*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
1573*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt32)];
1574*6777b538SAndroid Build Coastguard Worker}
1575*6777b538SAndroid Build Coastguard Worker
1576*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
1577*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(uint32_t key, uint32_t value, BOOL *stop) {
1578*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
1579*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%u", value]);
1580*6777b538SAndroid Build Coastguard Worker  }];
1581*6777b538SAndroid Build Coastguard Worker}
1582*6777b538SAndroid Build Coastguard Worker
1583*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint32_t)key {
1584*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1585*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
1586*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
1587*6777b538SAndroid Build Coastguard Worker  }
1588*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
1589*6777b538SAndroid Build Coastguard Worker}
1590*6777b538SAndroid Build Coastguard Worker
1591*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32UInt32Dictionary *)otherDictionary {
1592*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
1593*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1594*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
1595*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
1596*6777b538SAndroid Build Coastguard Worker    }
1597*6777b538SAndroid Build Coastguard Worker  }
1598*6777b538SAndroid Build Coastguard Worker}
1599*6777b538SAndroid Build Coastguard Worker
1600*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(uint32_t)key {
1601*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
1602*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
1603*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
1604*6777b538SAndroid Build Coastguard Worker  }
1605*6777b538SAndroid Build Coastguard Worker}
1606*6777b538SAndroid Build Coastguard Worker
1607*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(uint32_t)aKey {
1608*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
1609*6777b538SAndroid Build Coastguard Worker}
1610*6777b538SAndroid Build Coastguard Worker
1611*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
1612*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
1613*6777b538SAndroid Build Coastguard Worker}
1614*6777b538SAndroid Build Coastguard Worker
1615*6777b538SAndroid Build Coastguard Worker@end
1616*6777b538SAndroid Build Coastguard Worker
1617*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Int32
1618*6777b538SAndroid Build Coastguard Worker
1619*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32Int32Dictionary {
1620*6777b538SAndroid Build Coastguard Worker @package
1621*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1622*6777b538SAndroid Build Coastguard Worker}
1623*6777b538SAndroid Build Coastguard Worker
1624*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
1625*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
1626*6777b538SAndroid Build Coastguard Worker}
1627*6777b538SAndroid Build Coastguard Worker
1628*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
1629*6777b538SAndroid Build Coastguard Worker                       forKeys:(const uint32_t [])keys
1630*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
1631*6777b538SAndroid Build Coastguard Worker  self = [super init];
1632*6777b538SAndroid Build Coastguard Worker  if (self) {
1633*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
1634*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
1635*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
1636*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1637*6777b538SAndroid Build Coastguard Worker      }
1638*6777b538SAndroid Build Coastguard Worker    }
1639*6777b538SAndroid Build Coastguard Worker  }
1640*6777b538SAndroid Build Coastguard Worker  return self;
1641*6777b538SAndroid Build Coastguard Worker}
1642*6777b538SAndroid Build Coastguard Worker
1643*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32Int32Dictionary *)dictionary {
1644*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
1645*6777b538SAndroid Build Coastguard Worker  if (self) {
1646*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
1647*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1648*6777b538SAndroid Build Coastguard Worker    }
1649*6777b538SAndroid Build Coastguard Worker  }
1650*6777b538SAndroid Build Coastguard Worker  return self;
1651*6777b538SAndroid Build Coastguard Worker}
1652*6777b538SAndroid Build Coastguard Worker
1653*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
1654*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
1655*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
1656*6777b538SAndroid Build Coastguard Worker}
1657*6777b538SAndroid Build Coastguard Worker
1658*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
1659*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
1660*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
1661*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
1662*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
1663*6777b538SAndroid Build Coastguard Worker  [super dealloc];
1664*6777b538SAndroid Build Coastguard Worker}
1665*6777b538SAndroid Build Coastguard Worker
1666*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
1667*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self];
1668*6777b538SAndroid Build Coastguard Worker}
1669*6777b538SAndroid Build Coastguard Worker
1670*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
1671*6777b538SAndroid Build Coastguard Worker  if (self == other) {
1672*6777b538SAndroid Build Coastguard Worker    return YES;
1673*6777b538SAndroid Build Coastguard Worker  }
1674*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32Int32Dictionary class]]) {
1675*6777b538SAndroid Build Coastguard Worker    return NO;
1676*6777b538SAndroid Build Coastguard Worker  }
1677*6777b538SAndroid Build Coastguard Worker  GPBUInt32Int32Dictionary *otherDictionary = other;
1678*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
1679*6777b538SAndroid Build Coastguard Worker}
1680*6777b538SAndroid Build Coastguard Worker
1681*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
1682*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
1683*6777b538SAndroid Build Coastguard Worker}
1684*6777b538SAndroid Build Coastguard Worker
1685*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
1686*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
1687*6777b538SAndroid Build Coastguard Worker}
1688*6777b538SAndroid Build Coastguard Worker
1689*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
1690*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
1691*6777b538SAndroid Build Coastguard Worker}
1692*6777b538SAndroid Build Coastguard Worker
1693*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
1694*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block {
1695*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
1696*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1697*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1698*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1699*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1700*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1701*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue intValue], &stop);
1702*6777b538SAndroid Build Coastguard Worker    if (stop) {
1703*6777b538SAndroid Build Coastguard Worker      break;
1704*6777b538SAndroid Build Coastguard Worker    }
1705*6777b538SAndroid Build Coastguard Worker  }
1706*6777b538SAndroid Build Coastguard Worker}
1707*6777b538SAndroid Build Coastguard Worker
1708*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1709*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1710*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
1711*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
1712*6777b538SAndroid Build Coastguard Worker    return 0;
1713*6777b538SAndroid Build Coastguard Worker  }
1714*6777b538SAndroid Build Coastguard Worker
1715*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1716*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1717*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
1718*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1719*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1720*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1721*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1722*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
1723*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
1724*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1725*6777b538SAndroid Build Coastguard Worker  }
1726*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1727*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
1728*6777b538SAndroid Build Coastguard Worker  return result;
1729*6777b538SAndroid Build Coastguard Worker}
1730*6777b538SAndroid Build Coastguard Worker
1731*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1732*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
1733*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1734*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1735*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1736*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1737*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1738*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1739*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1740*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1741*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
1742*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
1743*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
1744*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
1745*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
1746*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
1747*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
1748*6777b538SAndroid Build Coastguard Worker    // Write the fields.
1749*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
1750*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
1751*6777b538SAndroid Build Coastguard Worker  }
1752*6777b538SAndroid Build Coastguard Worker}
1753*6777b538SAndroid Build Coastguard Worker
1754*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
1755*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
1756*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt32)];
1757*6777b538SAndroid Build Coastguard Worker}
1758*6777b538SAndroid Build Coastguard Worker
1759*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
1760*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
1761*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
1762*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%d", value]);
1763*6777b538SAndroid Build Coastguard Worker  }];
1764*6777b538SAndroid Build Coastguard Worker}
1765*6777b538SAndroid Build Coastguard Worker
1766*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint32_t)key {
1767*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1768*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
1769*6777b538SAndroid Build Coastguard Worker    *value = [wrapped intValue];
1770*6777b538SAndroid Build Coastguard Worker  }
1771*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
1772*6777b538SAndroid Build Coastguard Worker}
1773*6777b538SAndroid Build Coastguard Worker
1774*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32Int32Dictionary *)otherDictionary {
1775*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
1776*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1777*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
1778*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
1779*6777b538SAndroid Build Coastguard Worker    }
1780*6777b538SAndroid Build Coastguard Worker  }
1781*6777b538SAndroid Build Coastguard Worker}
1782*6777b538SAndroid Build Coastguard Worker
1783*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(uint32_t)key {
1784*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
1785*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
1786*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
1787*6777b538SAndroid Build Coastguard Worker  }
1788*6777b538SAndroid Build Coastguard Worker}
1789*6777b538SAndroid Build Coastguard Worker
1790*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(uint32_t)aKey {
1791*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
1792*6777b538SAndroid Build Coastguard Worker}
1793*6777b538SAndroid Build Coastguard Worker
1794*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
1795*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
1796*6777b538SAndroid Build Coastguard Worker}
1797*6777b538SAndroid Build Coastguard Worker
1798*6777b538SAndroid Build Coastguard Worker@end
1799*6777b538SAndroid Build Coastguard Worker
1800*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> UInt64
1801*6777b538SAndroid Build Coastguard Worker
1802*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32UInt64Dictionary {
1803*6777b538SAndroid Build Coastguard Worker @package
1804*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1805*6777b538SAndroid Build Coastguard Worker}
1806*6777b538SAndroid Build Coastguard Worker
1807*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
1808*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
1809*6777b538SAndroid Build Coastguard Worker}
1810*6777b538SAndroid Build Coastguard Worker
1811*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
1812*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
1813*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
1814*6777b538SAndroid Build Coastguard Worker  self = [super init];
1815*6777b538SAndroid Build Coastguard Worker  if (self) {
1816*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
1817*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
1818*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
1819*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1820*6777b538SAndroid Build Coastguard Worker      }
1821*6777b538SAndroid Build Coastguard Worker    }
1822*6777b538SAndroid Build Coastguard Worker  }
1823*6777b538SAndroid Build Coastguard Worker  return self;
1824*6777b538SAndroid Build Coastguard Worker}
1825*6777b538SAndroid Build Coastguard Worker
1826*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary {
1827*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
1828*6777b538SAndroid Build Coastguard Worker  if (self) {
1829*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
1830*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1831*6777b538SAndroid Build Coastguard Worker    }
1832*6777b538SAndroid Build Coastguard Worker  }
1833*6777b538SAndroid Build Coastguard Worker  return self;
1834*6777b538SAndroid Build Coastguard Worker}
1835*6777b538SAndroid Build Coastguard Worker
1836*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
1837*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
1838*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
1839*6777b538SAndroid Build Coastguard Worker}
1840*6777b538SAndroid Build Coastguard Worker
1841*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
1842*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
1843*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
1844*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
1845*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
1846*6777b538SAndroid Build Coastguard Worker  [super dealloc];
1847*6777b538SAndroid Build Coastguard Worker}
1848*6777b538SAndroid Build Coastguard Worker
1849*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
1850*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
1851*6777b538SAndroid Build Coastguard Worker}
1852*6777b538SAndroid Build Coastguard Worker
1853*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
1854*6777b538SAndroid Build Coastguard Worker  if (self == other) {
1855*6777b538SAndroid Build Coastguard Worker    return YES;
1856*6777b538SAndroid Build Coastguard Worker  }
1857*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32UInt64Dictionary class]]) {
1858*6777b538SAndroid Build Coastguard Worker    return NO;
1859*6777b538SAndroid Build Coastguard Worker  }
1860*6777b538SAndroid Build Coastguard Worker  GPBUInt32UInt64Dictionary *otherDictionary = other;
1861*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
1862*6777b538SAndroid Build Coastguard Worker}
1863*6777b538SAndroid Build Coastguard Worker
1864*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
1865*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
1866*6777b538SAndroid Build Coastguard Worker}
1867*6777b538SAndroid Build Coastguard Worker
1868*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
1869*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
1870*6777b538SAndroid Build Coastguard Worker}
1871*6777b538SAndroid Build Coastguard Worker
1872*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
1873*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
1874*6777b538SAndroid Build Coastguard Worker}
1875*6777b538SAndroid Build Coastguard Worker
1876*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
1877*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, uint64_t value, BOOL *stop))block {
1878*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
1879*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1880*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1881*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1882*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1883*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1884*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue unsignedLongLongValue], &stop);
1885*6777b538SAndroid Build Coastguard Worker    if (stop) {
1886*6777b538SAndroid Build Coastguard Worker      break;
1887*6777b538SAndroid Build Coastguard Worker    }
1888*6777b538SAndroid Build Coastguard Worker  }
1889*6777b538SAndroid Build Coastguard Worker}
1890*6777b538SAndroid Build Coastguard Worker
1891*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1892*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1893*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
1894*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
1895*6777b538SAndroid Build Coastguard Worker    return 0;
1896*6777b538SAndroid Build Coastguard Worker  }
1897*6777b538SAndroid Build Coastguard Worker
1898*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1899*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1900*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
1901*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1902*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1903*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1904*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1905*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
1906*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
1907*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1908*6777b538SAndroid Build Coastguard Worker  }
1909*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1910*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
1911*6777b538SAndroid Build Coastguard Worker  return result;
1912*6777b538SAndroid Build Coastguard Worker}
1913*6777b538SAndroid Build Coastguard Worker
1914*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1915*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
1916*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1917*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1918*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1919*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1920*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1921*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
1922*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1923*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1924*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
1925*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
1926*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
1927*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
1928*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
1929*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
1930*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
1931*6777b538SAndroid Build Coastguard Worker    // Write the fields.
1932*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
1933*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
1934*6777b538SAndroid Build Coastguard Worker  }
1935*6777b538SAndroid Build Coastguard Worker}
1936*6777b538SAndroid Build Coastguard Worker
1937*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
1938*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
1939*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt32)];
1940*6777b538SAndroid Build Coastguard Worker}
1941*6777b538SAndroid Build Coastguard Worker
1942*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
1943*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(uint32_t key, uint64_t value, BOOL *stop) {
1944*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
1945*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%llu", value]);
1946*6777b538SAndroid Build Coastguard Worker  }];
1947*6777b538SAndroid Build Coastguard Worker}
1948*6777b538SAndroid Build Coastguard Worker
1949*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint32_t)key {
1950*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1951*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
1952*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
1953*6777b538SAndroid Build Coastguard Worker  }
1954*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
1955*6777b538SAndroid Build Coastguard Worker}
1956*6777b538SAndroid Build Coastguard Worker
1957*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32UInt64Dictionary *)otherDictionary {
1958*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
1959*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1960*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
1961*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
1962*6777b538SAndroid Build Coastguard Worker    }
1963*6777b538SAndroid Build Coastguard Worker  }
1964*6777b538SAndroid Build Coastguard Worker}
1965*6777b538SAndroid Build Coastguard Worker
1966*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(uint32_t)key {
1967*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
1968*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
1969*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
1970*6777b538SAndroid Build Coastguard Worker  }
1971*6777b538SAndroid Build Coastguard Worker}
1972*6777b538SAndroid Build Coastguard Worker
1973*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(uint32_t)aKey {
1974*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
1975*6777b538SAndroid Build Coastguard Worker}
1976*6777b538SAndroid Build Coastguard Worker
1977*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
1978*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
1979*6777b538SAndroid Build Coastguard Worker}
1980*6777b538SAndroid Build Coastguard Worker
1981*6777b538SAndroid Build Coastguard Worker@end
1982*6777b538SAndroid Build Coastguard Worker
1983*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Int64
1984*6777b538SAndroid Build Coastguard Worker
1985*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32Int64Dictionary {
1986*6777b538SAndroid Build Coastguard Worker @package
1987*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1988*6777b538SAndroid Build Coastguard Worker}
1989*6777b538SAndroid Build Coastguard Worker
1990*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
1991*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
1992*6777b538SAndroid Build Coastguard Worker}
1993*6777b538SAndroid Build Coastguard Worker
1994*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
1995*6777b538SAndroid Build Coastguard Worker                       forKeys:(const uint32_t [])keys
1996*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
1997*6777b538SAndroid Build Coastguard Worker  self = [super init];
1998*6777b538SAndroid Build Coastguard Worker  if (self) {
1999*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2000*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
2001*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2002*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2003*6777b538SAndroid Build Coastguard Worker      }
2004*6777b538SAndroid Build Coastguard Worker    }
2005*6777b538SAndroid Build Coastguard Worker  }
2006*6777b538SAndroid Build Coastguard Worker  return self;
2007*6777b538SAndroid Build Coastguard Worker}
2008*6777b538SAndroid Build Coastguard Worker
2009*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32Int64Dictionary *)dictionary {
2010*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
2011*6777b538SAndroid Build Coastguard Worker  if (self) {
2012*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
2013*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2014*6777b538SAndroid Build Coastguard Worker    }
2015*6777b538SAndroid Build Coastguard Worker  }
2016*6777b538SAndroid Build Coastguard Worker  return self;
2017*6777b538SAndroid Build Coastguard Worker}
2018*6777b538SAndroid Build Coastguard Worker
2019*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2020*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
2021*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
2022*6777b538SAndroid Build Coastguard Worker}
2023*6777b538SAndroid Build Coastguard Worker
2024*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
2025*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2026*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2027*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
2028*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
2029*6777b538SAndroid Build Coastguard Worker  [super dealloc];
2030*6777b538SAndroid Build Coastguard Worker}
2031*6777b538SAndroid Build Coastguard Worker
2032*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2033*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self];
2034*6777b538SAndroid Build Coastguard Worker}
2035*6777b538SAndroid Build Coastguard Worker
2036*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2037*6777b538SAndroid Build Coastguard Worker  if (self == other) {
2038*6777b538SAndroid Build Coastguard Worker    return YES;
2039*6777b538SAndroid Build Coastguard Worker  }
2040*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32Int64Dictionary class]]) {
2041*6777b538SAndroid Build Coastguard Worker    return NO;
2042*6777b538SAndroid Build Coastguard Worker  }
2043*6777b538SAndroid Build Coastguard Worker  GPBUInt32Int64Dictionary *otherDictionary = other;
2044*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2045*6777b538SAndroid Build Coastguard Worker}
2046*6777b538SAndroid Build Coastguard Worker
2047*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
2048*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2049*6777b538SAndroid Build Coastguard Worker}
2050*6777b538SAndroid Build Coastguard Worker
2051*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
2052*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2053*6777b538SAndroid Build Coastguard Worker}
2054*6777b538SAndroid Build Coastguard Worker
2055*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
2056*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2057*6777b538SAndroid Build Coastguard Worker}
2058*6777b538SAndroid Build Coastguard Worker
2059*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
2060*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int64_t value, BOOL *stop))block {
2061*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
2062*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2063*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2064*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2065*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2066*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2067*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue longLongValue], &stop);
2068*6777b538SAndroid Build Coastguard Worker    if (stop) {
2069*6777b538SAndroid Build Coastguard Worker      break;
2070*6777b538SAndroid Build Coastguard Worker    }
2071*6777b538SAndroid Build Coastguard Worker  }
2072*6777b538SAndroid Build Coastguard Worker}
2073*6777b538SAndroid Build Coastguard Worker
2074*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2075*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2076*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2077*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
2078*6777b538SAndroid Build Coastguard Worker    return 0;
2079*6777b538SAndroid Build Coastguard Worker  }
2080*6777b538SAndroid Build Coastguard Worker
2081*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2082*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2083*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
2084*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2085*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2086*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2087*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2088*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2089*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
2090*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2091*6777b538SAndroid Build Coastguard Worker  }
2092*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2093*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
2094*6777b538SAndroid Build Coastguard Worker  return result;
2095*6777b538SAndroid Build Coastguard Worker}
2096*6777b538SAndroid Build Coastguard Worker
2097*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2098*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2099*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2100*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2101*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2102*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2103*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2104*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2105*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2106*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2107*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2108*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
2109*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2110*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
2111*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2112*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2113*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2114*6777b538SAndroid Build Coastguard Worker    // Write the fields.
2115*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2116*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2117*6777b538SAndroid Build Coastguard Worker  }
2118*6777b538SAndroid Build Coastguard Worker}
2119*6777b538SAndroid Build Coastguard Worker
2120*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2121*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2122*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt32)];
2123*6777b538SAndroid Build Coastguard Worker}
2124*6777b538SAndroid Build Coastguard Worker
2125*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2126*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(uint32_t key, int64_t value, BOOL *stop) {
2127*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
2128*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%lld", value]);
2129*6777b538SAndroid Build Coastguard Worker  }];
2130*6777b538SAndroid Build Coastguard Worker}
2131*6777b538SAndroid Build Coastguard Worker
2132*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint32_t)key {
2133*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2134*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
2135*6777b538SAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
2136*6777b538SAndroid Build Coastguard Worker  }
2137*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
2138*6777b538SAndroid Build Coastguard Worker}
2139*6777b538SAndroid Build Coastguard Worker
2140*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32Int64Dictionary *)otherDictionary {
2141*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
2142*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2143*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
2144*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2145*6777b538SAndroid Build Coastguard Worker    }
2146*6777b538SAndroid Build Coastguard Worker  }
2147*6777b538SAndroid Build Coastguard Worker}
2148*6777b538SAndroid Build Coastguard Worker
2149*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(uint32_t)key {
2150*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2151*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
2152*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2153*6777b538SAndroid Build Coastguard Worker  }
2154*6777b538SAndroid Build Coastguard Worker}
2155*6777b538SAndroid Build Coastguard Worker
2156*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(uint32_t)aKey {
2157*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2158*6777b538SAndroid Build Coastguard Worker}
2159*6777b538SAndroid Build Coastguard Worker
2160*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
2161*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2162*6777b538SAndroid Build Coastguard Worker}
2163*6777b538SAndroid Build Coastguard Worker
2164*6777b538SAndroid Build Coastguard Worker@end
2165*6777b538SAndroid Build Coastguard Worker
2166*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Bool
2167*6777b538SAndroid Build Coastguard Worker
2168*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32BoolDictionary {
2169*6777b538SAndroid Build Coastguard Worker @package
2170*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2171*6777b538SAndroid Build Coastguard Worker}
2172*6777b538SAndroid Build Coastguard Worker
2173*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
2174*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
2175*6777b538SAndroid Build Coastguard Worker}
2176*6777b538SAndroid Build Coastguard Worker
2177*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
2178*6777b538SAndroid Build Coastguard Worker                      forKeys:(const uint32_t [])keys
2179*6777b538SAndroid Build Coastguard Worker                        count:(NSUInteger)count {
2180*6777b538SAndroid Build Coastguard Worker  self = [super init];
2181*6777b538SAndroid Build Coastguard Worker  if (self) {
2182*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2183*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
2184*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2185*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2186*6777b538SAndroid Build Coastguard Worker      }
2187*6777b538SAndroid Build Coastguard Worker    }
2188*6777b538SAndroid Build Coastguard Worker  }
2189*6777b538SAndroid Build Coastguard Worker  return self;
2190*6777b538SAndroid Build Coastguard Worker}
2191*6777b538SAndroid Build Coastguard Worker
2192*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32BoolDictionary *)dictionary {
2193*6777b538SAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
2194*6777b538SAndroid Build Coastguard Worker  if (self) {
2195*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
2196*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2197*6777b538SAndroid Build Coastguard Worker    }
2198*6777b538SAndroid Build Coastguard Worker  }
2199*6777b538SAndroid Build Coastguard Worker  return self;
2200*6777b538SAndroid Build Coastguard Worker}
2201*6777b538SAndroid Build Coastguard Worker
2202*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2203*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
2204*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
2205*6777b538SAndroid Build Coastguard Worker}
2206*6777b538SAndroid Build Coastguard Worker
2207*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
2208*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2209*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2210*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
2211*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
2212*6777b538SAndroid Build Coastguard Worker  [super dealloc];
2213*6777b538SAndroid Build Coastguard Worker}
2214*6777b538SAndroid Build Coastguard Worker
2215*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2216*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
2217*6777b538SAndroid Build Coastguard Worker}
2218*6777b538SAndroid Build Coastguard Worker
2219*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2220*6777b538SAndroid Build Coastguard Worker  if (self == other) {
2221*6777b538SAndroid Build Coastguard Worker    return YES;
2222*6777b538SAndroid Build Coastguard Worker  }
2223*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32BoolDictionary class]]) {
2224*6777b538SAndroid Build Coastguard Worker    return NO;
2225*6777b538SAndroid Build Coastguard Worker  }
2226*6777b538SAndroid Build Coastguard Worker  GPBUInt32BoolDictionary *otherDictionary = other;
2227*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2228*6777b538SAndroid Build Coastguard Worker}
2229*6777b538SAndroid Build Coastguard Worker
2230*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
2231*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2232*6777b538SAndroid Build Coastguard Worker}
2233*6777b538SAndroid Build Coastguard Worker
2234*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
2235*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2236*6777b538SAndroid Build Coastguard Worker}
2237*6777b538SAndroid Build Coastguard Worker
2238*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
2239*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2240*6777b538SAndroid Build Coastguard Worker}
2241*6777b538SAndroid Build Coastguard Worker
2242*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
2243*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, BOOL value, BOOL *stop))block {
2244*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
2245*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2246*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2247*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2248*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2249*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2250*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue boolValue], &stop);
2251*6777b538SAndroid Build Coastguard Worker    if (stop) {
2252*6777b538SAndroid Build Coastguard Worker      break;
2253*6777b538SAndroid Build Coastguard Worker    }
2254*6777b538SAndroid Build Coastguard Worker  }
2255*6777b538SAndroid Build Coastguard Worker}
2256*6777b538SAndroid Build Coastguard Worker
2257*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2258*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2259*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2260*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
2261*6777b538SAndroid Build Coastguard Worker    return 0;
2262*6777b538SAndroid Build Coastguard Worker  }
2263*6777b538SAndroid Build Coastguard Worker
2264*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2265*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2266*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
2267*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2268*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2269*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2270*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2271*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2272*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
2273*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2274*6777b538SAndroid Build Coastguard Worker  }
2275*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2276*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
2277*6777b538SAndroid Build Coastguard Worker  return result;
2278*6777b538SAndroid Build Coastguard Worker}
2279*6777b538SAndroid Build Coastguard Worker
2280*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2281*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2282*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2283*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2284*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2285*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2286*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2287*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2288*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2289*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2290*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2291*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
2292*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2293*6777b538SAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
2294*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2295*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2296*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2297*6777b538SAndroid Build Coastguard Worker    // Write the fields.
2298*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2299*6777b538SAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2300*6777b538SAndroid Build Coastguard Worker  }
2301*6777b538SAndroid Build Coastguard Worker}
2302*6777b538SAndroid Build Coastguard Worker
2303*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2304*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2305*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt32)];
2306*6777b538SAndroid Build Coastguard Worker}
2307*6777b538SAndroid Build Coastguard Worker
2308*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2309*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(uint32_t key, BOOL value, BOOL *stop) {
2310*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
2311*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], (value ? @"true" : @"false"));
2312*6777b538SAndroid Build Coastguard Worker  }];
2313*6777b538SAndroid Build Coastguard Worker}
2314*6777b538SAndroid Build Coastguard Worker
2315*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(uint32_t)key {
2316*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2317*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
2318*6777b538SAndroid Build Coastguard Worker    *value = [wrapped boolValue];
2319*6777b538SAndroid Build Coastguard Worker  }
2320*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
2321*6777b538SAndroid Build Coastguard Worker}
2322*6777b538SAndroid Build Coastguard Worker
2323*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32BoolDictionary *)otherDictionary {
2324*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
2325*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2326*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
2327*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2328*6777b538SAndroid Build Coastguard Worker    }
2329*6777b538SAndroid Build Coastguard Worker  }
2330*6777b538SAndroid Build Coastguard Worker}
2331*6777b538SAndroid Build Coastguard Worker
2332*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(uint32_t)key {
2333*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2334*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
2335*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2336*6777b538SAndroid Build Coastguard Worker  }
2337*6777b538SAndroid Build Coastguard Worker}
2338*6777b538SAndroid Build Coastguard Worker
2339*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(uint32_t)aKey {
2340*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2341*6777b538SAndroid Build Coastguard Worker}
2342*6777b538SAndroid Build Coastguard Worker
2343*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
2344*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2345*6777b538SAndroid Build Coastguard Worker}
2346*6777b538SAndroid Build Coastguard Worker
2347*6777b538SAndroid Build Coastguard Worker@end
2348*6777b538SAndroid Build Coastguard Worker
2349*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Float
2350*6777b538SAndroid Build Coastguard Worker
2351*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32FloatDictionary {
2352*6777b538SAndroid Build Coastguard Worker @package
2353*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2354*6777b538SAndroid Build Coastguard Worker}
2355*6777b538SAndroid Build Coastguard Worker
2356*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
2357*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
2358*6777b538SAndroid Build Coastguard Worker}
2359*6777b538SAndroid Build Coastguard Worker
2360*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
2361*6777b538SAndroid Build Coastguard Worker                       forKeys:(const uint32_t [])keys
2362*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
2363*6777b538SAndroid Build Coastguard Worker  self = [super init];
2364*6777b538SAndroid Build Coastguard Worker  if (self) {
2365*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2366*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
2367*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2368*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2369*6777b538SAndroid Build Coastguard Worker      }
2370*6777b538SAndroid Build Coastguard Worker    }
2371*6777b538SAndroid Build Coastguard Worker  }
2372*6777b538SAndroid Build Coastguard Worker  return self;
2373*6777b538SAndroid Build Coastguard Worker}
2374*6777b538SAndroid Build Coastguard Worker
2375*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32FloatDictionary *)dictionary {
2376*6777b538SAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
2377*6777b538SAndroid Build Coastguard Worker  if (self) {
2378*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
2379*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2380*6777b538SAndroid Build Coastguard Worker    }
2381*6777b538SAndroid Build Coastguard Worker  }
2382*6777b538SAndroid Build Coastguard Worker  return self;
2383*6777b538SAndroid Build Coastguard Worker}
2384*6777b538SAndroid Build Coastguard Worker
2385*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2386*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
2387*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
2388*6777b538SAndroid Build Coastguard Worker}
2389*6777b538SAndroid Build Coastguard Worker
2390*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
2391*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2392*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2393*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
2394*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
2395*6777b538SAndroid Build Coastguard Worker  [super dealloc];
2396*6777b538SAndroid Build Coastguard Worker}
2397*6777b538SAndroid Build Coastguard Worker
2398*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2399*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32FloatDictionary allocWithZone:zone] initWithDictionary:self];
2400*6777b538SAndroid Build Coastguard Worker}
2401*6777b538SAndroid Build Coastguard Worker
2402*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2403*6777b538SAndroid Build Coastguard Worker  if (self == other) {
2404*6777b538SAndroid Build Coastguard Worker    return YES;
2405*6777b538SAndroid Build Coastguard Worker  }
2406*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32FloatDictionary class]]) {
2407*6777b538SAndroid Build Coastguard Worker    return NO;
2408*6777b538SAndroid Build Coastguard Worker  }
2409*6777b538SAndroid Build Coastguard Worker  GPBUInt32FloatDictionary *otherDictionary = other;
2410*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2411*6777b538SAndroid Build Coastguard Worker}
2412*6777b538SAndroid Build Coastguard Worker
2413*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
2414*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2415*6777b538SAndroid Build Coastguard Worker}
2416*6777b538SAndroid Build Coastguard Worker
2417*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
2418*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2419*6777b538SAndroid Build Coastguard Worker}
2420*6777b538SAndroid Build Coastguard Worker
2421*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
2422*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2423*6777b538SAndroid Build Coastguard Worker}
2424*6777b538SAndroid Build Coastguard Worker
2425*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
2426*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, float value, BOOL *stop))block {
2427*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
2428*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2429*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2430*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2431*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2432*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2433*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue floatValue], &stop);
2434*6777b538SAndroid Build Coastguard Worker    if (stop) {
2435*6777b538SAndroid Build Coastguard Worker      break;
2436*6777b538SAndroid Build Coastguard Worker    }
2437*6777b538SAndroid Build Coastguard Worker  }
2438*6777b538SAndroid Build Coastguard Worker}
2439*6777b538SAndroid Build Coastguard Worker
2440*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2441*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2442*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2443*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
2444*6777b538SAndroid Build Coastguard Worker    return 0;
2445*6777b538SAndroid Build Coastguard Worker  }
2446*6777b538SAndroid Build Coastguard Worker
2447*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2448*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2449*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
2450*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2451*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2452*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2453*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2454*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2455*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
2456*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2457*6777b538SAndroid Build Coastguard Worker  }
2458*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2459*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
2460*6777b538SAndroid Build Coastguard Worker  return result;
2461*6777b538SAndroid Build Coastguard Worker}
2462*6777b538SAndroid Build Coastguard Worker
2463*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2464*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2465*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2466*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2467*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2468*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2469*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2470*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2471*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2472*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2473*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2474*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
2475*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2476*6777b538SAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
2477*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2478*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2479*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2480*6777b538SAndroid Build Coastguard Worker    // Write the fields.
2481*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2482*6777b538SAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2483*6777b538SAndroid Build Coastguard Worker  }
2484*6777b538SAndroid Build Coastguard Worker}
2485*6777b538SAndroid Build Coastguard Worker
2486*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2487*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2488*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt32)];
2489*6777b538SAndroid Build Coastguard Worker}
2490*6777b538SAndroid Build Coastguard Worker
2491*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2492*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(uint32_t key, float value, BOOL *stop) {
2493*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
2494*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
2495*6777b538SAndroid Build Coastguard Worker  }];
2496*6777b538SAndroid Build Coastguard Worker}
2497*6777b538SAndroid Build Coastguard Worker
2498*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(uint32_t)key {
2499*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2500*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
2501*6777b538SAndroid Build Coastguard Worker    *value = [wrapped floatValue];
2502*6777b538SAndroid Build Coastguard Worker  }
2503*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
2504*6777b538SAndroid Build Coastguard Worker}
2505*6777b538SAndroid Build Coastguard Worker
2506*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32FloatDictionary *)otherDictionary {
2507*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
2508*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2509*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
2510*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2511*6777b538SAndroid Build Coastguard Worker    }
2512*6777b538SAndroid Build Coastguard Worker  }
2513*6777b538SAndroid Build Coastguard Worker}
2514*6777b538SAndroid Build Coastguard Worker
2515*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(uint32_t)key {
2516*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2517*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
2518*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2519*6777b538SAndroid Build Coastguard Worker  }
2520*6777b538SAndroid Build Coastguard Worker}
2521*6777b538SAndroid Build Coastguard Worker
2522*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(uint32_t)aKey {
2523*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2524*6777b538SAndroid Build Coastguard Worker}
2525*6777b538SAndroid Build Coastguard Worker
2526*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
2527*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2528*6777b538SAndroid Build Coastguard Worker}
2529*6777b538SAndroid Build Coastguard Worker
2530*6777b538SAndroid Build Coastguard Worker@end
2531*6777b538SAndroid Build Coastguard Worker
2532*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Double
2533*6777b538SAndroid Build Coastguard Worker
2534*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32DoubleDictionary {
2535*6777b538SAndroid Build Coastguard Worker @package
2536*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2537*6777b538SAndroid Build Coastguard Worker}
2538*6777b538SAndroid Build Coastguard Worker
2539*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
2540*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
2541*6777b538SAndroid Build Coastguard Worker}
2542*6777b538SAndroid Build Coastguard Worker
2543*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
2544*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
2545*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
2546*6777b538SAndroid Build Coastguard Worker  self = [super init];
2547*6777b538SAndroid Build Coastguard Worker  if (self) {
2548*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2549*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
2550*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2551*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2552*6777b538SAndroid Build Coastguard Worker      }
2553*6777b538SAndroid Build Coastguard Worker    }
2554*6777b538SAndroid Build Coastguard Worker  }
2555*6777b538SAndroid Build Coastguard Worker  return self;
2556*6777b538SAndroid Build Coastguard Worker}
2557*6777b538SAndroid Build Coastguard Worker
2558*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32DoubleDictionary *)dictionary {
2559*6777b538SAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
2560*6777b538SAndroid Build Coastguard Worker  if (self) {
2561*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
2562*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2563*6777b538SAndroid Build Coastguard Worker    }
2564*6777b538SAndroid Build Coastguard Worker  }
2565*6777b538SAndroid Build Coastguard Worker  return self;
2566*6777b538SAndroid Build Coastguard Worker}
2567*6777b538SAndroid Build Coastguard Worker
2568*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2569*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
2570*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
2571*6777b538SAndroid Build Coastguard Worker}
2572*6777b538SAndroid Build Coastguard Worker
2573*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
2574*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2575*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2576*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
2577*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
2578*6777b538SAndroid Build Coastguard Worker  [super dealloc];
2579*6777b538SAndroid Build Coastguard Worker}
2580*6777b538SAndroid Build Coastguard Worker
2581*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2582*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self];
2583*6777b538SAndroid Build Coastguard Worker}
2584*6777b538SAndroid Build Coastguard Worker
2585*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2586*6777b538SAndroid Build Coastguard Worker  if (self == other) {
2587*6777b538SAndroid Build Coastguard Worker    return YES;
2588*6777b538SAndroid Build Coastguard Worker  }
2589*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32DoubleDictionary class]]) {
2590*6777b538SAndroid Build Coastguard Worker    return NO;
2591*6777b538SAndroid Build Coastguard Worker  }
2592*6777b538SAndroid Build Coastguard Worker  GPBUInt32DoubleDictionary *otherDictionary = other;
2593*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2594*6777b538SAndroid Build Coastguard Worker}
2595*6777b538SAndroid Build Coastguard Worker
2596*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
2597*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2598*6777b538SAndroid Build Coastguard Worker}
2599*6777b538SAndroid Build Coastguard Worker
2600*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
2601*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2602*6777b538SAndroid Build Coastguard Worker}
2603*6777b538SAndroid Build Coastguard Worker
2604*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
2605*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2606*6777b538SAndroid Build Coastguard Worker}
2607*6777b538SAndroid Build Coastguard Worker
2608*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
2609*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, double value, BOOL *stop))block {
2610*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
2611*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2612*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2613*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2614*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2615*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2616*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue doubleValue], &stop);
2617*6777b538SAndroid Build Coastguard Worker    if (stop) {
2618*6777b538SAndroid Build Coastguard Worker      break;
2619*6777b538SAndroid Build Coastguard Worker    }
2620*6777b538SAndroid Build Coastguard Worker  }
2621*6777b538SAndroid Build Coastguard Worker}
2622*6777b538SAndroid Build Coastguard Worker
2623*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2624*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2625*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2626*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
2627*6777b538SAndroid Build Coastguard Worker    return 0;
2628*6777b538SAndroid Build Coastguard Worker  }
2629*6777b538SAndroid Build Coastguard Worker
2630*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2631*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2632*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
2633*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2634*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2635*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2636*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2637*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2638*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
2639*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2640*6777b538SAndroid Build Coastguard Worker  }
2641*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2642*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
2643*6777b538SAndroid Build Coastguard Worker  return result;
2644*6777b538SAndroid Build Coastguard Worker}
2645*6777b538SAndroid Build Coastguard Worker
2646*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2647*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2648*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2649*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2650*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2651*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2652*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2653*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2654*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2655*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2656*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2657*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
2658*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2659*6777b538SAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
2660*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2661*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2662*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2663*6777b538SAndroid Build Coastguard Worker    // Write the fields.
2664*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2665*6777b538SAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2666*6777b538SAndroid Build Coastguard Worker  }
2667*6777b538SAndroid Build Coastguard Worker}
2668*6777b538SAndroid Build Coastguard Worker
2669*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2670*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2671*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt32)];
2672*6777b538SAndroid Build Coastguard Worker}
2673*6777b538SAndroid Build Coastguard Worker
2674*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2675*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(uint32_t key, double value, BOOL *stop) {
2676*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
2677*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
2678*6777b538SAndroid Build Coastguard Worker  }];
2679*6777b538SAndroid Build Coastguard Worker}
2680*6777b538SAndroid Build Coastguard Worker
2681*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(uint32_t)key {
2682*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2683*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
2684*6777b538SAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
2685*6777b538SAndroid Build Coastguard Worker  }
2686*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
2687*6777b538SAndroid Build Coastguard Worker}
2688*6777b538SAndroid Build Coastguard Worker
2689*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32DoubleDictionary *)otherDictionary {
2690*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
2691*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2692*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
2693*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2694*6777b538SAndroid Build Coastguard Worker    }
2695*6777b538SAndroid Build Coastguard Worker  }
2696*6777b538SAndroid Build Coastguard Worker}
2697*6777b538SAndroid Build Coastguard Worker
2698*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(uint32_t)key {
2699*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2700*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
2701*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2702*6777b538SAndroid Build Coastguard Worker  }
2703*6777b538SAndroid Build Coastguard Worker}
2704*6777b538SAndroid Build Coastguard Worker
2705*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(uint32_t)aKey {
2706*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2707*6777b538SAndroid Build Coastguard Worker}
2708*6777b538SAndroid Build Coastguard Worker
2709*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
2710*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2711*6777b538SAndroid Build Coastguard Worker}
2712*6777b538SAndroid Build Coastguard Worker
2713*6777b538SAndroid Build Coastguard Worker@end
2714*6777b538SAndroid Build Coastguard Worker
2715*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Enum
2716*6777b538SAndroid Build Coastguard Worker
2717*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32EnumDictionary {
2718*6777b538SAndroid Build Coastguard Worker @package
2719*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2720*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
2721*6777b538SAndroid Build Coastguard Worker}
2722*6777b538SAndroid Build Coastguard Worker
2723*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
2724*6777b538SAndroid Build Coastguard Worker
2725*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
2726*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
2727*6777b538SAndroid Build Coastguard Worker}
2728*6777b538SAndroid Build Coastguard Worker
2729*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
2730*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
2731*6777b538SAndroid Build Coastguard Worker}
2732*6777b538SAndroid Build Coastguard Worker
2733*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
2734*6777b538SAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
2735*6777b538SAndroid Build Coastguard Worker                                   forKeys:(const uint32_t [])keys
2736*6777b538SAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
2737*6777b538SAndroid Build Coastguard Worker  self = [super init];
2738*6777b538SAndroid Build Coastguard Worker  if (self) {
2739*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2740*6777b538SAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
2741*6777b538SAndroid Build Coastguard Worker    if (count && rawValues && keys) {
2742*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2743*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
2744*6777b538SAndroid Build Coastguard Worker      }
2745*6777b538SAndroid Build Coastguard Worker    }
2746*6777b538SAndroid Build Coastguard Worker  }
2747*6777b538SAndroid Build Coastguard Worker  return self;
2748*6777b538SAndroid Build Coastguard Worker}
2749*6777b538SAndroid Build Coastguard Worker
2750*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32EnumDictionary *)dictionary {
2751*6777b538SAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
2752*6777b538SAndroid Build Coastguard Worker                                rawValues:NULL
2753*6777b538SAndroid Build Coastguard Worker                                  forKeys:NULL
2754*6777b538SAndroid Build Coastguard Worker                                    count:0];
2755*6777b538SAndroid Build Coastguard Worker  if (self) {
2756*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
2757*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2758*6777b538SAndroid Build Coastguard Worker    }
2759*6777b538SAndroid Build Coastguard Worker  }
2760*6777b538SAndroid Build Coastguard Worker  return self;
2761*6777b538SAndroid Build Coastguard Worker}
2762*6777b538SAndroid Build Coastguard Worker
2763*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
2764*6777b538SAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
2765*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
2766*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
2767*6777b538SAndroid Build Coastguard Worker}
2768*6777b538SAndroid Build Coastguard Worker
2769*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
2770*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2771*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2772*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
2773*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
2774*6777b538SAndroid Build Coastguard Worker  [super dealloc];
2775*6777b538SAndroid Build Coastguard Worker}
2776*6777b538SAndroid Build Coastguard Worker
2777*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2778*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
2779*6777b538SAndroid Build Coastguard Worker}
2780*6777b538SAndroid Build Coastguard Worker
2781*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2782*6777b538SAndroid Build Coastguard Worker  if (self == other) {
2783*6777b538SAndroid Build Coastguard Worker    return YES;
2784*6777b538SAndroid Build Coastguard Worker  }
2785*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32EnumDictionary class]]) {
2786*6777b538SAndroid Build Coastguard Worker    return NO;
2787*6777b538SAndroid Build Coastguard Worker  }
2788*6777b538SAndroid Build Coastguard Worker  GPBUInt32EnumDictionary *otherDictionary = other;
2789*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2790*6777b538SAndroid Build Coastguard Worker}
2791*6777b538SAndroid Build Coastguard Worker
2792*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
2793*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2794*6777b538SAndroid Build Coastguard Worker}
2795*6777b538SAndroid Build Coastguard Worker
2796*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
2797*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2798*6777b538SAndroid Build Coastguard Worker}
2799*6777b538SAndroid Build Coastguard Worker
2800*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
2801*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
2802*6777b538SAndroid Build Coastguard Worker}
2803*6777b538SAndroid Build Coastguard Worker
2804*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
2805*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block {
2806*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
2807*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2808*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2809*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2810*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2811*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2812*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue intValue], &stop);
2813*6777b538SAndroid Build Coastguard Worker    if (stop) {
2814*6777b538SAndroid Build Coastguard Worker      break;
2815*6777b538SAndroid Build Coastguard Worker    }
2816*6777b538SAndroid Build Coastguard Worker  }
2817*6777b538SAndroid Build Coastguard Worker}
2818*6777b538SAndroid Build Coastguard Worker
2819*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2820*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2821*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2822*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
2823*6777b538SAndroid Build Coastguard Worker    return 0;
2824*6777b538SAndroid Build Coastguard Worker  }
2825*6777b538SAndroid Build Coastguard Worker
2826*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2827*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2828*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
2829*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2830*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2831*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2832*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2833*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2834*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
2835*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2836*6777b538SAndroid Build Coastguard Worker  }
2837*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2838*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
2839*6777b538SAndroid Build Coastguard Worker  return result;
2840*6777b538SAndroid Build Coastguard Worker}
2841*6777b538SAndroid Build Coastguard Worker
2842*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2843*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2844*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2845*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2846*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2847*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2848*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2849*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2850*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2851*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2852*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2853*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
2854*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2855*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
2856*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2857*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2858*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2859*6777b538SAndroid Build Coastguard Worker    // Write the fields.
2860*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2861*6777b538SAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2862*6777b538SAndroid Build Coastguard Worker  }
2863*6777b538SAndroid Build Coastguard Worker}
2864*6777b538SAndroid Build Coastguard Worker
2865*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
2866*6777b538SAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
2867*6777b538SAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
2868*6777b538SAndroid Build Coastguard Worker  size_t msgSize = ComputeDictUInt32FieldSize(key->valueUInt32, kMapKeyFieldNumber, keyDataType);
2869*6777b538SAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
2870*6777b538SAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
2871*6777b538SAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
2872*6777b538SAndroid Build Coastguard Worker  WriteDictUInt32Field(outputStream, key->valueUInt32, kMapKeyFieldNumber, keyDataType);
2873*6777b538SAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
2874*6777b538SAndroid Build Coastguard Worker  [outputStream release];
2875*6777b538SAndroid Build Coastguard Worker  return data;
2876*6777b538SAndroid Build Coastguard Worker}
2877*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2878*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2879*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt32)];
2880*6777b538SAndroid Build Coastguard Worker}
2881*6777b538SAndroid Build Coastguard Worker
2882*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2883*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
2884*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
2885*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], @(value));
2886*6777b538SAndroid Build Coastguard Worker  }];
2887*6777b538SAndroid Build Coastguard Worker}
2888*6777b538SAndroid Build Coastguard Worker
2889*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(uint32_t)key {
2890*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2891*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
2892*6777b538SAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
2893*6777b538SAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
2894*6777b538SAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
2895*6777b538SAndroid Build Coastguard Worker    }
2896*6777b538SAndroid Build Coastguard Worker    *value = result;
2897*6777b538SAndroid Build Coastguard Worker  }
2898*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
2899*6777b538SAndroid Build Coastguard Worker}
2900*6777b538SAndroid Build Coastguard Worker
2901*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint32_t)key {
2902*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2903*6777b538SAndroid Build Coastguard Worker  if (wrapped && rawValue) {
2904*6777b538SAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
2905*6777b538SAndroid Build Coastguard Worker  }
2906*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
2907*6777b538SAndroid Build Coastguard Worker}
2908*6777b538SAndroid Build Coastguard Worker
2909*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
2910*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block {
2911*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
2912*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
2913*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
2914*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
2915*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2916*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
2917*6777b538SAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
2918*6777b538SAndroid Build Coastguard Worker      if (!func(unwrapped)) {
2919*6777b538SAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
2920*6777b538SAndroid Build Coastguard Worker      }
2921*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], unwrapped, &stop);
2922*6777b538SAndroid Build Coastguard Worker    if (stop) {
2923*6777b538SAndroid Build Coastguard Worker      break;
2924*6777b538SAndroid Build Coastguard Worker    }
2925*6777b538SAndroid Build Coastguard Worker  }
2926*6777b538SAndroid Build Coastguard Worker}
2927*6777b538SAndroid Build Coastguard Worker
2928*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBUInt32EnumDictionary *)otherDictionary {
2929*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
2930*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2931*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
2932*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2933*6777b538SAndroid Build Coastguard Worker    }
2934*6777b538SAndroid Build Coastguard Worker  }
2935*6777b538SAndroid Build Coastguard Worker}
2936*6777b538SAndroid Build Coastguard Worker
2937*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(uint32_t)key {
2938*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2939*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
2940*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2941*6777b538SAndroid Build Coastguard Worker  }
2942*6777b538SAndroid Build Coastguard Worker}
2943*6777b538SAndroid Build Coastguard Worker
2944*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(uint32_t)aKey {
2945*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2946*6777b538SAndroid Build Coastguard Worker}
2947*6777b538SAndroid Build Coastguard Worker
2948*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
2949*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2950*6777b538SAndroid Build Coastguard Worker}
2951*6777b538SAndroid Build Coastguard Worker
2952*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(uint32_t)key {
2953*6777b538SAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
2954*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
2955*6777b538SAndroid Build Coastguard Worker                format:@"GPBUInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
2956*6777b538SAndroid Build Coastguard Worker                       value];
2957*6777b538SAndroid Build Coastguard Worker  }
2958*6777b538SAndroid Build Coastguard Worker
2959*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2960*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
2961*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2962*6777b538SAndroid Build Coastguard Worker  }
2963*6777b538SAndroid Build Coastguard Worker}
2964*6777b538SAndroid Build Coastguard Worker
2965*6777b538SAndroid Build Coastguard Worker@end
2966*6777b538SAndroid Build Coastguard Worker
2967*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Object
2968*6777b538SAndroid Build Coastguard Worker
2969*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32ObjectDictionary {
2970*6777b538SAndroid Build Coastguard Worker @package
2971*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2972*6777b538SAndroid Build Coastguard Worker}
2973*6777b538SAndroid Build Coastguard Worker
2974*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
2975*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
2976*6777b538SAndroid Build Coastguard Worker}
2977*6777b538SAndroid Build Coastguard Worker
2978*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
2979*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
2980*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
2981*6777b538SAndroid Build Coastguard Worker  self = [super init];
2982*6777b538SAndroid Build Coastguard Worker  if (self) {
2983*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2984*6777b538SAndroid Build Coastguard Worker    if (count && objects && keys) {
2985*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2986*6777b538SAndroid Build Coastguard Worker        if (!objects[i]) {
2987*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
2988*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
2989*6777b538SAndroid Build Coastguard Worker        }
2990*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
2991*6777b538SAndroid Build Coastguard Worker      }
2992*6777b538SAndroid Build Coastguard Worker    }
2993*6777b538SAndroid Build Coastguard Worker  }
2994*6777b538SAndroid Build Coastguard Worker  return self;
2995*6777b538SAndroid Build Coastguard Worker}
2996*6777b538SAndroid Build Coastguard Worker
2997*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32ObjectDictionary *)dictionary {
2998*6777b538SAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
2999*6777b538SAndroid Build Coastguard Worker  if (self) {
3000*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
3001*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3002*6777b538SAndroid Build Coastguard Worker    }
3003*6777b538SAndroid Build Coastguard Worker  }
3004*6777b538SAndroid Build Coastguard Worker  return self;
3005*6777b538SAndroid Build Coastguard Worker}
3006*6777b538SAndroid Build Coastguard Worker
3007*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3008*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
3009*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
3010*6777b538SAndroid Build Coastguard Worker}
3011*6777b538SAndroid Build Coastguard Worker
3012*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
3013*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3014*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3015*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
3016*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
3017*6777b538SAndroid Build Coastguard Worker  [super dealloc];
3018*6777b538SAndroid Build Coastguard Worker}
3019*6777b538SAndroid Build Coastguard Worker
3020*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3021*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self];
3022*6777b538SAndroid Build Coastguard Worker}
3023*6777b538SAndroid Build Coastguard Worker
3024*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3025*6777b538SAndroid Build Coastguard Worker  if (self == other) {
3026*6777b538SAndroid Build Coastguard Worker    return YES;
3027*6777b538SAndroid Build Coastguard Worker  }
3028*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32ObjectDictionary class]]) {
3029*6777b538SAndroid Build Coastguard Worker    return NO;
3030*6777b538SAndroid Build Coastguard Worker  }
3031*6777b538SAndroid Build Coastguard Worker  GPBUInt32ObjectDictionary *otherDictionary = other;
3032*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3033*6777b538SAndroid Build Coastguard Worker}
3034*6777b538SAndroid Build Coastguard Worker
3035*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
3036*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3037*6777b538SAndroid Build Coastguard Worker}
3038*6777b538SAndroid Build Coastguard Worker
3039*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
3040*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3041*6777b538SAndroid Build Coastguard Worker}
3042*6777b538SAndroid Build Coastguard Worker
3043*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
3044*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3045*6777b538SAndroid Build Coastguard Worker}
3046*6777b538SAndroid Build Coastguard Worker
3047*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
3048*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, id object, BOOL *stop))block {
3049*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
3050*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3051*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3052*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3053*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3054*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
3055*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedIntValue], aObject, &stop);
3056*6777b538SAndroid Build Coastguard Worker    if (stop) {
3057*6777b538SAndroid Build Coastguard Worker      break;
3058*6777b538SAndroid Build Coastguard Worker    }
3059*6777b538SAndroid Build Coastguard Worker  }
3060*6777b538SAndroid Build Coastguard Worker}
3061*6777b538SAndroid Build Coastguard Worker
3062*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized {
3063*6777b538SAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
3064*6777b538SAndroid Build Coastguard Worker    if (!msg.initialized) {
3065*6777b538SAndroid Build Coastguard Worker      return NO;
3066*6777b538SAndroid Build Coastguard Worker    }
3067*6777b538SAndroid Build Coastguard Worker  }
3068*6777b538SAndroid Build Coastguard Worker  return YES;
3069*6777b538SAndroid Build Coastguard Worker}
3070*6777b538SAndroid Build Coastguard Worker
3071*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
3072*6777b538SAndroid Build Coastguard Worker  GPBUInt32ObjectDictionary *newDict =
3073*6777b538SAndroid Build Coastguard Worker      [[GPBUInt32ObjectDictionary alloc] init];
3074*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
3075*6777b538SAndroid Build Coastguard Worker  id aKey;
3076*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
3077*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3078*6777b538SAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
3079*6777b538SAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
3080*6777b538SAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
3081*6777b538SAndroid Build Coastguard Worker    [copiedMsg release];
3082*6777b538SAndroid Build Coastguard Worker  }
3083*6777b538SAndroid Build Coastguard Worker  return newDict;
3084*6777b538SAndroid Build Coastguard Worker}
3085*6777b538SAndroid Build Coastguard Worker
3086*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3087*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3088*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3089*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
3090*6777b538SAndroid Build Coastguard Worker    return 0;
3091*6777b538SAndroid Build Coastguard Worker  }
3092*6777b538SAndroid Build Coastguard Worker
3093*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3094*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3095*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
3096*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3097*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3098*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3099*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
3100*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
3101*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
3102*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3103*6777b538SAndroid Build Coastguard Worker  }
3104*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3105*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
3106*6777b538SAndroid Build Coastguard Worker  return result;
3107*6777b538SAndroid Build Coastguard Worker}
3108*6777b538SAndroid Build Coastguard Worker
3109*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3110*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3111*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3112*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3113*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3114*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3115*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3116*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3117*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3118*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
3119*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3120*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
3121*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
3122*6777b538SAndroid Build Coastguard Worker    id unwrappedValue = aObject;
3123*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3124*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3125*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3126*6777b538SAndroid Build Coastguard Worker    // Write the fields.
3127*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3128*6777b538SAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3129*6777b538SAndroid Build Coastguard Worker  }
3130*6777b538SAndroid Build Coastguard Worker}
3131*6777b538SAndroid Build Coastguard Worker
3132*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3133*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3134*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueUInt32)];
3135*6777b538SAndroid Build Coastguard Worker}
3136*6777b538SAndroid Build Coastguard Worker
3137*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3138*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(uint32_t key, id object, BOOL *stop) {
3139*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
3140*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], object);
3141*6777b538SAndroid Build Coastguard Worker  }];
3142*6777b538SAndroid Build Coastguard Worker}
3143*6777b538SAndroid Build Coastguard Worker
3144*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(uint32_t)key {
3145*6777b538SAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
3146*6777b538SAndroid Build Coastguard Worker  return result;
3147*6777b538SAndroid Build Coastguard Worker}
3148*6777b538SAndroid Build Coastguard Worker
3149*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32ObjectDictionary *)otherDictionary {
3150*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
3151*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3152*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
3153*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3154*6777b538SAndroid Build Coastguard Worker    }
3155*6777b538SAndroid Build Coastguard Worker  }
3156*6777b538SAndroid Build Coastguard Worker}
3157*6777b538SAndroid Build Coastguard Worker
3158*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(uint32_t)key {
3159*6777b538SAndroid Build Coastguard Worker  if (!object) {
3160*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
3161*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
3162*6777b538SAndroid Build Coastguard Worker  }
3163*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
3164*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
3165*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3166*6777b538SAndroid Build Coastguard Worker  }
3167*6777b538SAndroid Build Coastguard Worker}
3168*6777b538SAndroid Build Coastguard Worker
3169*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(uint32_t)aKey {
3170*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3171*6777b538SAndroid Build Coastguard Worker}
3172*6777b538SAndroid Build Coastguard Worker
3173*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
3174*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3175*6777b538SAndroid Build Coastguard Worker}
3176*6777b538SAndroid Build Coastguard Worker
3177*6777b538SAndroid Build Coastguard Worker@end
3178*6777b538SAndroid Build Coastguard Worker
3179*6777b538SAndroid Build Coastguard Worker// clang-format on
3180*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int32, int32_t)
3181*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
3182*6777b538SAndroid Build Coastguard Worker// clang-format off
3183*6777b538SAndroid Build Coastguard Worker
3184*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> UInt32
3185*6777b538SAndroid Build Coastguard Worker
3186*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32UInt32Dictionary {
3187*6777b538SAndroid Build Coastguard Worker @package
3188*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3189*6777b538SAndroid Build Coastguard Worker}
3190*6777b538SAndroid Build Coastguard Worker
3191*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
3192*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
3193*6777b538SAndroid Build Coastguard Worker}
3194*6777b538SAndroid Build Coastguard Worker
3195*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
3196*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
3197*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
3198*6777b538SAndroid Build Coastguard Worker  self = [super init];
3199*6777b538SAndroid Build Coastguard Worker  if (self) {
3200*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3201*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
3202*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3203*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3204*6777b538SAndroid Build Coastguard Worker      }
3205*6777b538SAndroid Build Coastguard Worker    }
3206*6777b538SAndroid Build Coastguard Worker  }
3207*6777b538SAndroid Build Coastguard Worker  return self;
3208*6777b538SAndroid Build Coastguard Worker}
3209*6777b538SAndroid Build Coastguard Worker
3210*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32UInt32Dictionary *)dictionary {
3211*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
3212*6777b538SAndroid Build Coastguard Worker  if (self) {
3213*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
3214*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3215*6777b538SAndroid Build Coastguard Worker    }
3216*6777b538SAndroid Build Coastguard Worker  }
3217*6777b538SAndroid Build Coastguard Worker  return self;
3218*6777b538SAndroid Build Coastguard Worker}
3219*6777b538SAndroid Build Coastguard Worker
3220*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3221*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
3222*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
3223*6777b538SAndroid Build Coastguard Worker}
3224*6777b538SAndroid Build Coastguard Worker
3225*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
3226*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3227*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3228*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
3229*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
3230*6777b538SAndroid Build Coastguard Worker  [super dealloc];
3231*6777b538SAndroid Build Coastguard Worker}
3232*6777b538SAndroid Build Coastguard Worker
3233*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3234*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
3235*6777b538SAndroid Build Coastguard Worker}
3236*6777b538SAndroid Build Coastguard Worker
3237*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3238*6777b538SAndroid Build Coastguard Worker  if (self == other) {
3239*6777b538SAndroid Build Coastguard Worker    return YES;
3240*6777b538SAndroid Build Coastguard Worker  }
3241*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32UInt32Dictionary class]]) {
3242*6777b538SAndroid Build Coastguard Worker    return NO;
3243*6777b538SAndroid Build Coastguard Worker  }
3244*6777b538SAndroid Build Coastguard Worker  GPBInt32UInt32Dictionary *otherDictionary = other;
3245*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3246*6777b538SAndroid Build Coastguard Worker}
3247*6777b538SAndroid Build Coastguard Worker
3248*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
3249*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3250*6777b538SAndroid Build Coastguard Worker}
3251*6777b538SAndroid Build Coastguard Worker
3252*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
3253*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3254*6777b538SAndroid Build Coastguard Worker}
3255*6777b538SAndroid Build Coastguard Worker
3256*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
3257*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3258*6777b538SAndroid Build Coastguard Worker}
3259*6777b538SAndroid Build Coastguard Worker
3260*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
3261*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, uint32_t value, BOOL *stop))block {
3262*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
3263*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3264*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3265*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3266*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3267*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3268*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue unsignedIntValue], &stop);
3269*6777b538SAndroid Build Coastguard Worker    if (stop) {
3270*6777b538SAndroid Build Coastguard Worker      break;
3271*6777b538SAndroid Build Coastguard Worker    }
3272*6777b538SAndroid Build Coastguard Worker  }
3273*6777b538SAndroid Build Coastguard Worker}
3274*6777b538SAndroid Build Coastguard Worker
3275*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3276*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3277*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3278*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
3279*6777b538SAndroid Build Coastguard Worker    return 0;
3280*6777b538SAndroid Build Coastguard Worker  }
3281*6777b538SAndroid Build Coastguard Worker
3282*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3283*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3284*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
3285*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3286*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3287*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3288*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3289*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3290*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
3291*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3292*6777b538SAndroid Build Coastguard Worker  }
3293*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3294*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
3295*6777b538SAndroid Build Coastguard Worker  return result;
3296*6777b538SAndroid Build Coastguard Worker}
3297*6777b538SAndroid Build Coastguard Worker
3298*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3299*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3300*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3301*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3302*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3303*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3304*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3305*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3306*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3307*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3308*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3309*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
3310*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3311*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
3312*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3313*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3314*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3315*6777b538SAndroid Build Coastguard Worker    // Write the fields.
3316*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3317*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3318*6777b538SAndroid Build Coastguard Worker  }
3319*6777b538SAndroid Build Coastguard Worker}
3320*6777b538SAndroid Build Coastguard Worker
3321*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3322*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3323*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt32)];
3324*6777b538SAndroid Build Coastguard Worker}
3325*6777b538SAndroid Build Coastguard Worker
3326*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3327*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(int32_t key, uint32_t value, BOOL *stop) {
3328*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
3329*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%u", value]);
3330*6777b538SAndroid Build Coastguard Worker  }];
3331*6777b538SAndroid Build Coastguard Worker}
3332*6777b538SAndroid Build Coastguard Worker
3333*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int32_t)key {
3334*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3335*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
3336*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
3337*6777b538SAndroid Build Coastguard Worker  }
3338*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
3339*6777b538SAndroid Build Coastguard Worker}
3340*6777b538SAndroid Build Coastguard Worker
3341*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32UInt32Dictionary *)otherDictionary {
3342*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
3343*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3344*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
3345*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3346*6777b538SAndroid Build Coastguard Worker    }
3347*6777b538SAndroid Build Coastguard Worker  }
3348*6777b538SAndroid Build Coastguard Worker}
3349*6777b538SAndroid Build Coastguard Worker
3350*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(int32_t)key {
3351*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3352*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
3353*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3354*6777b538SAndroid Build Coastguard Worker  }
3355*6777b538SAndroid Build Coastguard Worker}
3356*6777b538SAndroid Build Coastguard Worker
3357*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(int32_t)aKey {
3358*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3359*6777b538SAndroid Build Coastguard Worker}
3360*6777b538SAndroid Build Coastguard Worker
3361*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
3362*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3363*6777b538SAndroid Build Coastguard Worker}
3364*6777b538SAndroid Build Coastguard Worker
3365*6777b538SAndroid Build Coastguard Worker@end
3366*6777b538SAndroid Build Coastguard Worker
3367*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Int32
3368*6777b538SAndroid Build Coastguard Worker
3369*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32Int32Dictionary {
3370*6777b538SAndroid Build Coastguard Worker @package
3371*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3372*6777b538SAndroid Build Coastguard Worker}
3373*6777b538SAndroid Build Coastguard Worker
3374*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
3375*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
3376*6777b538SAndroid Build Coastguard Worker}
3377*6777b538SAndroid Build Coastguard Worker
3378*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
3379*6777b538SAndroid Build Coastguard Worker                       forKeys:(const int32_t [])keys
3380*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
3381*6777b538SAndroid Build Coastguard Worker  self = [super init];
3382*6777b538SAndroid Build Coastguard Worker  if (self) {
3383*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3384*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
3385*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3386*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3387*6777b538SAndroid Build Coastguard Worker      }
3388*6777b538SAndroid Build Coastguard Worker    }
3389*6777b538SAndroid Build Coastguard Worker  }
3390*6777b538SAndroid Build Coastguard Worker  return self;
3391*6777b538SAndroid Build Coastguard Worker}
3392*6777b538SAndroid Build Coastguard Worker
3393*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32Int32Dictionary *)dictionary {
3394*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
3395*6777b538SAndroid Build Coastguard Worker  if (self) {
3396*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
3397*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3398*6777b538SAndroid Build Coastguard Worker    }
3399*6777b538SAndroid Build Coastguard Worker  }
3400*6777b538SAndroid Build Coastguard Worker  return self;
3401*6777b538SAndroid Build Coastguard Worker}
3402*6777b538SAndroid Build Coastguard Worker
3403*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3404*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
3405*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
3406*6777b538SAndroid Build Coastguard Worker}
3407*6777b538SAndroid Build Coastguard Worker
3408*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
3409*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3410*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3411*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
3412*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
3413*6777b538SAndroid Build Coastguard Worker  [super dealloc];
3414*6777b538SAndroid Build Coastguard Worker}
3415*6777b538SAndroid Build Coastguard Worker
3416*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3417*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self];
3418*6777b538SAndroid Build Coastguard Worker}
3419*6777b538SAndroid Build Coastguard Worker
3420*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3421*6777b538SAndroid Build Coastguard Worker  if (self == other) {
3422*6777b538SAndroid Build Coastguard Worker    return YES;
3423*6777b538SAndroid Build Coastguard Worker  }
3424*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32Int32Dictionary class]]) {
3425*6777b538SAndroid Build Coastguard Worker    return NO;
3426*6777b538SAndroid Build Coastguard Worker  }
3427*6777b538SAndroid Build Coastguard Worker  GPBInt32Int32Dictionary *otherDictionary = other;
3428*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3429*6777b538SAndroid Build Coastguard Worker}
3430*6777b538SAndroid Build Coastguard Worker
3431*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
3432*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3433*6777b538SAndroid Build Coastguard Worker}
3434*6777b538SAndroid Build Coastguard Worker
3435*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
3436*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3437*6777b538SAndroid Build Coastguard Worker}
3438*6777b538SAndroid Build Coastguard Worker
3439*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
3440*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3441*6777b538SAndroid Build Coastguard Worker}
3442*6777b538SAndroid Build Coastguard Worker
3443*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
3444*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block {
3445*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
3446*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3447*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3448*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3449*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3450*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3451*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue intValue], &stop);
3452*6777b538SAndroid Build Coastguard Worker    if (stop) {
3453*6777b538SAndroid Build Coastguard Worker      break;
3454*6777b538SAndroid Build Coastguard Worker    }
3455*6777b538SAndroid Build Coastguard Worker  }
3456*6777b538SAndroid Build Coastguard Worker}
3457*6777b538SAndroid Build Coastguard Worker
3458*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3459*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3460*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3461*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
3462*6777b538SAndroid Build Coastguard Worker    return 0;
3463*6777b538SAndroid Build Coastguard Worker  }
3464*6777b538SAndroid Build Coastguard Worker
3465*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3466*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3467*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
3468*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3469*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3470*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3471*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3472*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3473*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
3474*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3475*6777b538SAndroid Build Coastguard Worker  }
3476*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3477*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
3478*6777b538SAndroid Build Coastguard Worker  return result;
3479*6777b538SAndroid Build Coastguard Worker}
3480*6777b538SAndroid Build Coastguard Worker
3481*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3482*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3483*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3484*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3485*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3486*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3487*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3488*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3489*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3490*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3491*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3492*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
3493*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3494*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
3495*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3496*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3497*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3498*6777b538SAndroid Build Coastguard Worker    // Write the fields.
3499*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3500*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3501*6777b538SAndroid Build Coastguard Worker  }
3502*6777b538SAndroid Build Coastguard Worker}
3503*6777b538SAndroid Build Coastguard Worker
3504*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3505*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3506*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt32)];
3507*6777b538SAndroid Build Coastguard Worker}
3508*6777b538SAndroid Build Coastguard Worker
3509*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3510*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
3511*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
3512*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%d", value]);
3513*6777b538SAndroid Build Coastguard Worker  }];
3514*6777b538SAndroid Build Coastguard Worker}
3515*6777b538SAndroid Build Coastguard Worker
3516*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(int32_t)key {
3517*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3518*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
3519*6777b538SAndroid Build Coastguard Worker    *value = [wrapped intValue];
3520*6777b538SAndroid Build Coastguard Worker  }
3521*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
3522*6777b538SAndroid Build Coastguard Worker}
3523*6777b538SAndroid Build Coastguard Worker
3524*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32Int32Dictionary *)otherDictionary {
3525*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
3526*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3527*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
3528*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3529*6777b538SAndroid Build Coastguard Worker    }
3530*6777b538SAndroid Build Coastguard Worker  }
3531*6777b538SAndroid Build Coastguard Worker}
3532*6777b538SAndroid Build Coastguard Worker
3533*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(int32_t)key {
3534*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3535*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
3536*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3537*6777b538SAndroid Build Coastguard Worker  }
3538*6777b538SAndroid Build Coastguard Worker}
3539*6777b538SAndroid Build Coastguard Worker
3540*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(int32_t)aKey {
3541*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3542*6777b538SAndroid Build Coastguard Worker}
3543*6777b538SAndroid Build Coastguard Worker
3544*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
3545*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3546*6777b538SAndroid Build Coastguard Worker}
3547*6777b538SAndroid Build Coastguard Worker
3548*6777b538SAndroid Build Coastguard Worker@end
3549*6777b538SAndroid Build Coastguard Worker
3550*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> UInt64
3551*6777b538SAndroid Build Coastguard Worker
3552*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32UInt64Dictionary {
3553*6777b538SAndroid Build Coastguard Worker @package
3554*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3555*6777b538SAndroid Build Coastguard Worker}
3556*6777b538SAndroid Build Coastguard Worker
3557*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
3558*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
3559*6777b538SAndroid Build Coastguard Worker}
3560*6777b538SAndroid Build Coastguard Worker
3561*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
3562*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
3563*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
3564*6777b538SAndroid Build Coastguard Worker  self = [super init];
3565*6777b538SAndroid Build Coastguard Worker  if (self) {
3566*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3567*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
3568*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3569*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3570*6777b538SAndroid Build Coastguard Worker      }
3571*6777b538SAndroid Build Coastguard Worker    }
3572*6777b538SAndroid Build Coastguard Worker  }
3573*6777b538SAndroid Build Coastguard Worker  return self;
3574*6777b538SAndroid Build Coastguard Worker}
3575*6777b538SAndroid Build Coastguard Worker
3576*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32UInt64Dictionary *)dictionary {
3577*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
3578*6777b538SAndroid Build Coastguard Worker  if (self) {
3579*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
3580*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3581*6777b538SAndroid Build Coastguard Worker    }
3582*6777b538SAndroid Build Coastguard Worker  }
3583*6777b538SAndroid Build Coastguard Worker  return self;
3584*6777b538SAndroid Build Coastguard Worker}
3585*6777b538SAndroid Build Coastguard Worker
3586*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3587*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
3588*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
3589*6777b538SAndroid Build Coastguard Worker}
3590*6777b538SAndroid Build Coastguard Worker
3591*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
3592*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3593*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3594*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
3595*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
3596*6777b538SAndroid Build Coastguard Worker  [super dealloc];
3597*6777b538SAndroid Build Coastguard Worker}
3598*6777b538SAndroid Build Coastguard Worker
3599*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3600*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
3601*6777b538SAndroid Build Coastguard Worker}
3602*6777b538SAndroid Build Coastguard Worker
3603*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3604*6777b538SAndroid Build Coastguard Worker  if (self == other) {
3605*6777b538SAndroid Build Coastguard Worker    return YES;
3606*6777b538SAndroid Build Coastguard Worker  }
3607*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32UInt64Dictionary class]]) {
3608*6777b538SAndroid Build Coastguard Worker    return NO;
3609*6777b538SAndroid Build Coastguard Worker  }
3610*6777b538SAndroid Build Coastguard Worker  GPBInt32UInt64Dictionary *otherDictionary = other;
3611*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3612*6777b538SAndroid Build Coastguard Worker}
3613*6777b538SAndroid Build Coastguard Worker
3614*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
3615*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3616*6777b538SAndroid Build Coastguard Worker}
3617*6777b538SAndroid Build Coastguard Worker
3618*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
3619*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3620*6777b538SAndroid Build Coastguard Worker}
3621*6777b538SAndroid Build Coastguard Worker
3622*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
3623*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3624*6777b538SAndroid Build Coastguard Worker}
3625*6777b538SAndroid Build Coastguard Worker
3626*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
3627*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, uint64_t value, BOOL *stop))block {
3628*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
3629*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3630*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3631*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3632*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3633*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3634*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue unsignedLongLongValue], &stop);
3635*6777b538SAndroid Build Coastguard Worker    if (stop) {
3636*6777b538SAndroid Build Coastguard Worker      break;
3637*6777b538SAndroid Build Coastguard Worker    }
3638*6777b538SAndroid Build Coastguard Worker  }
3639*6777b538SAndroid Build Coastguard Worker}
3640*6777b538SAndroid Build Coastguard Worker
3641*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3642*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3643*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3644*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
3645*6777b538SAndroid Build Coastguard Worker    return 0;
3646*6777b538SAndroid Build Coastguard Worker  }
3647*6777b538SAndroid Build Coastguard Worker
3648*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3649*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3650*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
3651*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3652*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3653*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3654*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3655*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3656*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
3657*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3658*6777b538SAndroid Build Coastguard Worker  }
3659*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3660*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
3661*6777b538SAndroid Build Coastguard Worker  return result;
3662*6777b538SAndroid Build Coastguard Worker}
3663*6777b538SAndroid Build Coastguard Worker
3664*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3665*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3666*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3667*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3668*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3669*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3670*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3671*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3672*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3673*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3674*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3675*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
3676*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3677*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
3678*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3679*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3680*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3681*6777b538SAndroid Build Coastguard Worker    // Write the fields.
3682*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3683*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3684*6777b538SAndroid Build Coastguard Worker  }
3685*6777b538SAndroid Build Coastguard Worker}
3686*6777b538SAndroid Build Coastguard Worker
3687*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3688*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3689*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt32)];
3690*6777b538SAndroid Build Coastguard Worker}
3691*6777b538SAndroid Build Coastguard Worker
3692*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3693*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(int32_t key, uint64_t value, BOOL *stop) {
3694*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
3695*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%llu", value]);
3696*6777b538SAndroid Build Coastguard Worker  }];
3697*6777b538SAndroid Build Coastguard Worker}
3698*6777b538SAndroid Build Coastguard Worker
3699*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int32_t)key {
3700*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3701*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
3702*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
3703*6777b538SAndroid Build Coastguard Worker  }
3704*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
3705*6777b538SAndroid Build Coastguard Worker}
3706*6777b538SAndroid Build Coastguard Worker
3707*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32UInt64Dictionary *)otherDictionary {
3708*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
3709*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3710*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
3711*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3712*6777b538SAndroid Build Coastguard Worker    }
3713*6777b538SAndroid Build Coastguard Worker  }
3714*6777b538SAndroid Build Coastguard Worker}
3715*6777b538SAndroid Build Coastguard Worker
3716*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(int32_t)key {
3717*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3718*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
3719*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3720*6777b538SAndroid Build Coastguard Worker  }
3721*6777b538SAndroid Build Coastguard Worker}
3722*6777b538SAndroid Build Coastguard Worker
3723*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(int32_t)aKey {
3724*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3725*6777b538SAndroid Build Coastguard Worker}
3726*6777b538SAndroid Build Coastguard Worker
3727*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
3728*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3729*6777b538SAndroid Build Coastguard Worker}
3730*6777b538SAndroid Build Coastguard Worker
3731*6777b538SAndroid Build Coastguard Worker@end
3732*6777b538SAndroid Build Coastguard Worker
3733*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Int64
3734*6777b538SAndroid Build Coastguard Worker
3735*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32Int64Dictionary {
3736*6777b538SAndroid Build Coastguard Worker @package
3737*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3738*6777b538SAndroid Build Coastguard Worker}
3739*6777b538SAndroid Build Coastguard Worker
3740*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
3741*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
3742*6777b538SAndroid Build Coastguard Worker}
3743*6777b538SAndroid Build Coastguard Worker
3744*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
3745*6777b538SAndroid Build Coastguard Worker                       forKeys:(const int32_t [])keys
3746*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
3747*6777b538SAndroid Build Coastguard Worker  self = [super init];
3748*6777b538SAndroid Build Coastguard Worker  if (self) {
3749*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3750*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
3751*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3752*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3753*6777b538SAndroid Build Coastguard Worker      }
3754*6777b538SAndroid Build Coastguard Worker    }
3755*6777b538SAndroid Build Coastguard Worker  }
3756*6777b538SAndroid Build Coastguard Worker  return self;
3757*6777b538SAndroid Build Coastguard Worker}
3758*6777b538SAndroid Build Coastguard Worker
3759*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32Int64Dictionary *)dictionary {
3760*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
3761*6777b538SAndroid Build Coastguard Worker  if (self) {
3762*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
3763*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3764*6777b538SAndroid Build Coastguard Worker    }
3765*6777b538SAndroid Build Coastguard Worker  }
3766*6777b538SAndroid Build Coastguard Worker  return self;
3767*6777b538SAndroid Build Coastguard Worker}
3768*6777b538SAndroid Build Coastguard Worker
3769*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3770*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
3771*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
3772*6777b538SAndroid Build Coastguard Worker}
3773*6777b538SAndroid Build Coastguard Worker
3774*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
3775*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3776*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3777*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
3778*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
3779*6777b538SAndroid Build Coastguard Worker  [super dealloc];
3780*6777b538SAndroid Build Coastguard Worker}
3781*6777b538SAndroid Build Coastguard Worker
3782*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3783*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self];
3784*6777b538SAndroid Build Coastguard Worker}
3785*6777b538SAndroid Build Coastguard Worker
3786*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3787*6777b538SAndroid Build Coastguard Worker  if (self == other) {
3788*6777b538SAndroid Build Coastguard Worker    return YES;
3789*6777b538SAndroid Build Coastguard Worker  }
3790*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32Int64Dictionary class]]) {
3791*6777b538SAndroid Build Coastguard Worker    return NO;
3792*6777b538SAndroid Build Coastguard Worker  }
3793*6777b538SAndroid Build Coastguard Worker  GPBInt32Int64Dictionary *otherDictionary = other;
3794*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3795*6777b538SAndroid Build Coastguard Worker}
3796*6777b538SAndroid Build Coastguard Worker
3797*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
3798*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3799*6777b538SAndroid Build Coastguard Worker}
3800*6777b538SAndroid Build Coastguard Worker
3801*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
3802*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3803*6777b538SAndroid Build Coastguard Worker}
3804*6777b538SAndroid Build Coastguard Worker
3805*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
3806*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3807*6777b538SAndroid Build Coastguard Worker}
3808*6777b538SAndroid Build Coastguard Worker
3809*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
3810*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int64_t value, BOOL *stop))block {
3811*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
3812*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3813*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3814*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3815*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3816*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3817*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue longLongValue], &stop);
3818*6777b538SAndroid Build Coastguard Worker    if (stop) {
3819*6777b538SAndroid Build Coastguard Worker      break;
3820*6777b538SAndroid Build Coastguard Worker    }
3821*6777b538SAndroid Build Coastguard Worker  }
3822*6777b538SAndroid Build Coastguard Worker}
3823*6777b538SAndroid Build Coastguard Worker
3824*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3825*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3826*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3827*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
3828*6777b538SAndroid Build Coastguard Worker    return 0;
3829*6777b538SAndroid Build Coastguard Worker  }
3830*6777b538SAndroid Build Coastguard Worker
3831*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3832*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3833*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
3834*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3835*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3836*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3837*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3838*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3839*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
3840*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3841*6777b538SAndroid Build Coastguard Worker  }
3842*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3843*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
3844*6777b538SAndroid Build Coastguard Worker  return result;
3845*6777b538SAndroid Build Coastguard Worker}
3846*6777b538SAndroid Build Coastguard Worker
3847*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3848*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3849*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3850*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3851*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3852*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3853*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3854*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3855*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3856*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3857*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3858*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
3859*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3860*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
3861*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3862*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3863*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3864*6777b538SAndroid Build Coastguard Worker    // Write the fields.
3865*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3866*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3867*6777b538SAndroid Build Coastguard Worker  }
3868*6777b538SAndroid Build Coastguard Worker}
3869*6777b538SAndroid Build Coastguard Worker
3870*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3871*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3872*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt32)];
3873*6777b538SAndroid Build Coastguard Worker}
3874*6777b538SAndroid Build Coastguard Worker
3875*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3876*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(int32_t key, int64_t value, BOOL *stop) {
3877*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
3878*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%lld", value]);
3879*6777b538SAndroid Build Coastguard Worker  }];
3880*6777b538SAndroid Build Coastguard Worker}
3881*6777b538SAndroid Build Coastguard Worker
3882*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(int32_t)key {
3883*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3884*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
3885*6777b538SAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
3886*6777b538SAndroid Build Coastguard Worker  }
3887*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
3888*6777b538SAndroid Build Coastguard Worker}
3889*6777b538SAndroid Build Coastguard Worker
3890*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32Int64Dictionary *)otherDictionary {
3891*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
3892*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3893*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
3894*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3895*6777b538SAndroid Build Coastguard Worker    }
3896*6777b538SAndroid Build Coastguard Worker  }
3897*6777b538SAndroid Build Coastguard Worker}
3898*6777b538SAndroid Build Coastguard Worker
3899*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(int32_t)key {
3900*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3901*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
3902*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3903*6777b538SAndroid Build Coastguard Worker  }
3904*6777b538SAndroid Build Coastguard Worker}
3905*6777b538SAndroid Build Coastguard Worker
3906*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(int32_t)aKey {
3907*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3908*6777b538SAndroid Build Coastguard Worker}
3909*6777b538SAndroid Build Coastguard Worker
3910*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
3911*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3912*6777b538SAndroid Build Coastguard Worker}
3913*6777b538SAndroid Build Coastguard Worker
3914*6777b538SAndroid Build Coastguard Worker@end
3915*6777b538SAndroid Build Coastguard Worker
3916*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Bool
3917*6777b538SAndroid Build Coastguard Worker
3918*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32BoolDictionary {
3919*6777b538SAndroid Build Coastguard Worker @package
3920*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3921*6777b538SAndroid Build Coastguard Worker}
3922*6777b538SAndroid Build Coastguard Worker
3923*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
3924*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
3925*6777b538SAndroid Build Coastguard Worker}
3926*6777b538SAndroid Build Coastguard Worker
3927*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
3928*6777b538SAndroid Build Coastguard Worker                      forKeys:(const int32_t [])keys
3929*6777b538SAndroid Build Coastguard Worker                        count:(NSUInteger)count {
3930*6777b538SAndroid Build Coastguard Worker  self = [super init];
3931*6777b538SAndroid Build Coastguard Worker  if (self) {
3932*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3933*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
3934*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3935*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3936*6777b538SAndroid Build Coastguard Worker      }
3937*6777b538SAndroid Build Coastguard Worker    }
3938*6777b538SAndroid Build Coastguard Worker  }
3939*6777b538SAndroid Build Coastguard Worker  return self;
3940*6777b538SAndroid Build Coastguard Worker}
3941*6777b538SAndroid Build Coastguard Worker
3942*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32BoolDictionary *)dictionary {
3943*6777b538SAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
3944*6777b538SAndroid Build Coastguard Worker  if (self) {
3945*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
3946*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3947*6777b538SAndroid Build Coastguard Worker    }
3948*6777b538SAndroid Build Coastguard Worker  }
3949*6777b538SAndroid Build Coastguard Worker  return self;
3950*6777b538SAndroid Build Coastguard Worker}
3951*6777b538SAndroid Build Coastguard Worker
3952*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3953*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
3954*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
3955*6777b538SAndroid Build Coastguard Worker}
3956*6777b538SAndroid Build Coastguard Worker
3957*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
3958*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3959*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3960*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
3961*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
3962*6777b538SAndroid Build Coastguard Worker  [super dealloc];
3963*6777b538SAndroid Build Coastguard Worker}
3964*6777b538SAndroid Build Coastguard Worker
3965*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3966*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
3967*6777b538SAndroid Build Coastguard Worker}
3968*6777b538SAndroid Build Coastguard Worker
3969*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3970*6777b538SAndroid Build Coastguard Worker  if (self == other) {
3971*6777b538SAndroid Build Coastguard Worker    return YES;
3972*6777b538SAndroid Build Coastguard Worker  }
3973*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32BoolDictionary class]]) {
3974*6777b538SAndroid Build Coastguard Worker    return NO;
3975*6777b538SAndroid Build Coastguard Worker  }
3976*6777b538SAndroid Build Coastguard Worker  GPBInt32BoolDictionary *otherDictionary = other;
3977*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3978*6777b538SAndroid Build Coastguard Worker}
3979*6777b538SAndroid Build Coastguard Worker
3980*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
3981*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3982*6777b538SAndroid Build Coastguard Worker}
3983*6777b538SAndroid Build Coastguard Worker
3984*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
3985*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3986*6777b538SAndroid Build Coastguard Worker}
3987*6777b538SAndroid Build Coastguard Worker
3988*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
3989*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
3990*6777b538SAndroid Build Coastguard Worker}
3991*6777b538SAndroid Build Coastguard Worker
3992*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
3993*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, BOOL value, BOOL *stop))block {
3994*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
3995*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3996*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3997*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
3998*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3999*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4000*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue boolValue], &stop);
4001*6777b538SAndroid Build Coastguard Worker    if (stop) {
4002*6777b538SAndroid Build Coastguard Worker      break;
4003*6777b538SAndroid Build Coastguard Worker    }
4004*6777b538SAndroid Build Coastguard Worker  }
4005*6777b538SAndroid Build Coastguard Worker}
4006*6777b538SAndroid Build Coastguard Worker
4007*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4008*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4009*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4010*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
4011*6777b538SAndroid Build Coastguard Worker    return 0;
4012*6777b538SAndroid Build Coastguard Worker  }
4013*6777b538SAndroid Build Coastguard Worker
4014*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4015*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4016*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
4017*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4018*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4019*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4020*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4021*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4022*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
4023*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4024*6777b538SAndroid Build Coastguard Worker  }
4025*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4026*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
4027*6777b538SAndroid Build Coastguard Worker  return result;
4028*6777b538SAndroid Build Coastguard Worker}
4029*6777b538SAndroid Build Coastguard Worker
4030*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4031*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4032*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4033*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4034*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4035*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4036*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4037*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4038*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4039*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4040*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4041*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
4042*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4043*6777b538SAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
4044*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4045*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4046*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4047*6777b538SAndroid Build Coastguard Worker    // Write the fields.
4048*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4049*6777b538SAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4050*6777b538SAndroid Build Coastguard Worker  }
4051*6777b538SAndroid Build Coastguard Worker}
4052*6777b538SAndroid Build Coastguard Worker
4053*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4054*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4055*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt32)];
4056*6777b538SAndroid Build Coastguard Worker}
4057*6777b538SAndroid Build Coastguard Worker
4058*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4059*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(int32_t key, BOOL value, BOOL *stop) {
4060*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
4061*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], (value ? @"true" : @"false"));
4062*6777b538SAndroid Build Coastguard Worker  }];
4063*6777b538SAndroid Build Coastguard Worker}
4064*6777b538SAndroid Build Coastguard Worker
4065*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(int32_t)key {
4066*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4067*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
4068*6777b538SAndroid Build Coastguard Worker    *value = [wrapped boolValue];
4069*6777b538SAndroid Build Coastguard Worker  }
4070*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
4071*6777b538SAndroid Build Coastguard Worker}
4072*6777b538SAndroid Build Coastguard Worker
4073*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32BoolDictionary *)otherDictionary {
4074*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
4075*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4076*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
4077*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4078*6777b538SAndroid Build Coastguard Worker    }
4079*6777b538SAndroid Build Coastguard Worker  }
4080*6777b538SAndroid Build Coastguard Worker}
4081*6777b538SAndroid Build Coastguard Worker
4082*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(int32_t)key {
4083*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4084*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
4085*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4086*6777b538SAndroid Build Coastguard Worker  }
4087*6777b538SAndroid Build Coastguard Worker}
4088*6777b538SAndroid Build Coastguard Worker
4089*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(int32_t)aKey {
4090*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4091*6777b538SAndroid Build Coastguard Worker}
4092*6777b538SAndroid Build Coastguard Worker
4093*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
4094*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4095*6777b538SAndroid Build Coastguard Worker}
4096*6777b538SAndroid Build Coastguard Worker
4097*6777b538SAndroid Build Coastguard Worker@end
4098*6777b538SAndroid Build Coastguard Worker
4099*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Float
4100*6777b538SAndroid Build Coastguard Worker
4101*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32FloatDictionary {
4102*6777b538SAndroid Build Coastguard Worker @package
4103*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4104*6777b538SAndroid Build Coastguard Worker}
4105*6777b538SAndroid Build Coastguard Worker
4106*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
4107*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
4108*6777b538SAndroid Build Coastguard Worker}
4109*6777b538SAndroid Build Coastguard Worker
4110*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
4111*6777b538SAndroid Build Coastguard Worker                       forKeys:(const int32_t [])keys
4112*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
4113*6777b538SAndroid Build Coastguard Worker  self = [super init];
4114*6777b538SAndroid Build Coastguard Worker  if (self) {
4115*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4116*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
4117*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4118*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4119*6777b538SAndroid Build Coastguard Worker      }
4120*6777b538SAndroid Build Coastguard Worker    }
4121*6777b538SAndroid Build Coastguard Worker  }
4122*6777b538SAndroid Build Coastguard Worker  return self;
4123*6777b538SAndroid Build Coastguard Worker}
4124*6777b538SAndroid Build Coastguard Worker
4125*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32FloatDictionary *)dictionary {
4126*6777b538SAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
4127*6777b538SAndroid Build Coastguard Worker  if (self) {
4128*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
4129*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4130*6777b538SAndroid Build Coastguard Worker    }
4131*6777b538SAndroid Build Coastguard Worker  }
4132*6777b538SAndroid Build Coastguard Worker  return self;
4133*6777b538SAndroid Build Coastguard Worker}
4134*6777b538SAndroid Build Coastguard Worker
4135*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4136*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
4137*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
4138*6777b538SAndroid Build Coastguard Worker}
4139*6777b538SAndroid Build Coastguard Worker
4140*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
4141*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4142*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4143*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
4144*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
4145*6777b538SAndroid Build Coastguard Worker  [super dealloc];
4146*6777b538SAndroid Build Coastguard Worker}
4147*6777b538SAndroid Build Coastguard Worker
4148*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4149*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32FloatDictionary allocWithZone:zone] initWithDictionary:self];
4150*6777b538SAndroid Build Coastguard Worker}
4151*6777b538SAndroid Build Coastguard Worker
4152*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4153*6777b538SAndroid Build Coastguard Worker  if (self == other) {
4154*6777b538SAndroid Build Coastguard Worker    return YES;
4155*6777b538SAndroid Build Coastguard Worker  }
4156*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32FloatDictionary class]]) {
4157*6777b538SAndroid Build Coastguard Worker    return NO;
4158*6777b538SAndroid Build Coastguard Worker  }
4159*6777b538SAndroid Build Coastguard Worker  GPBInt32FloatDictionary *otherDictionary = other;
4160*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4161*6777b538SAndroid Build Coastguard Worker}
4162*6777b538SAndroid Build Coastguard Worker
4163*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
4164*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4165*6777b538SAndroid Build Coastguard Worker}
4166*6777b538SAndroid Build Coastguard Worker
4167*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
4168*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4169*6777b538SAndroid Build Coastguard Worker}
4170*6777b538SAndroid Build Coastguard Worker
4171*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
4172*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4173*6777b538SAndroid Build Coastguard Worker}
4174*6777b538SAndroid Build Coastguard Worker
4175*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
4176*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, float value, BOOL *stop))block {
4177*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
4178*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4179*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4180*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4181*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4182*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4183*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue floatValue], &stop);
4184*6777b538SAndroid Build Coastguard Worker    if (stop) {
4185*6777b538SAndroid Build Coastguard Worker      break;
4186*6777b538SAndroid Build Coastguard Worker    }
4187*6777b538SAndroid Build Coastguard Worker  }
4188*6777b538SAndroid Build Coastguard Worker}
4189*6777b538SAndroid Build Coastguard Worker
4190*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4191*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4192*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4193*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
4194*6777b538SAndroid Build Coastguard Worker    return 0;
4195*6777b538SAndroid Build Coastguard Worker  }
4196*6777b538SAndroid Build Coastguard Worker
4197*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4198*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4199*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
4200*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4201*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4202*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4203*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4204*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4205*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
4206*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4207*6777b538SAndroid Build Coastguard Worker  }
4208*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4209*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
4210*6777b538SAndroid Build Coastguard Worker  return result;
4211*6777b538SAndroid Build Coastguard Worker}
4212*6777b538SAndroid Build Coastguard Worker
4213*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4214*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4215*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4216*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4217*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4218*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4219*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4220*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4221*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4222*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4223*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4224*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
4225*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4226*6777b538SAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
4227*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4228*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4229*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4230*6777b538SAndroid Build Coastguard Worker    // Write the fields.
4231*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4232*6777b538SAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4233*6777b538SAndroid Build Coastguard Worker  }
4234*6777b538SAndroid Build Coastguard Worker}
4235*6777b538SAndroid Build Coastguard Worker
4236*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4237*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4238*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt32)];
4239*6777b538SAndroid Build Coastguard Worker}
4240*6777b538SAndroid Build Coastguard Worker
4241*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4242*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(int32_t key, float value, BOOL *stop) {
4243*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
4244*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
4245*6777b538SAndroid Build Coastguard Worker  }];
4246*6777b538SAndroid Build Coastguard Worker}
4247*6777b538SAndroid Build Coastguard Worker
4248*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(int32_t)key {
4249*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4250*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
4251*6777b538SAndroid Build Coastguard Worker    *value = [wrapped floatValue];
4252*6777b538SAndroid Build Coastguard Worker  }
4253*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
4254*6777b538SAndroid Build Coastguard Worker}
4255*6777b538SAndroid Build Coastguard Worker
4256*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32FloatDictionary *)otherDictionary {
4257*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
4258*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4259*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
4260*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4261*6777b538SAndroid Build Coastguard Worker    }
4262*6777b538SAndroid Build Coastguard Worker  }
4263*6777b538SAndroid Build Coastguard Worker}
4264*6777b538SAndroid Build Coastguard Worker
4265*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(int32_t)key {
4266*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4267*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
4268*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4269*6777b538SAndroid Build Coastguard Worker  }
4270*6777b538SAndroid Build Coastguard Worker}
4271*6777b538SAndroid Build Coastguard Worker
4272*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(int32_t)aKey {
4273*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4274*6777b538SAndroid Build Coastguard Worker}
4275*6777b538SAndroid Build Coastguard Worker
4276*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
4277*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4278*6777b538SAndroid Build Coastguard Worker}
4279*6777b538SAndroid Build Coastguard Worker
4280*6777b538SAndroid Build Coastguard Worker@end
4281*6777b538SAndroid Build Coastguard Worker
4282*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Double
4283*6777b538SAndroid Build Coastguard Worker
4284*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32DoubleDictionary {
4285*6777b538SAndroid Build Coastguard Worker @package
4286*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4287*6777b538SAndroid Build Coastguard Worker}
4288*6777b538SAndroid Build Coastguard Worker
4289*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
4290*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
4291*6777b538SAndroid Build Coastguard Worker}
4292*6777b538SAndroid Build Coastguard Worker
4293*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
4294*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
4295*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
4296*6777b538SAndroid Build Coastguard Worker  self = [super init];
4297*6777b538SAndroid Build Coastguard Worker  if (self) {
4298*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4299*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
4300*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4301*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4302*6777b538SAndroid Build Coastguard Worker      }
4303*6777b538SAndroid Build Coastguard Worker    }
4304*6777b538SAndroid Build Coastguard Worker  }
4305*6777b538SAndroid Build Coastguard Worker  return self;
4306*6777b538SAndroid Build Coastguard Worker}
4307*6777b538SAndroid Build Coastguard Worker
4308*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32DoubleDictionary *)dictionary {
4309*6777b538SAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
4310*6777b538SAndroid Build Coastguard Worker  if (self) {
4311*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
4312*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4313*6777b538SAndroid Build Coastguard Worker    }
4314*6777b538SAndroid Build Coastguard Worker  }
4315*6777b538SAndroid Build Coastguard Worker  return self;
4316*6777b538SAndroid Build Coastguard Worker}
4317*6777b538SAndroid Build Coastguard Worker
4318*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4319*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
4320*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
4321*6777b538SAndroid Build Coastguard Worker}
4322*6777b538SAndroid Build Coastguard Worker
4323*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
4324*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4325*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4326*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
4327*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
4328*6777b538SAndroid Build Coastguard Worker  [super dealloc];
4329*6777b538SAndroid Build Coastguard Worker}
4330*6777b538SAndroid Build Coastguard Worker
4331*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4332*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self];
4333*6777b538SAndroid Build Coastguard Worker}
4334*6777b538SAndroid Build Coastguard Worker
4335*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4336*6777b538SAndroid Build Coastguard Worker  if (self == other) {
4337*6777b538SAndroid Build Coastguard Worker    return YES;
4338*6777b538SAndroid Build Coastguard Worker  }
4339*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32DoubleDictionary class]]) {
4340*6777b538SAndroid Build Coastguard Worker    return NO;
4341*6777b538SAndroid Build Coastguard Worker  }
4342*6777b538SAndroid Build Coastguard Worker  GPBInt32DoubleDictionary *otherDictionary = other;
4343*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4344*6777b538SAndroid Build Coastguard Worker}
4345*6777b538SAndroid Build Coastguard Worker
4346*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
4347*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4348*6777b538SAndroid Build Coastguard Worker}
4349*6777b538SAndroid Build Coastguard Worker
4350*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
4351*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4352*6777b538SAndroid Build Coastguard Worker}
4353*6777b538SAndroid Build Coastguard Worker
4354*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
4355*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4356*6777b538SAndroid Build Coastguard Worker}
4357*6777b538SAndroid Build Coastguard Worker
4358*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
4359*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, double value, BOOL *stop))block {
4360*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
4361*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4362*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4363*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4364*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4365*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4366*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue doubleValue], &stop);
4367*6777b538SAndroid Build Coastguard Worker    if (stop) {
4368*6777b538SAndroid Build Coastguard Worker      break;
4369*6777b538SAndroid Build Coastguard Worker    }
4370*6777b538SAndroid Build Coastguard Worker  }
4371*6777b538SAndroid Build Coastguard Worker}
4372*6777b538SAndroid Build Coastguard Worker
4373*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4374*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4375*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4376*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
4377*6777b538SAndroid Build Coastguard Worker    return 0;
4378*6777b538SAndroid Build Coastguard Worker  }
4379*6777b538SAndroid Build Coastguard Worker
4380*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4381*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4382*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
4383*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4384*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4385*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4386*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4387*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4388*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
4389*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4390*6777b538SAndroid Build Coastguard Worker  }
4391*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4392*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
4393*6777b538SAndroid Build Coastguard Worker  return result;
4394*6777b538SAndroid Build Coastguard Worker}
4395*6777b538SAndroid Build Coastguard Worker
4396*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4397*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4398*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4399*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4400*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4401*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4402*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4403*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4404*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4405*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4406*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4407*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
4408*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4409*6777b538SAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
4410*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4411*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4412*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4413*6777b538SAndroid Build Coastguard Worker    // Write the fields.
4414*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4415*6777b538SAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4416*6777b538SAndroid Build Coastguard Worker  }
4417*6777b538SAndroid Build Coastguard Worker}
4418*6777b538SAndroid Build Coastguard Worker
4419*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4420*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4421*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt32)];
4422*6777b538SAndroid Build Coastguard Worker}
4423*6777b538SAndroid Build Coastguard Worker
4424*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4425*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(int32_t key, double value, BOOL *stop) {
4426*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
4427*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
4428*6777b538SAndroid Build Coastguard Worker  }];
4429*6777b538SAndroid Build Coastguard Worker}
4430*6777b538SAndroid Build Coastguard Worker
4431*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(int32_t)key {
4432*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4433*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
4434*6777b538SAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
4435*6777b538SAndroid Build Coastguard Worker  }
4436*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
4437*6777b538SAndroid Build Coastguard Worker}
4438*6777b538SAndroid Build Coastguard Worker
4439*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32DoubleDictionary *)otherDictionary {
4440*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
4441*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4442*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
4443*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4444*6777b538SAndroid Build Coastguard Worker    }
4445*6777b538SAndroid Build Coastguard Worker  }
4446*6777b538SAndroid Build Coastguard Worker}
4447*6777b538SAndroid Build Coastguard Worker
4448*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(int32_t)key {
4449*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4450*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
4451*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4452*6777b538SAndroid Build Coastguard Worker  }
4453*6777b538SAndroid Build Coastguard Worker}
4454*6777b538SAndroid Build Coastguard Worker
4455*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(int32_t)aKey {
4456*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4457*6777b538SAndroid Build Coastguard Worker}
4458*6777b538SAndroid Build Coastguard Worker
4459*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
4460*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4461*6777b538SAndroid Build Coastguard Worker}
4462*6777b538SAndroid Build Coastguard Worker
4463*6777b538SAndroid Build Coastguard Worker@end
4464*6777b538SAndroid Build Coastguard Worker
4465*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Enum
4466*6777b538SAndroid Build Coastguard Worker
4467*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32EnumDictionary {
4468*6777b538SAndroid Build Coastguard Worker @package
4469*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4470*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
4471*6777b538SAndroid Build Coastguard Worker}
4472*6777b538SAndroid Build Coastguard Worker
4473*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
4474*6777b538SAndroid Build Coastguard Worker
4475*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
4476*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
4477*6777b538SAndroid Build Coastguard Worker}
4478*6777b538SAndroid Build Coastguard Worker
4479*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
4480*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
4481*6777b538SAndroid Build Coastguard Worker}
4482*6777b538SAndroid Build Coastguard Worker
4483*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
4484*6777b538SAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
4485*6777b538SAndroid Build Coastguard Worker                                   forKeys:(const int32_t [])keys
4486*6777b538SAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
4487*6777b538SAndroid Build Coastguard Worker  self = [super init];
4488*6777b538SAndroid Build Coastguard Worker  if (self) {
4489*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4490*6777b538SAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
4491*6777b538SAndroid Build Coastguard Worker    if (count && rawValues && keys) {
4492*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4493*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
4494*6777b538SAndroid Build Coastguard Worker      }
4495*6777b538SAndroid Build Coastguard Worker    }
4496*6777b538SAndroid Build Coastguard Worker  }
4497*6777b538SAndroid Build Coastguard Worker  return self;
4498*6777b538SAndroid Build Coastguard Worker}
4499*6777b538SAndroid Build Coastguard Worker
4500*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32EnumDictionary *)dictionary {
4501*6777b538SAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
4502*6777b538SAndroid Build Coastguard Worker                                rawValues:NULL
4503*6777b538SAndroid Build Coastguard Worker                                  forKeys:NULL
4504*6777b538SAndroid Build Coastguard Worker                                    count:0];
4505*6777b538SAndroid Build Coastguard Worker  if (self) {
4506*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
4507*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4508*6777b538SAndroid Build Coastguard Worker    }
4509*6777b538SAndroid Build Coastguard Worker  }
4510*6777b538SAndroid Build Coastguard Worker  return self;
4511*6777b538SAndroid Build Coastguard Worker}
4512*6777b538SAndroid Build Coastguard Worker
4513*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
4514*6777b538SAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
4515*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
4516*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
4517*6777b538SAndroid Build Coastguard Worker}
4518*6777b538SAndroid Build Coastguard Worker
4519*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
4520*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4521*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4522*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
4523*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
4524*6777b538SAndroid Build Coastguard Worker  [super dealloc];
4525*6777b538SAndroid Build Coastguard Worker}
4526*6777b538SAndroid Build Coastguard Worker
4527*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4528*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
4529*6777b538SAndroid Build Coastguard Worker}
4530*6777b538SAndroid Build Coastguard Worker
4531*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4532*6777b538SAndroid Build Coastguard Worker  if (self == other) {
4533*6777b538SAndroid Build Coastguard Worker    return YES;
4534*6777b538SAndroid Build Coastguard Worker  }
4535*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32EnumDictionary class]]) {
4536*6777b538SAndroid Build Coastguard Worker    return NO;
4537*6777b538SAndroid Build Coastguard Worker  }
4538*6777b538SAndroid Build Coastguard Worker  GPBInt32EnumDictionary *otherDictionary = other;
4539*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4540*6777b538SAndroid Build Coastguard Worker}
4541*6777b538SAndroid Build Coastguard Worker
4542*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
4543*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4544*6777b538SAndroid Build Coastguard Worker}
4545*6777b538SAndroid Build Coastguard Worker
4546*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
4547*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4548*6777b538SAndroid Build Coastguard Worker}
4549*6777b538SAndroid Build Coastguard Worker
4550*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
4551*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4552*6777b538SAndroid Build Coastguard Worker}
4553*6777b538SAndroid Build Coastguard Worker
4554*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
4555*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block {
4556*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
4557*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4558*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4559*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4560*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4561*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4562*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], [aValue intValue], &stop);
4563*6777b538SAndroid Build Coastguard Worker    if (stop) {
4564*6777b538SAndroid Build Coastguard Worker      break;
4565*6777b538SAndroid Build Coastguard Worker    }
4566*6777b538SAndroid Build Coastguard Worker  }
4567*6777b538SAndroid Build Coastguard Worker}
4568*6777b538SAndroid Build Coastguard Worker
4569*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4570*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4571*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4572*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
4573*6777b538SAndroid Build Coastguard Worker    return 0;
4574*6777b538SAndroid Build Coastguard Worker  }
4575*6777b538SAndroid Build Coastguard Worker
4576*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4577*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4578*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
4579*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4580*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4581*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4582*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4583*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4584*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
4585*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4586*6777b538SAndroid Build Coastguard Worker  }
4587*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4588*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
4589*6777b538SAndroid Build Coastguard Worker  return result;
4590*6777b538SAndroid Build Coastguard Worker}
4591*6777b538SAndroid Build Coastguard Worker
4592*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4593*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4594*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4595*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4596*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4597*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4598*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4599*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4600*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4601*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4602*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4603*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
4604*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4605*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
4606*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4607*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4608*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4609*6777b538SAndroid Build Coastguard Worker    // Write the fields.
4610*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4611*6777b538SAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4612*6777b538SAndroid Build Coastguard Worker  }
4613*6777b538SAndroid Build Coastguard Worker}
4614*6777b538SAndroid Build Coastguard Worker
4615*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
4616*6777b538SAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
4617*6777b538SAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
4618*6777b538SAndroid Build Coastguard Worker  size_t msgSize = ComputeDictInt32FieldSize(key->valueInt32, kMapKeyFieldNumber, keyDataType);
4619*6777b538SAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
4620*6777b538SAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
4621*6777b538SAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
4622*6777b538SAndroid Build Coastguard Worker  WriteDictInt32Field(outputStream, key->valueInt32, kMapKeyFieldNumber, keyDataType);
4623*6777b538SAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
4624*6777b538SAndroid Build Coastguard Worker  [outputStream release];
4625*6777b538SAndroid Build Coastguard Worker  return data;
4626*6777b538SAndroid Build Coastguard Worker}
4627*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4628*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4629*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt32)];
4630*6777b538SAndroid Build Coastguard Worker}
4631*6777b538SAndroid Build Coastguard Worker
4632*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4633*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
4634*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
4635*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], @(value));
4636*6777b538SAndroid Build Coastguard Worker  }];
4637*6777b538SAndroid Build Coastguard Worker}
4638*6777b538SAndroid Build Coastguard Worker
4639*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(int32_t)key {
4640*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4641*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
4642*6777b538SAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
4643*6777b538SAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
4644*6777b538SAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
4645*6777b538SAndroid Build Coastguard Worker    }
4646*6777b538SAndroid Build Coastguard Worker    *value = result;
4647*6777b538SAndroid Build Coastguard Worker  }
4648*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
4649*6777b538SAndroid Build Coastguard Worker}
4650*6777b538SAndroid Build Coastguard Worker
4651*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int32_t)key {
4652*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4653*6777b538SAndroid Build Coastguard Worker  if (wrapped && rawValue) {
4654*6777b538SAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
4655*6777b538SAndroid Build Coastguard Worker  }
4656*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
4657*6777b538SAndroid Build Coastguard Worker}
4658*6777b538SAndroid Build Coastguard Worker
4659*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
4660*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block {
4661*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
4662*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
4663*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
4664*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4665*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4666*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
4667*6777b538SAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
4668*6777b538SAndroid Build Coastguard Worker      if (!func(unwrapped)) {
4669*6777b538SAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
4670*6777b538SAndroid Build Coastguard Worker      }
4671*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], unwrapped, &stop);
4672*6777b538SAndroid Build Coastguard Worker    if (stop) {
4673*6777b538SAndroid Build Coastguard Worker      break;
4674*6777b538SAndroid Build Coastguard Worker    }
4675*6777b538SAndroid Build Coastguard Worker  }
4676*6777b538SAndroid Build Coastguard Worker}
4677*6777b538SAndroid Build Coastguard Worker
4678*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBInt32EnumDictionary *)otherDictionary {
4679*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
4680*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4681*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
4682*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4683*6777b538SAndroid Build Coastguard Worker    }
4684*6777b538SAndroid Build Coastguard Worker  }
4685*6777b538SAndroid Build Coastguard Worker}
4686*6777b538SAndroid Build Coastguard Worker
4687*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(int32_t)key {
4688*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4689*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
4690*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4691*6777b538SAndroid Build Coastguard Worker  }
4692*6777b538SAndroid Build Coastguard Worker}
4693*6777b538SAndroid Build Coastguard Worker
4694*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(int32_t)aKey {
4695*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4696*6777b538SAndroid Build Coastguard Worker}
4697*6777b538SAndroid Build Coastguard Worker
4698*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
4699*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4700*6777b538SAndroid Build Coastguard Worker}
4701*6777b538SAndroid Build Coastguard Worker
4702*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(int32_t)key {
4703*6777b538SAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
4704*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
4705*6777b538SAndroid Build Coastguard Worker                format:@"GPBInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
4706*6777b538SAndroid Build Coastguard Worker                       value];
4707*6777b538SAndroid Build Coastguard Worker  }
4708*6777b538SAndroid Build Coastguard Worker
4709*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4710*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
4711*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4712*6777b538SAndroid Build Coastguard Worker  }
4713*6777b538SAndroid Build Coastguard Worker}
4714*6777b538SAndroid Build Coastguard Worker
4715*6777b538SAndroid Build Coastguard Worker@end
4716*6777b538SAndroid Build Coastguard Worker
4717*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Object
4718*6777b538SAndroid Build Coastguard Worker
4719*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32ObjectDictionary {
4720*6777b538SAndroid Build Coastguard Worker @package
4721*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4722*6777b538SAndroid Build Coastguard Worker}
4723*6777b538SAndroid Build Coastguard Worker
4724*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
4725*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
4726*6777b538SAndroid Build Coastguard Worker}
4727*6777b538SAndroid Build Coastguard Worker
4728*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
4729*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
4730*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
4731*6777b538SAndroid Build Coastguard Worker  self = [super init];
4732*6777b538SAndroid Build Coastguard Worker  if (self) {
4733*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4734*6777b538SAndroid Build Coastguard Worker    if (count && objects && keys) {
4735*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4736*6777b538SAndroid Build Coastguard Worker        if (!objects[i]) {
4737*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
4738*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
4739*6777b538SAndroid Build Coastguard Worker        }
4740*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
4741*6777b538SAndroid Build Coastguard Worker      }
4742*6777b538SAndroid Build Coastguard Worker    }
4743*6777b538SAndroid Build Coastguard Worker  }
4744*6777b538SAndroid Build Coastguard Worker  return self;
4745*6777b538SAndroid Build Coastguard Worker}
4746*6777b538SAndroid Build Coastguard Worker
4747*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32ObjectDictionary *)dictionary {
4748*6777b538SAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
4749*6777b538SAndroid Build Coastguard Worker  if (self) {
4750*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
4751*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4752*6777b538SAndroid Build Coastguard Worker    }
4753*6777b538SAndroid Build Coastguard Worker  }
4754*6777b538SAndroid Build Coastguard Worker  return self;
4755*6777b538SAndroid Build Coastguard Worker}
4756*6777b538SAndroid Build Coastguard Worker
4757*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4758*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
4759*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
4760*6777b538SAndroid Build Coastguard Worker}
4761*6777b538SAndroid Build Coastguard Worker
4762*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
4763*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4764*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4765*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
4766*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
4767*6777b538SAndroid Build Coastguard Worker  [super dealloc];
4768*6777b538SAndroid Build Coastguard Worker}
4769*6777b538SAndroid Build Coastguard Worker
4770*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4771*6777b538SAndroid Build Coastguard Worker  return [[GPBInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self];
4772*6777b538SAndroid Build Coastguard Worker}
4773*6777b538SAndroid Build Coastguard Worker
4774*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4775*6777b538SAndroid Build Coastguard Worker  if (self == other) {
4776*6777b538SAndroid Build Coastguard Worker    return YES;
4777*6777b538SAndroid Build Coastguard Worker  }
4778*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32ObjectDictionary class]]) {
4779*6777b538SAndroid Build Coastguard Worker    return NO;
4780*6777b538SAndroid Build Coastguard Worker  }
4781*6777b538SAndroid Build Coastguard Worker  GPBInt32ObjectDictionary *otherDictionary = other;
4782*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4783*6777b538SAndroid Build Coastguard Worker}
4784*6777b538SAndroid Build Coastguard Worker
4785*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
4786*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4787*6777b538SAndroid Build Coastguard Worker}
4788*6777b538SAndroid Build Coastguard Worker
4789*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
4790*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4791*6777b538SAndroid Build Coastguard Worker}
4792*6777b538SAndroid Build Coastguard Worker
4793*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
4794*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
4795*6777b538SAndroid Build Coastguard Worker}
4796*6777b538SAndroid Build Coastguard Worker
4797*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
4798*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, id object, BOOL *stop))block {
4799*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
4800*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4801*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4802*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4803*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4804*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
4805*6777b538SAndroid Build Coastguard Worker    block([aKey intValue], aObject, &stop);
4806*6777b538SAndroid Build Coastguard Worker    if (stop) {
4807*6777b538SAndroid Build Coastguard Worker      break;
4808*6777b538SAndroid Build Coastguard Worker    }
4809*6777b538SAndroid Build Coastguard Worker  }
4810*6777b538SAndroid Build Coastguard Worker}
4811*6777b538SAndroid Build Coastguard Worker
4812*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized {
4813*6777b538SAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
4814*6777b538SAndroid Build Coastguard Worker    if (!msg.initialized) {
4815*6777b538SAndroid Build Coastguard Worker      return NO;
4816*6777b538SAndroid Build Coastguard Worker    }
4817*6777b538SAndroid Build Coastguard Worker  }
4818*6777b538SAndroid Build Coastguard Worker  return YES;
4819*6777b538SAndroid Build Coastguard Worker}
4820*6777b538SAndroid Build Coastguard Worker
4821*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
4822*6777b538SAndroid Build Coastguard Worker  GPBInt32ObjectDictionary *newDict =
4823*6777b538SAndroid Build Coastguard Worker      [[GPBInt32ObjectDictionary alloc] init];
4824*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
4825*6777b538SAndroid Build Coastguard Worker  id aKey;
4826*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
4827*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4828*6777b538SAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
4829*6777b538SAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
4830*6777b538SAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
4831*6777b538SAndroid Build Coastguard Worker    [copiedMsg release];
4832*6777b538SAndroid Build Coastguard Worker  }
4833*6777b538SAndroid Build Coastguard Worker  return newDict;
4834*6777b538SAndroid Build Coastguard Worker}
4835*6777b538SAndroid Build Coastguard Worker
4836*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4837*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4838*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4839*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
4840*6777b538SAndroid Build Coastguard Worker    return 0;
4841*6777b538SAndroid Build Coastguard Worker  }
4842*6777b538SAndroid Build Coastguard Worker
4843*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4844*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4845*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
4846*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4847*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4848*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4849*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
4850*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4851*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
4852*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4853*6777b538SAndroid Build Coastguard Worker  }
4854*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4855*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
4856*6777b538SAndroid Build Coastguard Worker  return result;
4857*6777b538SAndroid Build Coastguard Worker}
4858*6777b538SAndroid Build Coastguard Worker
4859*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4860*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4861*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4862*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4863*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4864*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4865*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4866*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
4867*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4868*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
4869*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4870*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
4871*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4872*6777b538SAndroid Build Coastguard Worker    id unwrappedValue = aObject;
4873*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4874*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4875*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4876*6777b538SAndroid Build Coastguard Worker    // Write the fields.
4877*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4878*6777b538SAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4879*6777b538SAndroid Build Coastguard Worker  }
4880*6777b538SAndroid Build Coastguard Worker}
4881*6777b538SAndroid Build Coastguard Worker
4882*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4883*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4884*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueInt32)];
4885*6777b538SAndroid Build Coastguard Worker}
4886*6777b538SAndroid Build Coastguard Worker
4887*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4888*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(int32_t key, id object, BOOL *stop) {
4889*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
4890*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], object);
4891*6777b538SAndroid Build Coastguard Worker  }];
4892*6777b538SAndroid Build Coastguard Worker}
4893*6777b538SAndroid Build Coastguard Worker
4894*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(int32_t)key {
4895*6777b538SAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
4896*6777b538SAndroid Build Coastguard Worker  return result;
4897*6777b538SAndroid Build Coastguard Worker}
4898*6777b538SAndroid Build Coastguard Worker
4899*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32ObjectDictionary *)otherDictionary {
4900*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
4901*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4902*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
4903*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4904*6777b538SAndroid Build Coastguard Worker    }
4905*6777b538SAndroid Build Coastguard Worker  }
4906*6777b538SAndroid Build Coastguard Worker}
4907*6777b538SAndroid Build Coastguard Worker
4908*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(int32_t)key {
4909*6777b538SAndroid Build Coastguard Worker  if (!object) {
4910*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
4911*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
4912*6777b538SAndroid Build Coastguard Worker  }
4913*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
4914*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
4915*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4916*6777b538SAndroid Build Coastguard Worker  }
4917*6777b538SAndroid Build Coastguard Worker}
4918*6777b538SAndroid Build Coastguard Worker
4919*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(int32_t)aKey {
4920*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4921*6777b538SAndroid Build Coastguard Worker}
4922*6777b538SAndroid Build Coastguard Worker
4923*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
4924*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4925*6777b538SAndroid Build Coastguard Worker}
4926*6777b538SAndroid Build Coastguard Worker
4927*6777b538SAndroid Build Coastguard Worker@end
4928*6777b538SAndroid Build Coastguard Worker
4929*6777b538SAndroid Build Coastguard Worker// clang-format on
4930*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt64, uint64_t)
4931*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
4932*6777b538SAndroid Build Coastguard Worker// clang-format off
4933*6777b538SAndroid Build Coastguard Worker
4934*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> UInt32
4935*6777b538SAndroid Build Coastguard Worker
4936*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64UInt32Dictionary {
4937*6777b538SAndroid Build Coastguard Worker @package
4938*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4939*6777b538SAndroid Build Coastguard Worker}
4940*6777b538SAndroid Build Coastguard Worker
4941*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
4942*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
4943*6777b538SAndroid Build Coastguard Worker}
4944*6777b538SAndroid Build Coastguard Worker
4945*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
4946*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
4947*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
4948*6777b538SAndroid Build Coastguard Worker  self = [super init];
4949*6777b538SAndroid Build Coastguard Worker  if (self) {
4950*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4951*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
4952*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4953*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4954*6777b538SAndroid Build Coastguard Worker      }
4955*6777b538SAndroid Build Coastguard Worker    }
4956*6777b538SAndroid Build Coastguard Worker  }
4957*6777b538SAndroid Build Coastguard Worker  return self;
4958*6777b538SAndroid Build Coastguard Worker}
4959*6777b538SAndroid Build Coastguard Worker
4960*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary {
4961*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
4962*6777b538SAndroid Build Coastguard Worker  if (self) {
4963*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
4964*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4965*6777b538SAndroid Build Coastguard Worker    }
4966*6777b538SAndroid Build Coastguard Worker  }
4967*6777b538SAndroid Build Coastguard Worker  return self;
4968*6777b538SAndroid Build Coastguard Worker}
4969*6777b538SAndroid Build Coastguard Worker
4970*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4971*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
4972*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
4973*6777b538SAndroid Build Coastguard Worker}
4974*6777b538SAndroid Build Coastguard Worker
4975*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
4976*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4977*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4978*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
4979*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
4980*6777b538SAndroid Build Coastguard Worker  [super dealloc];
4981*6777b538SAndroid Build Coastguard Worker}
4982*6777b538SAndroid Build Coastguard Worker
4983*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4984*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
4985*6777b538SAndroid Build Coastguard Worker}
4986*6777b538SAndroid Build Coastguard Worker
4987*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4988*6777b538SAndroid Build Coastguard Worker  if (self == other) {
4989*6777b538SAndroid Build Coastguard Worker    return YES;
4990*6777b538SAndroid Build Coastguard Worker  }
4991*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64UInt32Dictionary class]]) {
4992*6777b538SAndroid Build Coastguard Worker    return NO;
4993*6777b538SAndroid Build Coastguard Worker  }
4994*6777b538SAndroid Build Coastguard Worker  GPBUInt64UInt32Dictionary *otherDictionary = other;
4995*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4996*6777b538SAndroid Build Coastguard Worker}
4997*6777b538SAndroid Build Coastguard Worker
4998*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
4999*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5000*6777b538SAndroid Build Coastguard Worker}
5001*6777b538SAndroid Build Coastguard Worker
5002*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
5003*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5004*6777b538SAndroid Build Coastguard Worker}
5005*6777b538SAndroid Build Coastguard Worker
5006*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
5007*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5008*6777b538SAndroid Build Coastguard Worker}
5009*6777b538SAndroid Build Coastguard Worker
5010*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
5011*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, uint32_t value, BOOL *stop))block {
5012*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
5013*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5014*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5015*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5016*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5017*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5018*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue unsignedIntValue], &stop);
5019*6777b538SAndroid Build Coastguard Worker    if (stop) {
5020*6777b538SAndroid Build Coastguard Worker      break;
5021*6777b538SAndroid Build Coastguard Worker    }
5022*6777b538SAndroid Build Coastguard Worker  }
5023*6777b538SAndroid Build Coastguard Worker}
5024*6777b538SAndroid Build Coastguard Worker
5025*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5026*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5027*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5028*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
5029*6777b538SAndroid Build Coastguard Worker    return 0;
5030*6777b538SAndroid Build Coastguard Worker  }
5031*6777b538SAndroid Build Coastguard Worker
5032*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5033*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5034*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
5035*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5036*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5037*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5038*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5039*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5040*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
5041*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5042*6777b538SAndroid Build Coastguard Worker  }
5043*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5044*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
5045*6777b538SAndroid Build Coastguard Worker  return result;
5046*6777b538SAndroid Build Coastguard Worker}
5047*6777b538SAndroid Build Coastguard Worker
5048*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5049*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5050*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5051*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5052*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5053*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5054*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5055*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5056*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5057*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5058*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5059*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
5060*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5061*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
5062*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5063*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5064*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5065*6777b538SAndroid Build Coastguard Worker    // Write the fields.
5066*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5067*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5068*6777b538SAndroid Build Coastguard Worker  }
5069*6777b538SAndroid Build Coastguard Worker}
5070*6777b538SAndroid Build Coastguard Worker
5071*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5072*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5073*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt64)];
5074*6777b538SAndroid Build Coastguard Worker}
5075*6777b538SAndroid Build Coastguard Worker
5076*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5077*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(uint64_t key, uint32_t value, BOOL *stop) {
5078*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
5079*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%u", value]);
5080*6777b538SAndroid Build Coastguard Worker  }];
5081*6777b538SAndroid Build Coastguard Worker}
5082*6777b538SAndroid Build Coastguard Worker
5083*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint64_t)key {
5084*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5085*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
5086*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
5087*6777b538SAndroid Build Coastguard Worker  }
5088*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
5089*6777b538SAndroid Build Coastguard Worker}
5090*6777b538SAndroid Build Coastguard Worker
5091*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64UInt32Dictionary *)otherDictionary {
5092*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
5093*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5094*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
5095*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5096*6777b538SAndroid Build Coastguard Worker    }
5097*6777b538SAndroid Build Coastguard Worker  }
5098*6777b538SAndroid Build Coastguard Worker}
5099*6777b538SAndroid Build Coastguard Worker
5100*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(uint64_t)key {
5101*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5102*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
5103*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5104*6777b538SAndroid Build Coastguard Worker  }
5105*6777b538SAndroid Build Coastguard Worker}
5106*6777b538SAndroid Build Coastguard Worker
5107*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(uint64_t)aKey {
5108*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5109*6777b538SAndroid Build Coastguard Worker}
5110*6777b538SAndroid Build Coastguard Worker
5111*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
5112*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5113*6777b538SAndroid Build Coastguard Worker}
5114*6777b538SAndroid Build Coastguard Worker
5115*6777b538SAndroid Build Coastguard Worker@end
5116*6777b538SAndroid Build Coastguard Worker
5117*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Int32
5118*6777b538SAndroid Build Coastguard Worker
5119*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64Int32Dictionary {
5120*6777b538SAndroid Build Coastguard Worker @package
5121*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5122*6777b538SAndroid Build Coastguard Worker}
5123*6777b538SAndroid Build Coastguard Worker
5124*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
5125*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
5126*6777b538SAndroid Build Coastguard Worker}
5127*6777b538SAndroid Build Coastguard Worker
5128*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
5129*6777b538SAndroid Build Coastguard Worker                       forKeys:(const uint64_t [])keys
5130*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
5131*6777b538SAndroid Build Coastguard Worker  self = [super init];
5132*6777b538SAndroid Build Coastguard Worker  if (self) {
5133*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5134*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
5135*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5136*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5137*6777b538SAndroid Build Coastguard Worker      }
5138*6777b538SAndroid Build Coastguard Worker    }
5139*6777b538SAndroid Build Coastguard Worker  }
5140*6777b538SAndroid Build Coastguard Worker  return self;
5141*6777b538SAndroid Build Coastguard Worker}
5142*6777b538SAndroid Build Coastguard Worker
5143*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64Int32Dictionary *)dictionary {
5144*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
5145*6777b538SAndroid Build Coastguard Worker  if (self) {
5146*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
5147*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5148*6777b538SAndroid Build Coastguard Worker    }
5149*6777b538SAndroid Build Coastguard Worker  }
5150*6777b538SAndroid Build Coastguard Worker  return self;
5151*6777b538SAndroid Build Coastguard Worker}
5152*6777b538SAndroid Build Coastguard Worker
5153*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5154*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
5155*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
5156*6777b538SAndroid Build Coastguard Worker}
5157*6777b538SAndroid Build Coastguard Worker
5158*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
5159*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5160*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5161*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
5162*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
5163*6777b538SAndroid Build Coastguard Worker  [super dealloc];
5164*6777b538SAndroid Build Coastguard Worker}
5165*6777b538SAndroid Build Coastguard Worker
5166*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5167*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self];
5168*6777b538SAndroid Build Coastguard Worker}
5169*6777b538SAndroid Build Coastguard Worker
5170*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5171*6777b538SAndroid Build Coastguard Worker  if (self == other) {
5172*6777b538SAndroid Build Coastguard Worker    return YES;
5173*6777b538SAndroid Build Coastguard Worker  }
5174*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64Int32Dictionary class]]) {
5175*6777b538SAndroid Build Coastguard Worker    return NO;
5176*6777b538SAndroid Build Coastguard Worker  }
5177*6777b538SAndroid Build Coastguard Worker  GPBUInt64Int32Dictionary *otherDictionary = other;
5178*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5179*6777b538SAndroid Build Coastguard Worker}
5180*6777b538SAndroid Build Coastguard Worker
5181*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
5182*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5183*6777b538SAndroid Build Coastguard Worker}
5184*6777b538SAndroid Build Coastguard Worker
5185*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
5186*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5187*6777b538SAndroid Build Coastguard Worker}
5188*6777b538SAndroid Build Coastguard Worker
5189*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
5190*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5191*6777b538SAndroid Build Coastguard Worker}
5192*6777b538SAndroid Build Coastguard Worker
5193*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
5194*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block {
5195*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
5196*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5197*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5198*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5199*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5200*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5201*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue intValue], &stop);
5202*6777b538SAndroid Build Coastguard Worker    if (stop) {
5203*6777b538SAndroid Build Coastguard Worker      break;
5204*6777b538SAndroid Build Coastguard Worker    }
5205*6777b538SAndroid Build Coastguard Worker  }
5206*6777b538SAndroid Build Coastguard Worker}
5207*6777b538SAndroid Build Coastguard Worker
5208*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5209*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5210*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5211*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
5212*6777b538SAndroid Build Coastguard Worker    return 0;
5213*6777b538SAndroid Build Coastguard Worker  }
5214*6777b538SAndroid Build Coastguard Worker
5215*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5216*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5217*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
5218*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5219*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5220*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5221*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5222*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5223*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
5224*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5225*6777b538SAndroid Build Coastguard Worker  }
5226*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5227*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
5228*6777b538SAndroid Build Coastguard Worker  return result;
5229*6777b538SAndroid Build Coastguard Worker}
5230*6777b538SAndroid Build Coastguard Worker
5231*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5232*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5233*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5234*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5235*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5236*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5237*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5238*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5239*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5240*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5241*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5242*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
5243*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5244*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
5245*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5246*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5247*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5248*6777b538SAndroid Build Coastguard Worker    // Write the fields.
5249*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5250*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5251*6777b538SAndroid Build Coastguard Worker  }
5252*6777b538SAndroid Build Coastguard Worker}
5253*6777b538SAndroid Build Coastguard Worker
5254*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5255*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5256*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt64)];
5257*6777b538SAndroid Build Coastguard Worker}
5258*6777b538SAndroid Build Coastguard Worker
5259*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5260*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
5261*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
5262*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%d", value]);
5263*6777b538SAndroid Build Coastguard Worker  }];
5264*6777b538SAndroid Build Coastguard Worker}
5265*6777b538SAndroid Build Coastguard Worker
5266*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint64_t)key {
5267*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5268*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
5269*6777b538SAndroid Build Coastguard Worker    *value = [wrapped intValue];
5270*6777b538SAndroid Build Coastguard Worker  }
5271*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
5272*6777b538SAndroid Build Coastguard Worker}
5273*6777b538SAndroid Build Coastguard Worker
5274*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64Int32Dictionary *)otherDictionary {
5275*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
5276*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5277*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
5278*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5279*6777b538SAndroid Build Coastguard Worker    }
5280*6777b538SAndroid Build Coastguard Worker  }
5281*6777b538SAndroid Build Coastguard Worker}
5282*6777b538SAndroid Build Coastguard Worker
5283*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(uint64_t)key {
5284*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5285*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
5286*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5287*6777b538SAndroid Build Coastguard Worker  }
5288*6777b538SAndroid Build Coastguard Worker}
5289*6777b538SAndroid Build Coastguard Worker
5290*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(uint64_t)aKey {
5291*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5292*6777b538SAndroid Build Coastguard Worker}
5293*6777b538SAndroid Build Coastguard Worker
5294*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
5295*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5296*6777b538SAndroid Build Coastguard Worker}
5297*6777b538SAndroid Build Coastguard Worker
5298*6777b538SAndroid Build Coastguard Worker@end
5299*6777b538SAndroid Build Coastguard Worker
5300*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> UInt64
5301*6777b538SAndroid Build Coastguard Worker
5302*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64UInt64Dictionary {
5303*6777b538SAndroid Build Coastguard Worker @package
5304*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5305*6777b538SAndroid Build Coastguard Worker}
5306*6777b538SAndroid Build Coastguard Worker
5307*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
5308*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
5309*6777b538SAndroid Build Coastguard Worker}
5310*6777b538SAndroid Build Coastguard Worker
5311*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
5312*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
5313*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
5314*6777b538SAndroid Build Coastguard Worker  self = [super init];
5315*6777b538SAndroid Build Coastguard Worker  if (self) {
5316*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5317*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
5318*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5319*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5320*6777b538SAndroid Build Coastguard Worker      }
5321*6777b538SAndroid Build Coastguard Worker    }
5322*6777b538SAndroid Build Coastguard Worker  }
5323*6777b538SAndroid Build Coastguard Worker  return self;
5324*6777b538SAndroid Build Coastguard Worker}
5325*6777b538SAndroid Build Coastguard Worker
5326*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary {
5327*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
5328*6777b538SAndroid Build Coastguard Worker  if (self) {
5329*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
5330*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5331*6777b538SAndroid Build Coastguard Worker    }
5332*6777b538SAndroid Build Coastguard Worker  }
5333*6777b538SAndroid Build Coastguard Worker  return self;
5334*6777b538SAndroid Build Coastguard Worker}
5335*6777b538SAndroid Build Coastguard Worker
5336*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5337*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
5338*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
5339*6777b538SAndroid Build Coastguard Worker}
5340*6777b538SAndroid Build Coastguard Worker
5341*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
5342*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5343*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5344*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
5345*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
5346*6777b538SAndroid Build Coastguard Worker  [super dealloc];
5347*6777b538SAndroid Build Coastguard Worker}
5348*6777b538SAndroid Build Coastguard Worker
5349*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5350*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
5351*6777b538SAndroid Build Coastguard Worker}
5352*6777b538SAndroid Build Coastguard Worker
5353*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5354*6777b538SAndroid Build Coastguard Worker  if (self == other) {
5355*6777b538SAndroid Build Coastguard Worker    return YES;
5356*6777b538SAndroid Build Coastguard Worker  }
5357*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64UInt64Dictionary class]]) {
5358*6777b538SAndroid Build Coastguard Worker    return NO;
5359*6777b538SAndroid Build Coastguard Worker  }
5360*6777b538SAndroid Build Coastguard Worker  GPBUInt64UInt64Dictionary *otherDictionary = other;
5361*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5362*6777b538SAndroid Build Coastguard Worker}
5363*6777b538SAndroid Build Coastguard Worker
5364*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
5365*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5366*6777b538SAndroid Build Coastguard Worker}
5367*6777b538SAndroid Build Coastguard Worker
5368*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
5369*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5370*6777b538SAndroid Build Coastguard Worker}
5371*6777b538SAndroid Build Coastguard Worker
5372*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
5373*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5374*6777b538SAndroid Build Coastguard Worker}
5375*6777b538SAndroid Build Coastguard Worker
5376*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
5377*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, uint64_t value, BOOL *stop))block {
5378*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
5379*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5380*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5381*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5382*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5383*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5384*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue unsignedLongLongValue], &stop);
5385*6777b538SAndroid Build Coastguard Worker    if (stop) {
5386*6777b538SAndroid Build Coastguard Worker      break;
5387*6777b538SAndroid Build Coastguard Worker    }
5388*6777b538SAndroid Build Coastguard Worker  }
5389*6777b538SAndroid Build Coastguard Worker}
5390*6777b538SAndroid Build Coastguard Worker
5391*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5392*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5393*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5394*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
5395*6777b538SAndroid Build Coastguard Worker    return 0;
5396*6777b538SAndroid Build Coastguard Worker  }
5397*6777b538SAndroid Build Coastguard Worker
5398*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5399*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5400*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
5401*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5402*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5403*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5404*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5405*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5406*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
5407*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5408*6777b538SAndroid Build Coastguard Worker  }
5409*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5410*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
5411*6777b538SAndroid Build Coastguard Worker  return result;
5412*6777b538SAndroid Build Coastguard Worker}
5413*6777b538SAndroid Build Coastguard Worker
5414*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5415*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5416*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5417*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5418*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5419*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5420*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5421*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5422*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5423*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5424*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5425*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
5426*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5427*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
5428*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5429*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5430*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5431*6777b538SAndroid Build Coastguard Worker    // Write the fields.
5432*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5433*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5434*6777b538SAndroid Build Coastguard Worker  }
5435*6777b538SAndroid Build Coastguard Worker}
5436*6777b538SAndroid Build Coastguard Worker
5437*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5438*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5439*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt64)];
5440*6777b538SAndroid Build Coastguard Worker}
5441*6777b538SAndroid Build Coastguard Worker
5442*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5443*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(uint64_t key, uint64_t value, BOOL *stop) {
5444*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
5445*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%llu", value]);
5446*6777b538SAndroid Build Coastguard Worker  }];
5447*6777b538SAndroid Build Coastguard Worker}
5448*6777b538SAndroid Build Coastguard Worker
5449*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint64_t)key {
5450*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5451*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
5452*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
5453*6777b538SAndroid Build Coastguard Worker  }
5454*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
5455*6777b538SAndroid Build Coastguard Worker}
5456*6777b538SAndroid Build Coastguard Worker
5457*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64UInt64Dictionary *)otherDictionary {
5458*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
5459*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5460*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
5461*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5462*6777b538SAndroid Build Coastguard Worker    }
5463*6777b538SAndroid Build Coastguard Worker  }
5464*6777b538SAndroid Build Coastguard Worker}
5465*6777b538SAndroid Build Coastguard Worker
5466*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(uint64_t)key {
5467*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5468*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
5469*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5470*6777b538SAndroid Build Coastguard Worker  }
5471*6777b538SAndroid Build Coastguard Worker}
5472*6777b538SAndroid Build Coastguard Worker
5473*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(uint64_t)aKey {
5474*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5475*6777b538SAndroid Build Coastguard Worker}
5476*6777b538SAndroid Build Coastguard Worker
5477*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
5478*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5479*6777b538SAndroid Build Coastguard Worker}
5480*6777b538SAndroid Build Coastguard Worker
5481*6777b538SAndroid Build Coastguard Worker@end
5482*6777b538SAndroid Build Coastguard Worker
5483*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Int64
5484*6777b538SAndroid Build Coastguard Worker
5485*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64Int64Dictionary {
5486*6777b538SAndroid Build Coastguard Worker @package
5487*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5488*6777b538SAndroid Build Coastguard Worker}
5489*6777b538SAndroid Build Coastguard Worker
5490*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
5491*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
5492*6777b538SAndroid Build Coastguard Worker}
5493*6777b538SAndroid Build Coastguard Worker
5494*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
5495*6777b538SAndroid Build Coastguard Worker                       forKeys:(const uint64_t [])keys
5496*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
5497*6777b538SAndroid Build Coastguard Worker  self = [super init];
5498*6777b538SAndroid Build Coastguard Worker  if (self) {
5499*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5500*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
5501*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5502*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5503*6777b538SAndroid Build Coastguard Worker      }
5504*6777b538SAndroid Build Coastguard Worker    }
5505*6777b538SAndroid Build Coastguard Worker  }
5506*6777b538SAndroid Build Coastguard Worker  return self;
5507*6777b538SAndroid Build Coastguard Worker}
5508*6777b538SAndroid Build Coastguard Worker
5509*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64Int64Dictionary *)dictionary {
5510*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
5511*6777b538SAndroid Build Coastguard Worker  if (self) {
5512*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
5513*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5514*6777b538SAndroid Build Coastguard Worker    }
5515*6777b538SAndroid Build Coastguard Worker  }
5516*6777b538SAndroid Build Coastguard Worker  return self;
5517*6777b538SAndroid Build Coastguard Worker}
5518*6777b538SAndroid Build Coastguard Worker
5519*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5520*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
5521*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
5522*6777b538SAndroid Build Coastguard Worker}
5523*6777b538SAndroid Build Coastguard Worker
5524*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
5525*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5526*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5527*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
5528*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
5529*6777b538SAndroid Build Coastguard Worker  [super dealloc];
5530*6777b538SAndroid Build Coastguard Worker}
5531*6777b538SAndroid Build Coastguard Worker
5532*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5533*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self];
5534*6777b538SAndroid Build Coastguard Worker}
5535*6777b538SAndroid Build Coastguard Worker
5536*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5537*6777b538SAndroid Build Coastguard Worker  if (self == other) {
5538*6777b538SAndroid Build Coastguard Worker    return YES;
5539*6777b538SAndroid Build Coastguard Worker  }
5540*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64Int64Dictionary class]]) {
5541*6777b538SAndroid Build Coastguard Worker    return NO;
5542*6777b538SAndroid Build Coastguard Worker  }
5543*6777b538SAndroid Build Coastguard Worker  GPBUInt64Int64Dictionary *otherDictionary = other;
5544*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5545*6777b538SAndroid Build Coastguard Worker}
5546*6777b538SAndroid Build Coastguard Worker
5547*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
5548*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5549*6777b538SAndroid Build Coastguard Worker}
5550*6777b538SAndroid Build Coastguard Worker
5551*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
5552*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5553*6777b538SAndroid Build Coastguard Worker}
5554*6777b538SAndroid Build Coastguard Worker
5555*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
5556*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5557*6777b538SAndroid Build Coastguard Worker}
5558*6777b538SAndroid Build Coastguard Worker
5559*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
5560*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int64_t value, BOOL *stop))block {
5561*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
5562*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5563*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5564*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5565*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5566*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5567*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue longLongValue], &stop);
5568*6777b538SAndroid Build Coastguard Worker    if (stop) {
5569*6777b538SAndroid Build Coastguard Worker      break;
5570*6777b538SAndroid Build Coastguard Worker    }
5571*6777b538SAndroid Build Coastguard Worker  }
5572*6777b538SAndroid Build Coastguard Worker}
5573*6777b538SAndroid Build Coastguard Worker
5574*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5575*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5576*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5577*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
5578*6777b538SAndroid Build Coastguard Worker    return 0;
5579*6777b538SAndroid Build Coastguard Worker  }
5580*6777b538SAndroid Build Coastguard Worker
5581*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5582*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5583*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
5584*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5585*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5586*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5587*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5588*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5589*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
5590*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5591*6777b538SAndroid Build Coastguard Worker  }
5592*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5593*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
5594*6777b538SAndroid Build Coastguard Worker  return result;
5595*6777b538SAndroid Build Coastguard Worker}
5596*6777b538SAndroid Build Coastguard Worker
5597*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5598*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5599*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5600*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5601*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5602*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5603*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5604*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5605*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5606*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5607*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5608*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
5609*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5610*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
5611*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5612*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5613*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5614*6777b538SAndroid Build Coastguard Worker    // Write the fields.
5615*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5616*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5617*6777b538SAndroid Build Coastguard Worker  }
5618*6777b538SAndroid Build Coastguard Worker}
5619*6777b538SAndroid Build Coastguard Worker
5620*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5621*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5622*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt64)];
5623*6777b538SAndroid Build Coastguard Worker}
5624*6777b538SAndroid Build Coastguard Worker
5625*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5626*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(uint64_t key, int64_t value, BOOL *stop) {
5627*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
5628*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%lld", value]);
5629*6777b538SAndroid Build Coastguard Worker  }];
5630*6777b538SAndroid Build Coastguard Worker}
5631*6777b538SAndroid Build Coastguard Worker
5632*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint64_t)key {
5633*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5634*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
5635*6777b538SAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
5636*6777b538SAndroid Build Coastguard Worker  }
5637*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
5638*6777b538SAndroid Build Coastguard Worker}
5639*6777b538SAndroid Build Coastguard Worker
5640*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64Int64Dictionary *)otherDictionary {
5641*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
5642*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5643*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
5644*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5645*6777b538SAndroid Build Coastguard Worker    }
5646*6777b538SAndroid Build Coastguard Worker  }
5647*6777b538SAndroid Build Coastguard Worker}
5648*6777b538SAndroid Build Coastguard Worker
5649*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(uint64_t)key {
5650*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5651*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
5652*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5653*6777b538SAndroid Build Coastguard Worker  }
5654*6777b538SAndroid Build Coastguard Worker}
5655*6777b538SAndroid Build Coastguard Worker
5656*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(uint64_t)aKey {
5657*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5658*6777b538SAndroid Build Coastguard Worker}
5659*6777b538SAndroid Build Coastguard Worker
5660*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
5661*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5662*6777b538SAndroid Build Coastguard Worker}
5663*6777b538SAndroid Build Coastguard Worker
5664*6777b538SAndroid Build Coastguard Worker@end
5665*6777b538SAndroid Build Coastguard Worker
5666*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Bool
5667*6777b538SAndroid Build Coastguard Worker
5668*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64BoolDictionary {
5669*6777b538SAndroid Build Coastguard Worker @package
5670*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5671*6777b538SAndroid Build Coastguard Worker}
5672*6777b538SAndroid Build Coastguard Worker
5673*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
5674*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
5675*6777b538SAndroid Build Coastguard Worker}
5676*6777b538SAndroid Build Coastguard Worker
5677*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
5678*6777b538SAndroid Build Coastguard Worker                      forKeys:(const uint64_t [])keys
5679*6777b538SAndroid Build Coastguard Worker                        count:(NSUInteger)count {
5680*6777b538SAndroid Build Coastguard Worker  self = [super init];
5681*6777b538SAndroid Build Coastguard Worker  if (self) {
5682*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5683*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
5684*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5685*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5686*6777b538SAndroid Build Coastguard Worker      }
5687*6777b538SAndroid Build Coastguard Worker    }
5688*6777b538SAndroid Build Coastguard Worker  }
5689*6777b538SAndroid Build Coastguard Worker  return self;
5690*6777b538SAndroid Build Coastguard Worker}
5691*6777b538SAndroid Build Coastguard Worker
5692*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64BoolDictionary *)dictionary {
5693*6777b538SAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
5694*6777b538SAndroid Build Coastguard Worker  if (self) {
5695*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
5696*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5697*6777b538SAndroid Build Coastguard Worker    }
5698*6777b538SAndroid Build Coastguard Worker  }
5699*6777b538SAndroid Build Coastguard Worker  return self;
5700*6777b538SAndroid Build Coastguard Worker}
5701*6777b538SAndroid Build Coastguard Worker
5702*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5703*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
5704*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
5705*6777b538SAndroid Build Coastguard Worker}
5706*6777b538SAndroid Build Coastguard Worker
5707*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
5708*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5709*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5710*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
5711*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
5712*6777b538SAndroid Build Coastguard Worker  [super dealloc];
5713*6777b538SAndroid Build Coastguard Worker}
5714*6777b538SAndroid Build Coastguard Worker
5715*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5716*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
5717*6777b538SAndroid Build Coastguard Worker}
5718*6777b538SAndroid Build Coastguard Worker
5719*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5720*6777b538SAndroid Build Coastguard Worker  if (self == other) {
5721*6777b538SAndroid Build Coastguard Worker    return YES;
5722*6777b538SAndroid Build Coastguard Worker  }
5723*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64BoolDictionary class]]) {
5724*6777b538SAndroid Build Coastguard Worker    return NO;
5725*6777b538SAndroid Build Coastguard Worker  }
5726*6777b538SAndroid Build Coastguard Worker  GPBUInt64BoolDictionary *otherDictionary = other;
5727*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5728*6777b538SAndroid Build Coastguard Worker}
5729*6777b538SAndroid Build Coastguard Worker
5730*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
5731*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5732*6777b538SAndroid Build Coastguard Worker}
5733*6777b538SAndroid Build Coastguard Worker
5734*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
5735*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5736*6777b538SAndroid Build Coastguard Worker}
5737*6777b538SAndroid Build Coastguard Worker
5738*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
5739*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5740*6777b538SAndroid Build Coastguard Worker}
5741*6777b538SAndroid Build Coastguard Worker
5742*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
5743*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, BOOL value, BOOL *stop))block {
5744*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
5745*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5746*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5747*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5748*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5749*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5750*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue boolValue], &stop);
5751*6777b538SAndroid Build Coastguard Worker    if (stop) {
5752*6777b538SAndroid Build Coastguard Worker      break;
5753*6777b538SAndroid Build Coastguard Worker    }
5754*6777b538SAndroid Build Coastguard Worker  }
5755*6777b538SAndroid Build Coastguard Worker}
5756*6777b538SAndroid Build Coastguard Worker
5757*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5758*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5759*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5760*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
5761*6777b538SAndroid Build Coastguard Worker    return 0;
5762*6777b538SAndroid Build Coastguard Worker  }
5763*6777b538SAndroid Build Coastguard Worker
5764*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5765*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5766*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
5767*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5768*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5769*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5770*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5771*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5772*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
5773*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5774*6777b538SAndroid Build Coastguard Worker  }
5775*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5776*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
5777*6777b538SAndroid Build Coastguard Worker  return result;
5778*6777b538SAndroid Build Coastguard Worker}
5779*6777b538SAndroid Build Coastguard Worker
5780*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5781*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5782*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5783*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5784*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5785*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5786*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5787*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5788*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5789*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5790*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5791*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
5792*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5793*6777b538SAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
5794*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5795*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5796*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5797*6777b538SAndroid Build Coastguard Worker    // Write the fields.
5798*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5799*6777b538SAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5800*6777b538SAndroid Build Coastguard Worker  }
5801*6777b538SAndroid Build Coastguard Worker}
5802*6777b538SAndroid Build Coastguard Worker
5803*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5804*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5805*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt64)];
5806*6777b538SAndroid Build Coastguard Worker}
5807*6777b538SAndroid Build Coastguard Worker
5808*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5809*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(uint64_t key, BOOL value, BOOL *stop) {
5810*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
5811*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], (value ? @"true" : @"false"));
5812*6777b538SAndroid Build Coastguard Worker  }];
5813*6777b538SAndroid Build Coastguard Worker}
5814*6777b538SAndroid Build Coastguard Worker
5815*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(uint64_t)key {
5816*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5817*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
5818*6777b538SAndroid Build Coastguard Worker    *value = [wrapped boolValue];
5819*6777b538SAndroid Build Coastguard Worker  }
5820*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
5821*6777b538SAndroid Build Coastguard Worker}
5822*6777b538SAndroid Build Coastguard Worker
5823*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64BoolDictionary *)otherDictionary {
5824*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
5825*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5826*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
5827*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5828*6777b538SAndroid Build Coastguard Worker    }
5829*6777b538SAndroid Build Coastguard Worker  }
5830*6777b538SAndroid Build Coastguard Worker}
5831*6777b538SAndroid Build Coastguard Worker
5832*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(uint64_t)key {
5833*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5834*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
5835*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5836*6777b538SAndroid Build Coastguard Worker  }
5837*6777b538SAndroid Build Coastguard Worker}
5838*6777b538SAndroid Build Coastguard Worker
5839*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(uint64_t)aKey {
5840*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5841*6777b538SAndroid Build Coastguard Worker}
5842*6777b538SAndroid Build Coastguard Worker
5843*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
5844*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5845*6777b538SAndroid Build Coastguard Worker}
5846*6777b538SAndroid Build Coastguard Worker
5847*6777b538SAndroid Build Coastguard Worker@end
5848*6777b538SAndroid Build Coastguard Worker
5849*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Float
5850*6777b538SAndroid Build Coastguard Worker
5851*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64FloatDictionary {
5852*6777b538SAndroid Build Coastguard Worker @package
5853*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5854*6777b538SAndroid Build Coastguard Worker}
5855*6777b538SAndroid Build Coastguard Worker
5856*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
5857*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
5858*6777b538SAndroid Build Coastguard Worker}
5859*6777b538SAndroid Build Coastguard Worker
5860*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
5861*6777b538SAndroid Build Coastguard Worker                       forKeys:(const uint64_t [])keys
5862*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
5863*6777b538SAndroid Build Coastguard Worker  self = [super init];
5864*6777b538SAndroid Build Coastguard Worker  if (self) {
5865*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5866*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
5867*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5868*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5869*6777b538SAndroid Build Coastguard Worker      }
5870*6777b538SAndroid Build Coastguard Worker    }
5871*6777b538SAndroid Build Coastguard Worker  }
5872*6777b538SAndroid Build Coastguard Worker  return self;
5873*6777b538SAndroid Build Coastguard Worker}
5874*6777b538SAndroid Build Coastguard Worker
5875*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64FloatDictionary *)dictionary {
5876*6777b538SAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
5877*6777b538SAndroid Build Coastguard Worker  if (self) {
5878*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
5879*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5880*6777b538SAndroid Build Coastguard Worker    }
5881*6777b538SAndroid Build Coastguard Worker  }
5882*6777b538SAndroid Build Coastguard Worker  return self;
5883*6777b538SAndroid Build Coastguard Worker}
5884*6777b538SAndroid Build Coastguard Worker
5885*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5886*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
5887*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
5888*6777b538SAndroid Build Coastguard Worker}
5889*6777b538SAndroid Build Coastguard Worker
5890*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
5891*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5892*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5893*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
5894*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
5895*6777b538SAndroid Build Coastguard Worker  [super dealloc];
5896*6777b538SAndroid Build Coastguard Worker}
5897*6777b538SAndroid Build Coastguard Worker
5898*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5899*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64FloatDictionary allocWithZone:zone] initWithDictionary:self];
5900*6777b538SAndroid Build Coastguard Worker}
5901*6777b538SAndroid Build Coastguard Worker
5902*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5903*6777b538SAndroid Build Coastguard Worker  if (self == other) {
5904*6777b538SAndroid Build Coastguard Worker    return YES;
5905*6777b538SAndroid Build Coastguard Worker  }
5906*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64FloatDictionary class]]) {
5907*6777b538SAndroid Build Coastguard Worker    return NO;
5908*6777b538SAndroid Build Coastguard Worker  }
5909*6777b538SAndroid Build Coastguard Worker  GPBUInt64FloatDictionary *otherDictionary = other;
5910*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5911*6777b538SAndroid Build Coastguard Worker}
5912*6777b538SAndroid Build Coastguard Worker
5913*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
5914*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5915*6777b538SAndroid Build Coastguard Worker}
5916*6777b538SAndroid Build Coastguard Worker
5917*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
5918*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5919*6777b538SAndroid Build Coastguard Worker}
5920*6777b538SAndroid Build Coastguard Worker
5921*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
5922*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
5923*6777b538SAndroid Build Coastguard Worker}
5924*6777b538SAndroid Build Coastguard Worker
5925*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
5926*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, float value, BOOL *stop))block {
5927*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
5928*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5929*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5930*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5931*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5932*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5933*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue floatValue], &stop);
5934*6777b538SAndroid Build Coastguard Worker    if (stop) {
5935*6777b538SAndroid Build Coastguard Worker      break;
5936*6777b538SAndroid Build Coastguard Worker    }
5937*6777b538SAndroid Build Coastguard Worker  }
5938*6777b538SAndroid Build Coastguard Worker}
5939*6777b538SAndroid Build Coastguard Worker
5940*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5941*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5942*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5943*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
5944*6777b538SAndroid Build Coastguard Worker    return 0;
5945*6777b538SAndroid Build Coastguard Worker  }
5946*6777b538SAndroid Build Coastguard Worker
5947*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5948*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5949*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
5950*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5951*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5952*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5953*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5954*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5955*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
5956*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5957*6777b538SAndroid Build Coastguard Worker  }
5958*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5959*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
5960*6777b538SAndroid Build Coastguard Worker  return result;
5961*6777b538SAndroid Build Coastguard Worker}
5962*6777b538SAndroid Build Coastguard Worker
5963*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5964*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5965*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5966*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5967*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5968*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5969*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5970*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
5971*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5972*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5973*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5974*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
5975*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5976*6777b538SAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
5977*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5978*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5979*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5980*6777b538SAndroid Build Coastguard Worker    // Write the fields.
5981*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5982*6777b538SAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5983*6777b538SAndroid Build Coastguard Worker  }
5984*6777b538SAndroid Build Coastguard Worker}
5985*6777b538SAndroid Build Coastguard Worker
5986*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5987*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5988*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt64)];
5989*6777b538SAndroid Build Coastguard Worker}
5990*6777b538SAndroid Build Coastguard Worker
5991*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5992*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(uint64_t key, float value, BOOL *stop) {
5993*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
5994*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
5995*6777b538SAndroid Build Coastguard Worker  }];
5996*6777b538SAndroid Build Coastguard Worker}
5997*6777b538SAndroid Build Coastguard Worker
5998*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(uint64_t)key {
5999*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6000*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
6001*6777b538SAndroid Build Coastguard Worker    *value = [wrapped floatValue];
6002*6777b538SAndroid Build Coastguard Worker  }
6003*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
6004*6777b538SAndroid Build Coastguard Worker}
6005*6777b538SAndroid Build Coastguard Worker
6006*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64FloatDictionary *)otherDictionary {
6007*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
6008*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6009*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
6010*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6011*6777b538SAndroid Build Coastguard Worker    }
6012*6777b538SAndroid Build Coastguard Worker  }
6013*6777b538SAndroid Build Coastguard Worker}
6014*6777b538SAndroid Build Coastguard Worker
6015*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(uint64_t)key {
6016*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6017*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
6018*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6019*6777b538SAndroid Build Coastguard Worker  }
6020*6777b538SAndroid Build Coastguard Worker}
6021*6777b538SAndroid Build Coastguard Worker
6022*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(uint64_t)aKey {
6023*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6024*6777b538SAndroid Build Coastguard Worker}
6025*6777b538SAndroid Build Coastguard Worker
6026*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
6027*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6028*6777b538SAndroid Build Coastguard Worker}
6029*6777b538SAndroid Build Coastguard Worker
6030*6777b538SAndroid Build Coastguard Worker@end
6031*6777b538SAndroid Build Coastguard Worker
6032*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Double
6033*6777b538SAndroid Build Coastguard Worker
6034*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64DoubleDictionary {
6035*6777b538SAndroid Build Coastguard Worker @package
6036*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6037*6777b538SAndroid Build Coastguard Worker}
6038*6777b538SAndroid Build Coastguard Worker
6039*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
6040*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
6041*6777b538SAndroid Build Coastguard Worker}
6042*6777b538SAndroid Build Coastguard Worker
6043*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
6044*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
6045*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
6046*6777b538SAndroid Build Coastguard Worker  self = [super init];
6047*6777b538SAndroid Build Coastguard Worker  if (self) {
6048*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6049*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
6050*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6051*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6052*6777b538SAndroid Build Coastguard Worker      }
6053*6777b538SAndroid Build Coastguard Worker    }
6054*6777b538SAndroid Build Coastguard Worker  }
6055*6777b538SAndroid Build Coastguard Worker  return self;
6056*6777b538SAndroid Build Coastguard Worker}
6057*6777b538SAndroid Build Coastguard Worker
6058*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64DoubleDictionary *)dictionary {
6059*6777b538SAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
6060*6777b538SAndroid Build Coastguard Worker  if (self) {
6061*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
6062*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6063*6777b538SAndroid Build Coastguard Worker    }
6064*6777b538SAndroid Build Coastguard Worker  }
6065*6777b538SAndroid Build Coastguard Worker  return self;
6066*6777b538SAndroid Build Coastguard Worker}
6067*6777b538SAndroid Build Coastguard Worker
6068*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6069*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
6070*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
6071*6777b538SAndroid Build Coastguard Worker}
6072*6777b538SAndroid Build Coastguard Worker
6073*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
6074*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6075*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6076*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
6077*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
6078*6777b538SAndroid Build Coastguard Worker  [super dealloc];
6079*6777b538SAndroid Build Coastguard Worker}
6080*6777b538SAndroid Build Coastguard Worker
6081*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6082*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self];
6083*6777b538SAndroid Build Coastguard Worker}
6084*6777b538SAndroid Build Coastguard Worker
6085*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6086*6777b538SAndroid Build Coastguard Worker  if (self == other) {
6087*6777b538SAndroid Build Coastguard Worker    return YES;
6088*6777b538SAndroid Build Coastguard Worker  }
6089*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64DoubleDictionary class]]) {
6090*6777b538SAndroid Build Coastguard Worker    return NO;
6091*6777b538SAndroid Build Coastguard Worker  }
6092*6777b538SAndroid Build Coastguard Worker  GPBUInt64DoubleDictionary *otherDictionary = other;
6093*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6094*6777b538SAndroid Build Coastguard Worker}
6095*6777b538SAndroid Build Coastguard Worker
6096*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
6097*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6098*6777b538SAndroid Build Coastguard Worker}
6099*6777b538SAndroid Build Coastguard Worker
6100*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
6101*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6102*6777b538SAndroid Build Coastguard Worker}
6103*6777b538SAndroid Build Coastguard Worker
6104*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
6105*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6106*6777b538SAndroid Build Coastguard Worker}
6107*6777b538SAndroid Build Coastguard Worker
6108*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
6109*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, double value, BOOL *stop))block {
6110*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
6111*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6112*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6113*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6114*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6115*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6116*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue doubleValue], &stop);
6117*6777b538SAndroid Build Coastguard Worker    if (stop) {
6118*6777b538SAndroid Build Coastguard Worker      break;
6119*6777b538SAndroid Build Coastguard Worker    }
6120*6777b538SAndroid Build Coastguard Worker  }
6121*6777b538SAndroid Build Coastguard Worker}
6122*6777b538SAndroid Build Coastguard Worker
6123*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6124*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6125*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6126*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
6127*6777b538SAndroid Build Coastguard Worker    return 0;
6128*6777b538SAndroid Build Coastguard Worker  }
6129*6777b538SAndroid Build Coastguard Worker
6130*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6131*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6132*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
6133*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6134*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6135*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6136*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6137*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
6138*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
6139*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6140*6777b538SAndroid Build Coastguard Worker  }
6141*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6142*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
6143*6777b538SAndroid Build Coastguard Worker  return result;
6144*6777b538SAndroid Build Coastguard Worker}
6145*6777b538SAndroid Build Coastguard Worker
6146*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6147*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6148*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6149*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6150*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6151*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6152*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6153*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6154*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6155*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6156*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6157*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
6158*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
6159*6777b538SAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
6160*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6161*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6162*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6163*6777b538SAndroid Build Coastguard Worker    // Write the fields.
6164*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6165*6777b538SAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6166*6777b538SAndroid Build Coastguard Worker  }
6167*6777b538SAndroid Build Coastguard Worker}
6168*6777b538SAndroid Build Coastguard Worker
6169*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6170*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6171*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt64)];
6172*6777b538SAndroid Build Coastguard Worker}
6173*6777b538SAndroid Build Coastguard Worker
6174*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6175*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(uint64_t key, double value, BOOL *stop) {
6176*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
6177*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
6178*6777b538SAndroid Build Coastguard Worker  }];
6179*6777b538SAndroid Build Coastguard Worker}
6180*6777b538SAndroid Build Coastguard Worker
6181*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(uint64_t)key {
6182*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6183*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
6184*6777b538SAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
6185*6777b538SAndroid Build Coastguard Worker  }
6186*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
6187*6777b538SAndroid Build Coastguard Worker}
6188*6777b538SAndroid Build Coastguard Worker
6189*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64DoubleDictionary *)otherDictionary {
6190*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
6191*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6192*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
6193*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6194*6777b538SAndroid Build Coastguard Worker    }
6195*6777b538SAndroid Build Coastguard Worker  }
6196*6777b538SAndroid Build Coastguard Worker}
6197*6777b538SAndroid Build Coastguard Worker
6198*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(uint64_t)key {
6199*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6200*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
6201*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6202*6777b538SAndroid Build Coastguard Worker  }
6203*6777b538SAndroid Build Coastguard Worker}
6204*6777b538SAndroid Build Coastguard Worker
6205*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(uint64_t)aKey {
6206*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6207*6777b538SAndroid Build Coastguard Worker}
6208*6777b538SAndroid Build Coastguard Worker
6209*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
6210*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6211*6777b538SAndroid Build Coastguard Worker}
6212*6777b538SAndroid Build Coastguard Worker
6213*6777b538SAndroid Build Coastguard Worker@end
6214*6777b538SAndroid Build Coastguard Worker
6215*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Enum
6216*6777b538SAndroid Build Coastguard Worker
6217*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64EnumDictionary {
6218*6777b538SAndroid Build Coastguard Worker @package
6219*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6220*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
6221*6777b538SAndroid Build Coastguard Worker}
6222*6777b538SAndroid Build Coastguard Worker
6223*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
6224*6777b538SAndroid Build Coastguard Worker
6225*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
6226*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
6227*6777b538SAndroid Build Coastguard Worker}
6228*6777b538SAndroid Build Coastguard Worker
6229*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
6230*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
6231*6777b538SAndroid Build Coastguard Worker}
6232*6777b538SAndroid Build Coastguard Worker
6233*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
6234*6777b538SAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
6235*6777b538SAndroid Build Coastguard Worker                                   forKeys:(const uint64_t [])keys
6236*6777b538SAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
6237*6777b538SAndroid Build Coastguard Worker  self = [super init];
6238*6777b538SAndroid Build Coastguard Worker  if (self) {
6239*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6240*6777b538SAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
6241*6777b538SAndroid Build Coastguard Worker    if (count && rawValues && keys) {
6242*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6243*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
6244*6777b538SAndroid Build Coastguard Worker      }
6245*6777b538SAndroid Build Coastguard Worker    }
6246*6777b538SAndroid Build Coastguard Worker  }
6247*6777b538SAndroid Build Coastguard Worker  return self;
6248*6777b538SAndroid Build Coastguard Worker}
6249*6777b538SAndroid Build Coastguard Worker
6250*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64EnumDictionary *)dictionary {
6251*6777b538SAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
6252*6777b538SAndroid Build Coastguard Worker                                rawValues:NULL
6253*6777b538SAndroid Build Coastguard Worker                                  forKeys:NULL
6254*6777b538SAndroid Build Coastguard Worker                                    count:0];
6255*6777b538SAndroid Build Coastguard Worker  if (self) {
6256*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
6257*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6258*6777b538SAndroid Build Coastguard Worker    }
6259*6777b538SAndroid Build Coastguard Worker  }
6260*6777b538SAndroid Build Coastguard Worker  return self;
6261*6777b538SAndroid Build Coastguard Worker}
6262*6777b538SAndroid Build Coastguard Worker
6263*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
6264*6777b538SAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
6265*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
6266*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
6267*6777b538SAndroid Build Coastguard Worker}
6268*6777b538SAndroid Build Coastguard Worker
6269*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
6270*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6271*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6272*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
6273*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
6274*6777b538SAndroid Build Coastguard Worker  [super dealloc];
6275*6777b538SAndroid Build Coastguard Worker}
6276*6777b538SAndroid Build Coastguard Worker
6277*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6278*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
6279*6777b538SAndroid Build Coastguard Worker}
6280*6777b538SAndroid Build Coastguard Worker
6281*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6282*6777b538SAndroid Build Coastguard Worker  if (self == other) {
6283*6777b538SAndroid Build Coastguard Worker    return YES;
6284*6777b538SAndroid Build Coastguard Worker  }
6285*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64EnumDictionary class]]) {
6286*6777b538SAndroid Build Coastguard Worker    return NO;
6287*6777b538SAndroid Build Coastguard Worker  }
6288*6777b538SAndroid Build Coastguard Worker  GPBUInt64EnumDictionary *otherDictionary = other;
6289*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6290*6777b538SAndroid Build Coastguard Worker}
6291*6777b538SAndroid Build Coastguard Worker
6292*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
6293*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6294*6777b538SAndroid Build Coastguard Worker}
6295*6777b538SAndroid Build Coastguard Worker
6296*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
6297*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6298*6777b538SAndroid Build Coastguard Worker}
6299*6777b538SAndroid Build Coastguard Worker
6300*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
6301*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6302*6777b538SAndroid Build Coastguard Worker}
6303*6777b538SAndroid Build Coastguard Worker
6304*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
6305*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block {
6306*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
6307*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6308*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6309*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6310*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6311*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6312*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue intValue], &stop);
6313*6777b538SAndroid Build Coastguard Worker    if (stop) {
6314*6777b538SAndroid Build Coastguard Worker      break;
6315*6777b538SAndroid Build Coastguard Worker    }
6316*6777b538SAndroid Build Coastguard Worker  }
6317*6777b538SAndroid Build Coastguard Worker}
6318*6777b538SAndroid Build Coastguard Worker
6319*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6320*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6321*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6322*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
6323*6777b538SAndroid Build Coastguard Worker    return 0;
6324*6777b538SAndroid Build Coastguard Worker  }
6325*6777b538SAndroid Build Coastguard Worker
6326*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6327*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6328*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
6329*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6330*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6331*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6332*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6333*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
6334*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
6335*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6336*6777b538SAndroid Build Coastguard Worker  }
6337*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6338*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
6339*6777b538SAndroid Build Coastguard Worker  return result;
6340*6777b538SAndroid Build Coastguard Worker}
6341*6777b538SAndroid Build Coastguard Worker
6342*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6343*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6344*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6345*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6346*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6347*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6348*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6349*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6350*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6351*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6352*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6353*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
6354*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
6355*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
6356*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6357*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6358*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6359*6777b538SAndroid Build Coastguard Worker    // Write the fields.
6360*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6361*6777b538SAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6362*6777b538SAndroid Build Coastguard Worker  }
6363*6777b538SAndroid Build Coastguard Worker}
6364*6777b538SAndroid Build Coastguard Worker
6365*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
6366*6777b538SAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
6367*6777b538SAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
6368*6777b538SAndroid Build Coastguard Worker  size_t msgSize = ComputeDictUInt64FieldSize(key->valueUInt64, kMapKeyFieldNumber, keyDataType);
6369*6777b538SAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
6370*6777b538SAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
6371*6777b538SAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
6372*6777b538SAndroid Build Coastguard Worker  WriteDictUInt64Field(outputStream, key->valueUInt64, kMapKeyFieldNumber, keyDataType);
6373*6777b538SAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
6374*6777b538SAndroid Build Coastguard Worker  [outputStream release];
6375*6777b538SAndroid Build Coastguard Worker  return data;
6376*6777b538SAndroid Build Coastguard Worker}
6377*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6378*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6379*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt64)];
6380*6777b538SAndroid Build Coastguard Worker}
6381*6777b538SAndroid Build Coastguard Worker
6382*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6383*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
6384*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
6385*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], @(value));
6386*6777b538SAndroid Build Coastguard Worker  }];
6387*6777b538SAndroid Build Coastguard Worker}
6388*6777b538SAndroid Build Coastguard Worker
6389*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(uint64_t)key {
6390*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6391*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
6392*6777b538SAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
6393*6777b538SAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
6394*6777b538SAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
6395*6777b538SAndroid Build Coastguard Worker    }
6396*6777b538SAndroid Build Coastguard Worker    *value = result;
6397*6777b538SAndroid Build Coastguard Worker  }
6398*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
6399*6777b538SAndroid Build Coastguard Worker}
6400*6777b538SAndroid Build Coastguard Worker
6401*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint64_t)key {
6402*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6403*6777b538SAndroid Build Coastguard Worker  if (wrapped && rawValue) {
6404*6777b538SAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
6405*6777b538SAndroid Build Coastguard Worker  }
6406*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
6407*6777b538SAndroid Build Coastguard Worker}
6408*6777b538SAndroid Build Coastguard Worker
6409*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
6410*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block {
6411*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
6412*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
6413*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
6414*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6415*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6416*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
6417*6777b538SAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
6418*6777b538SAndroid Build Coastguard Worker      if (!func(unwrapped)) {
6419*6777b538SAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
6420*6777b538SAndroid Build Coastguard Worker      }
6421*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], unwrapped, &stop);
6422*6777b538SAndroid Build Coastguard Worker    if (stop) {
6423*6777b538SAndroid Build Coastguard Worker      break;
6424*6777b538SAndroid Build Coastguard Worker    }
6425*6777b538SAndroid Build Coastguard Worker  }
6426*6777b538SAndroid Build Coastguard Worker}
6427*6777b538SAndroid Build Coastguard Worker
6428*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBUInt64EnumDictionary *)otherDictionary {
6429*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
6430*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6431*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
6432*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6433*6777b538SAndroid Build Coastguard Worker    }
6434*6777b538SAndroid Build Coastguard Worker  }
6435*6777b538SAndroid Build Coastguard Worker}
6436*6777b538SAndroid Build Coastguard Worker
6437*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(uint64_t)key {
6438*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6439*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
6440*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6441*6777b538SAndroid Build Coastguard Worker  }
6442*6777b538SAndroid Build Coastguard Worker}
6443*6777b538SAndroid Build Coastguard Worker
6444*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(uint64_t)aKey {
6445*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6446*6777b538SAndroid Build Coastguard Worker}
6447*6777b538SAndroid Build Coastguard Worker
6448*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
6449*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6450*6777b538SAndroid Build Coastguard Worker}
6451*6777b538SAndroid Build Coastguard Worker
6452*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(uint64_t)key {
6453*6777b538SAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
6454*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
6455*6777b538SAndroid Build Coastguard Worker                format:@"GPBUInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
6456*6777b538SAndroid Build Coastguard Worker                       value];
6457*6777b538SAndroid Build Coastguard Worker  }
6458*6777b538SAndroid Build Coastguard Worker
6459*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6460*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
6461*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6462*6777b538SAndroid Build Coastguard Worker  }
6463*6777b538SAndroid Build Coastguard Worker}
6464*6777b538SAndroid Build Coastguard Worker
6465*6777b538SAndroid Build Coastguard Worker@end
6466*6777b538SAndroid Build Coastguard Worker
6467*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Object
6468*6777b538SAndroid Build Coastguard Worker
6469*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64ObjectDictionary {
6470*6777b538SAndroid Build Coastguard Worker @package
6471*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6472*6777b538SAndroid Build Coastguard Worker}
6473*6777b538SAndroid Build Coastguard Worker
6474*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
6475*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
6476*6777b538SAndroid Build Coastguard Worker}
6477*6777b538SAndroid Build Coastguard Worker
6478*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
6479*6777b538SAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
6480*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
6481*6777b538SAndroid Build Coastguard Worker  self = [super init];
6482*6777b538SAndroid Build Coastguard Worker  if (self) {
6483*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6484*6777b538SAndroid Build Coastguard Worker    if (count && objects && keys) {
6485*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6486*6777b538SAndroid Build Coastguard Worker        if (!objects[i]) {
6487*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
6488*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
6489*6777b538SAndroid Build Coastguard Worker        }
6490*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
6491*6777b538SAndroid Build Coastguard Worker      }
6492*6777b538SAndroid Build Coastguard Worker    }
6493*6777b538SAndroid Build Coastguard Worker  }
6494*6777b538SAndroid Build Coastguard Worker  return self;
6495*6777b538SAndroid Build Coastguard Worker}
6496*6777b538SAndroid Build Coastguard Worker
6497*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64ObjectDictionary *)dictionary {
6498*6777b538SAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
6499*6777b538SAndroid Build Coastguard Worker  if (self) {
6500*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
6501*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6502*6777b538SAndroid Build Coastguard Worker    }
6503*6777b538SAndroid Build Coastguard Worker  }
6504*6777b538SAndroid Build Coastguard Worker  return self;
6505*6777b538SAndroid Build Coastguard Worker}
6506*6777b538SAndroid Build Coastguard Worker
6507*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6508*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
6509*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
6510*6777b538SAndroid Build Coastguard Worker}
6511*6777b538SAndroid Build Coastguard Worker
6512*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
6513*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6514*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6515*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
6516*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
6517*6777b538SAndroid Build Coastguard Worker  [super dealloc];
6518*6777b538SAndroid Build Coastguard Worker}
6519*6777b538SAndroid Build Coastguard Worker
6520*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6521*6777b538SAndroid Build Coastguard Worker  return [[GPBUInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self];
6522*6777b538SAndroid Build Coastguard Worker}
6523*6777b538SAndroid Build Coastguard Worker
6524*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6525*6777b538SAndroid Build Coastguard Worker  if (self == other) {
6526*6777b538SAndroid Build Coastguard Worker    return YES;
6527*6777b538SAndroid Build Coastguard Worker  }
6528*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64ObjectDictionary class]]) {
6529*6777b538SAndroid Build Coastguard Worker    return NO;
6530*6777b538SAndroid Build Coastguard Worker  }
6531*6777b538SAndroid Build Coastguard Worker  GPBUInt64ObjectDictionary *otherDictionary = other;
6532*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6533*6777b538SAndroid Build Coastguard Worker}
6534*6777b538SAndroid Build Coastguard Worker
6535*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
6536*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6537*6777b538SAndroid Build Coastguard Worker}
6538*6777b538SAndroid Build Coastguard Worker
6539*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
6540*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6541*6777b538SAndroid Build Coastguard Worker}
6542*6777b538SAndroid Build Coastguard Worker
6543*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
6544*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6545*6777b538SAndroid Build Coastguard Worker}
6546*6777b538SAndroid Build Coastguard Worker
6547*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
6548*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, id object, BOOL *stop))block {
6549*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
6550*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6551*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6552*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6553*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6554*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
6555*6777b538SAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], aObject, &stop);
6556*6777b538SAndroid Build Coastguard Worker    if (stop) {
6557*6777b538SAndroid Build Coastguard Worker      break;
6558*6777b538SAndroid Build Coastguard Worker    }
6559*6777b538SAndroid Build Coastguard Worker  }
6560*6777b538SAndroid Build Coastguard Worker}
6561*6777b538SAndroid Build Coastguard Worker
6562*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized {
6563*6777b538SAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
6564*6777b538SAndroid Build Coastguard Worker    if (!msg.initialized) {
6565*6777b538SAndroid Build Coastguard Worker      return NO;
6566*6777b538SAndroid Build Coastguard Worker    }
6567*6777b538SAndroid Build Coastguard Worker  }
6568*6777b538SAndroid Build Coastguard Worker  return YES;
6569*6777b538SAndroid Build Coastguard Worker}
6570*6777b538SAndroid Build Coastguard Worker
6571*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
6572*6777b538SAndroid Build Coastguard Worker  GPBUInt64ObjectDictionary *newDict =
6573*6777b538SAndroid Build Coastguard Worker      [[GPBUInt64ObjectDictionary alloc] init];
6574*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
6575*6777b538SAndroid Build Coastguard Worker  id aKey;
6576*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
6577*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6578*6777b538SAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
6579*6777b538SAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
6580*6777b538SAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
6581*6777b538SAndroid Build Coastguard Worker    [copiedMsg release];
6582*6777b538SAndroid Build Coastguard Worker  }
6583*6777b538SAndroid Build Coastguard Worker  return newDict;
6584*6777b538SAndroid Build Coastguard Worker}
6585*6777b538SAndroid Build Coastguard Worker
6586*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6587*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6588*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6589*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
6590*6777b538SAndroid Build Coastguard Worker    return 0;
6591*6777b538SAndroid Build Coastguard Worker  }
6592*6777b538SAndroid Build Coastguard Worker
6593*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6594*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6595*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
6596*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6597*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6598*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6599*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
6600*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
6601*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
6602*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6603*6777b538SAndroid Build Coastguard Worker  }
6604*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6605*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
6606*6777b538SAndroid Build Coastguard Worker  return result;
6607*6777b538SAndroid Build Coastguard Worker}
6608*6777b538SAndroid Build Coastguard Worker
6609*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6610*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6611*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6612*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6613*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6614*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6615*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6616*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6617*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6618*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
6619*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6620*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
6621*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
6622*6777b538SAndroid Build Coastguard Worker    id unwrappedValue = aObject;
6623*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6624*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6625*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6626*6777b538SAndroid Build Coastguard Worker    // Write the fields.
6627*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6628*6777b538SAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6629*6777b538SAndroid Build Coastguard Worker  }
6630*6777b538SAndroid Build Coastguard Worker}
6631*6777b538SAndroid Build Coastguard Worker
6632*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6633*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6634*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueUInt64)];
6635*6777b538SAndroid Build Coastguard Worker}
6636*6777b538SAndroid Build Coastguard Worker
6637*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6638*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(uint64_t key, id object, BOOL *stop) {
6639*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
6640*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], object);
6641*6777b538SAndroid Build Coastguard Worker  }];
6642*6777b538SAndroid Build Coastguard Worker}
6643*6777b538SAndroid Build Coastguard Worker
6644*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(uint64_t)key {
6645*6777b538SAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
6646*6777b538SAndroid Build Coastguard Worker  return result;
6647*6777b538SAndroid Build Coastguard Worker}
6648*6777b538SAndroid Build Coastguard Worker
6649*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64ObjectDictionary *)otherDictionary {
6650*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
6651*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6652*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
6653*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6654*6777b538SAndroid Build Coastguard Worker    }
6655*6777b538SAndroid Build Coastguard Worker  }
6656*6777b538SAndroid Build Coastguard Worker}
6657*6777b538SAndroid Build Coastguard Worker
6658*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(uint64_t)key {
6659*6777b538SAndroid Build Coastguard Worker  if (!object) {
6660*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
6661*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
6662*6777b538SAndroid Build Coastguard Worker  }
6663*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
6664*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
6665*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6666*6777b538SAndroid Build Coastguard Worker  }
6667*6777b538SAndroid Build Coastguard Worker}
6668*6777b538SAndroid Build Coastguard Worker
6669*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(uint64_t)aKey {
6670*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6671*6777b538SAndroid Build Coastguard Worker}
6672*6777b538SAndroid Build Coastguard Worker
6673*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
6674*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6675*6777b538SAndroid Build Coastguard Worker}
6676*6777b538SAndroid Build Coastguard Worker
6677*6777b538SAndroid Build Coastguard Worker@end
6678*6777b538SAndroid Build Coastguard Worker
6679*6777b538SAndroid Build Coastguard Worker// clang-format on
6680*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int64, int64_t)
6681*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
6682*6777b538SAndroid Build Coastguard Worker// clang-format off
6683*6777b538SAndroid Build Coastguard Worker
6684*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> UInt32
6685*6777b538SAndroid Build Coastguard Worker
6686*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64UInt32Dictionary {
6687*6777b538SAndroid Build Coastguard Worker @package
6688*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6689*6777b538SAndroid Build Coastguard Worker}
6690*6777b538SAndroid Build Coastguard Worker
6691*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
6692*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
6693*6777b538SAndroid Build Coastguard Worker}
6694*6777b538SAndroid Build Coastguard Worker
6695*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
6696*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
6697*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
6698*6777b538SAndroid Build Coastguard Worker  self = [super init];
6699*6777b538SAndroid Build Coastguard Worker  if (self) {
6700*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6701*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
6702*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6703*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6704*6777b538SAndroid Build Coastguard Worker      }
6705*6777b538SAndroid Build Coastguard Worker    }
6706*6777b538SAndroid Build Coastguard Worker  }
6707*6777b538SAndroid Build Coastguard Worker  return self;
6708*6777b538SAndroid Build Coastguard Worker}
6709*6777b538SAndroid Build Coastguard Worker
6710*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64UInt32Dictionary *)dictionary {
6711*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
6712*6777b538SAndroid Build Coastguard Worker  if (self) {
6713*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
6714*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6715*6777b538SAndroid Build Coastguard Worker    }
6716*6777b538SAndroid Build Coastguard Worker  }
6717*6777b538SAndroid Build Coastguard Worker  return self;
6718*6777b538SAndroid Build Coastguard Worker}
6719*6777b538SAndroid Build Coastguard Worker
6720*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6721*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
6722*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
6723*6777b538SAndroid Build Coastguard Worker}
6724*6777b538SAndroid Build Coastguard Worker
6725*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
6726*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6727*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6728*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
6729*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
6730*6777b538SAndroid Build Coastguard Worker  [super dealloc];
6731*6777b538SAndroid Build Coastguard Worker}
6732*6777b538SAndroid Build Coastguard Worker
6733*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6734*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
6735*6777b538SAndroid Build Coastguard Worker}
6736*6777b538SAndroid Build Coastguard Worker
6737*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6738*6777b538SAndroid Build Coastguard Worker  if (self == other) {
6739*6777b538SAndroid Build Coastguard Worker    return YES;
6740*6777b538SAndroid Build Coastguard Worker  }
6741*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64UInt32Dictionary class]]) {
6742*6777b538SAndroid Build Coastguard Worker    return NO;
6743*6777b538SAndroid Build Coastguard Worker  }
6744*6777b538SAndroid Build Coastguard Worker  GPBInt64UInt32Dictionary *otherDictionary = other;
6745*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6746*6777b538SAndroid Build Coastguard Worker}
6747*6777b538SAndroid Build Coastguard Worker
6748*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
6749*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6750*6777b538SAndroid Build Coastguard Worker}
6751*6777b538SAndroid Build Coastguard Worker
6752*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
6753*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6754*6777b538SAndroid Build Coastguard Worker}
6755*6777b538SAndroid Build Coastguard Worker
6756*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
6757*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6758*6777b538SAndroid Build Coastguard Worker}
6759*6777b538SAndroid Build Coastguard Worker
6760*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
6761*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, uint32_t value, BOOL *stop))block {
6762*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
6763*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6764*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6765*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6766*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6767*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6768*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue unsignedIntValue], &stop);
6769*6777b538SAndroid Build Coastguard Worker    if (stop) {
6770*6777b538SAndroid Build Coastguard Worker      break;
6771*6777b538SAndroid Build Coastguard Worker    }
6772*6777b538SAndroid Build Coastguard Worker  }
6773*6777b538SAndroid Build Coastguard Worker}
6774*6777b538SAndroid Build Coastguard Worker
6775*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6776*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6777*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6778*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
6779*6777b538SAndroid Build Coastguard Worker    return 0;
6780*6777b538SAndroid Build Coastguard Worker  }
6781*6777b538SAndroid Build Coastguard Worker
6782*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6783*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6784*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
6785*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6786*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6787*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6788*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6789*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
6790*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
6791*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6792*6777b538SAndroid Build Coastguard Worker  }
6793*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6794*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
6795*6777b538SAndroid Build Coastguard Worker  return result;
6796*6777b538SAndroid Build Coastguard Worker}
6797*6777b538SAndroid Build Coastguard Worker
6798*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6799*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6800*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6801*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6802*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6803*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6804*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6805*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6806*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6807*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6808*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6809*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
6810*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
6811*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
6812*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6813*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6814*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6815*6777b538SAndroid Build Coastguard Worker    // Write the fields.
6816*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6817*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6818*6777b538SAndroid Build Coastguard Worker  }
6819*6777b538SAndroid Build Coastguard Worker}
6820*6777b538SAndroid Build Coastguard Worker
6821*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6822*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6823*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt64)];
6824*6777b538SAndroid Build Coastguard Worker}
6825*6777b538SAndroid Build Coastguard Worker
6826*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6827*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(int64_t key, uint32_t value, BOOL *stop) {
6828*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
6829*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%u", value]);
6830*6777b538SAndroid Build Coastguard Worker  }];
6831*6777b538SAndroid Build Coastguard Worker}
6832*6777b538SAndroid Build Coastguard Worker
6833*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int64_t)key {
6834*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6835*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
6836*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
6837*6777b538SAndroid Build Coastguard Worker  }
6838*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
6839*6777b538SAndroid Build Coastguard Worker}
6840*6777b538SAndroid Build Coastguard Worker
6841*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64UInt32Dictionary *)otherDictionary {
6842*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
6843*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6844*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
6845*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6846*6777b538SAndroid Build Coastguard Worker    }
6847*6777b538SAndroid Build Coastguard Worker  }
6848*6777b538SAndroid Build Coastguard Worker}
6849*6777b538SAndroid Build Coastguard Worker
6850*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(int64_t)key {
6851*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6852*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
6853*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6854*6777b538SAndroid Build Coastguard Worker  }
6855*6777b538SAndroid Build Coastguard Worker}
6856*6777b538SAndroid Build Coastguard Worker
6857*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(int64_t)aKey {
6858*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6859*6777b538SAndroid Build Coastguard Worker}
6860*6777b538SAndroid Build Coastguard Worker
6861*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
6862*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6863*6777b538SAndroid Build Coastguard Worker}
6864*6777b538SAndroid Build Coastguard Worker
6865*6777b538SAndroid Build Coastguard Worker@end
6866*6777b538SAndroid Build Coastguard Worker
6867*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Int32
6868*6777b538SAndroid Build Coastguard Worker
6869*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64Int32Dictionary {
6870*6777b538SAndroid Build Coastguard Worker @package
6871*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6872*6777b538SAndroid Build Coastguard Worker}
6873*6777b538SAndroid Build Coastguard Worker
6874*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
6875*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
6876*6777b538SAndroid Build Coastguard Worker}
6877*6777b538SAndroid Build Coastguard Worker
6878*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
6879*6777b538SAndroid Build Coastguard Worker                       forKeys:(const int64_t [])keys
6880*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
6881*6777b538SAndroid Build Coastguard Worker  self = [super init];
6882*6777b538SAndroid Build Coastguard Worker  if (self) {
6883*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6884*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
6885*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6886*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6887*6777b538SAndroid Build Coastguard Worker      }
6888*6777b538SAndroid Build Coastguard Worker    }
6889*6777b538SAndroid Build Coastguard Worker  }
6890*6777b538SAndroid Build Coastguard Worker  return self;
6891*6777b538SAndroid Build Coastguard Worker}
6892*6777b538SAndroid Build Coastguard Worker
6893*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64Int32Dictionary *)dictionary {
6894*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
6895*6777b538SAndroid Build Coastguard Worker  if (self) {
6896*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
6897*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6898*6777b538SAndroid Build Coastguard Worker    }
6899*6777b538SAndroid Build Coastguard Worker  }
6900*6777b538SAndroid Build Coastguard Worker  return self;
6901*6777b538SAndroid Build Coastguard Worker}
6902*6777b538SAndroid Build Coastguard Worker
6903*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6904*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
6905*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
6906*6777b538SAndroid Build Coastguard Worker}
6907*6777b538SAndroid Build Coastguard Worker
6908*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
6909*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6910*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6911*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
6912*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
6913*6777b538SAndroid Build Coastguard Worker  [super dealloc];
6914*6777b538SAndroid Build Coastguard Worker}
6915*6777b538SAndroid Build Coastguard Worker
6916*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6917*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self];
6918*6777b538SAndroid Build Coastguard Worker}
6919*6777b538SAndroid Build Coastguard Worker
6920*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6921*6777b538SAndroid Build Coastguard Worker  if (self == other) {
6922*6777b538SAndroid Build Coastguard Worker    return YES;
6923*6777b538SAndroid Build Coastguard Worker  }
6924*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64Int32Dictionary class]]) {
6925*6777b538SAndroid Build Coastguard Worker    return NO;
6926*6777b538SAndroid Build Coastguard Worker  }
6927*6777b538SAndroid Build Coastguard Worker  GPBInt64Int32Dictionary *otherDictionary = other;
6928*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6929*6777b538SAndroid Build Coastguard Worker}
6930*6777b538SAndroid Build Coastguard Worker
6931*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
6932*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6933*6777b538SAndroid Build Coastguard Worker}
6934*6777b538SAndroid Build Coastguard Worker
6935*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
6936*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6937*6777b538SAndroid Build Coastguard Worker}
6938*6777b538SAndroid Build Coastguard Worker
6939*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
6940*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
6941*6777b538SAndroid Build Coastguard Worker}
6942*6777b538SAndroid Build Coastguard Worker
6943*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
6944*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block {
6945*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
6946*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6947*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6948*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6949*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6950*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6951*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue intValue], &stop);
6952*6777b538SAndroid Build Coastguard Worker    if (stop) {
6953*6777b538SAndroid Build Coastguard Worker      break;
6954*6777b538SAndroid Build Coastguard Worker    }
6955*6777b538SAndroid Build Coastguard Worker  }
6956*6777b538SAndroid Build Coastguard Worker}
6957*6777b538SAndroid Build Coastguard Worker
6958*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6959*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6960*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6961*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
6962*6777b538SAndroid Build Coastguard Worker    return 0;
6963*6777b538SAndroid Build Coastguard Worker  }
6964*6777b538SAndroid Build Coastguard Worker
6965*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6966*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6967*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
6968*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6969*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6970*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6971*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6972*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
6973*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
6974*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6975*6777b538SAndroid Build Coastguard Worker  }
6976*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6977*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
6978*6777b538SAndroid Build Coastguard Worker  return result;
6979*6777b538SAndroid Build Coastguard Worker}
6980*6777b538SAndroid Build Coastguard Worker
6981*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6982*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6983*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6984*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6985*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6986*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6987*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6988*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
6989*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6990*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6991*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6992*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
6993*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
6994*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
6995*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6996*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6997*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6998*6777b538SAndroid Build Coastguard Worker    // Write the fields.
6999*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7000*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7001*6777b538SAndroid Build Coastguard Worker  }
7002*6777b538SAndroid Build Coastguard Worker}
7003*6777b538SAndroid Build Coastguard Worker
7004*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7005*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7006*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt64)];
7007*6777b538SAndroid Build Coastguard Worker}
7008*6777b538SAndroid Build Coastguard Worker
7009*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7010*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
7011*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
7012*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%d", value]);
7013*6777b538SAndroid Build Coastguard Worker  }];
7014*6777b538SAndroid Build Coastguard Worker}
7015*6777b538SAndroid Build Coastguard Worker
7016*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(int64_t)key {
7017*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7018*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
7019*6777b538SAndroid Build Coastguard Worker    *value = [wrapped intValue];
7020*6777b538SAndroid Build Coastguard Worker  }
7021*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
7022*6777b538SAndroid Build Coastguard Worker}
7023*6777b538SAndroid Build Coastguard Worker
7024*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64Int32Dictionary *)otherDictionary {
7025*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
7026*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7027*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
7028*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7029*6777b538SAndroid Build Coastguard Worker    }
7030*6777b538SAndroid Build Coastguard Worker  }
7031*6777b538SAndroid Build Coastguard Worker}
7032*6777b538SAndroid Build Coastguard Worker
7033*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(int64_t)key {
7034*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7035*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
7036*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7037*6777b538SAndroid Build Coastguard Worker  }
7038*6777b538SAndroid Build Coastguard Worker}
7039*6777b538SAndroid Build Coastguard Worker
7040*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(int64_t)aKey {
7041*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7042*6777b538SAndroid Build Coastguard Worker}
7043*6777b538SAndroid Build Coastguard Worker
7044*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
7045*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7046*6777b538SAndroid Build Coastguard Worker}
7047*6777b538SAndroid Build Coastguard Worker
7048*6777b538SAndroid Build Coastguard Worker@end
7049*6777b538SAndroid Build Coastguard Worker
7050*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> UInt64
7051*6777b538SAndroid Build Coastguard Worker
7052*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64UInt64Dictionary {
7053*6777b538SAndroid Build Coastguard Worker @package
7054*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7055*6777b538SAndroid Build Coastguard Worker}
7056*6777b538SAndroid Build Coastguard Worker
7057*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
7058*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
7059*6777b538SAndroid Build Coastguard Worker}
7060*6777b538SAndroid Build Coastguard Worker
7061*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
7062*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
7063*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
7064*6777b538SAndroid Build Coastguard Worker  self = [super init];
7065*6777b538SAndroid Build Coastguard Worker  if (self) {
7066*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7067*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
7068*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7069*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7070*6777b538SAndroid Build Coastguard Worker      }
7071*6777b538SAndroid Build Coastguard Worker    }
7072*6777b538SAndroid Build Coastguard Worker  }
7073*6777b538SAndroid Build Coastguard Worker  return self;
7074*6777b538SAndroid Build Coastguard Worker}
7075*6777b538SAndroid Build Coastguard Worker
7076*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64UInt64Dictionary *)dictionary {
7077*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
7078*6777b538SAndroid Build Coastguard Worker  if (self) {
7079*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
7080*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7081*6777b538SAndroid Build Coastguard Worker    }
7082*6777b538SAndroid Build Coastguard Worker  }
7083*6777b538SAndroid Build Coastguard Worker  return self;
7084*6777b538SAndroid Build Coastguard Worker}
7085*6777b538SAndroid Build Coastguard Worker
7086*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7087*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
7088*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
7089*6777b538SAndroid Build Coastguard Worker}
7090*6777b538SAndroid Build Coastguard Worker
7091*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
7092*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7093*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7094*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
7095*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
7096*6777b538SAndroid Build Coastguard Worker  [super dealloc];
7097*6777b538SAndroid Build Coastguard Worker}
7098*6777b538SAndroid Build Coastguard Worker
7099*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7100*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
7101*6777b538SAndroid Build Coastguard Worker}
7102*6777b538SAndroid Build Coastguard Worker
7103*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7104*6777b538SAndroid Build Coastguard Worker  if (self == other) {
7105*6777b538SAndroid Build Coastguard Worker    return YES;
7106*6777b538SAndroid Build Coastguard Worker  }
7107*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64UInt64Dictionary class]]) {
7108*6777b538SAndroid Build Coastguard Worker    return NO;
7109*6777b538SAndroid Build Coastguard Worker  }
7110*6777b538SAndroid Build Coastguard Worker  GPBInt64UInt64Dictionary *otherDictionary = other;
7111*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7112*6777b538SAndroid Build Coastguard Worker}
7113*6777b538SAndroid Build Coastguard Worker
7114*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
7115*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7116*6777b538SAndroid Build Coastguard Worker}
7117*6777b538SAndroid Build Coastguard Worker
7118*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
7119*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7120*6777b538SAndroid Build Coastguard Worker}
7121*6777b538SAndroid Build Coastguard Worker
7122*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
7123*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7124*6777b538SAndroid Build Coastguard Worker}
7125*6777b538SAndroid Build Coastguard Worker
7126*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
7127*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, uint64_t value, BOOL *stop))block {
7128*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
7129*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7130*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7131*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7132*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7133*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7134*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue unsignedLongLongValue], &stop);
7135*6777b538SAndroid Build Coastguard Worker    if (stop) {
7136*6777b538SAndroid Build Coastguard Worker      break;
7137*6777b538SAndroid Build Coastguard Worker    }
7138*6777b538SAndroid Build Coastguard Worker  }
7139*6777b538SAndroid Build Coastguard Worker}
7140*6777b538SAndroid Build Coastguard Worker
7141*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7142*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7143*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7144*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
7145*6777b538SAndroid Build Coastguard Worker    return 0;
7146*6777b538SAndroid Build Coastguard Worker  }
7147*6777b538SAndroid Build Coastguard Worker
7148*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7149*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7150*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
7151*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7152*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7153*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7154*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7155*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7156*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
7157*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7158*6777b538SAndroid Build Coastguard Worker  }
7159*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7160*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
7161*6777b538SAndroid Build Coastguard Worker  return result;
7162*6777b538SAndroid Build Coastguard Worker}
7163*6777b538SAndroid Build Coastguard Worker
7164*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7165*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7166*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7167*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7168*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7169*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7170*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7171*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7172*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7173*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7174*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7175*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
7176*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7177*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
7178*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7179*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7180*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7181*6777b538SAndroid Build Coastguard Worker    // Write the fields.
7182*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7183*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7184*6777b538SAndroid Build Coastguard Worker  }
7185*6777b538SAndroid Build Coastguard Worker}
7186*6777b538SAndroid Build Coastguard Worker
7187*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7188*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7189*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt64)];
7190*6777b538SAndroid Build Coastguard Worker}
7191*6777b538SAndroid Build Coastguard Worker
7192*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7193*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(int64_t key, uint64_t value, BOOL *stop) {
7194*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
7195*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%llu", value]);
7196*6777b538SAndroid Build Coastguard Worker  }];
7197*6777b538SAndroid Build Coastguard Worker}
7198*6777b538SAndroid Build Coastguard Worker
7199*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int64_t)key {
7200*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7201*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
7202*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
7203*6777b538SAndroid Build Coastguard Worker  }
7204*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
7205*6777b538SAndroid Build Coastguard Worker}
7206*6777b538SAndroid Build Coastguard Worker
7207*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64UInt64Dictionary *)otherDictionary {
7208*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
7209*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7210*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
7211*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7212*6777b538SAndroid Build Coastguard Worker    }
7213*6777b538SAndroid Build Coastguard Worker  }
7214*6777b538SAndroid Build Coastguard Worker}
7215*6777b538SAndroid Build Coastguard Worker
7216*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(int64_t)key {
7217*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7218*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
7219*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7220*6777b538SAndroid Build Coastguard Worker  }
7221*6777b538SAndroid Build Coastguard Worker}
7222*6777b538SAndroid Build Coastguard Worker
7223*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(int64_t)aKey {
7224*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7225*6777b538SAndroid Build Coastguard Worker}
7226*6777b538SAndroid Build Coastguard Worker
7227*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
7228*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7229*6777b538SAndroid Build Coastguard Worker}
7230*6777b538SAndroid Build Coastguard Worker
7231*6777b538SAndroid Build Coastguard Worker@end
7232*6777b538SAndroid Build Coastguard Worker
7233*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Int64
7234*6777b538SAndroid Build Coastguard Worker
7235*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64Int64Dictionary {
7236*6777b538SAndroid Build Coastguard Worker @package
7237*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7238*6777b538SAndroid Build Coastguard Worker}
7239*6777b538SAndroid Build Coastguard Worker
7240*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
7241*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
7242*6777b538SAndroid Build Coastguard Worker}
7243*6777b538SAndroid Build Coastguard Worker
7244*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
7245*6777b538SAndroid Build Coastguard Worker                       forKeys:(const int64_t [])keys
7246*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
7247*6777b538SAndroid Build Coastguard Worker  self = [super init];
7248*6777b538SAndroid Build Coastguard Worker  if (self) {
7249*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7250*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
7251*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7252*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7253*6777b538SAndroid Build Coastguard Worker      }
7254*6777b538SAndroid Build Coastguard Worker    }
7255*6777b538SAndroid Build Coastguard Worker  }
7256*6777b538SAndroid Build Coastguard Worker  return self;
7257*6777b538SAndroid Build Coastguard Worker}
7258*6777b538SAndroid Build Coastguard Worker
7259*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64Int64Dictionary *)dictionary {
7260*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
7261*6777b538SAndroid Build Coastguard Worker  if (self) {
7262*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
7263*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7264*6777b538SAndroid Build Coastguard Worker    }
7265*6777b538SAndroid Build Coastguard Worker  }
7266*6777b538SAndroid Build Coastguard Worker  return self;
7267*6777b538SAndroid Build Coastguard Worker}
7268*6777b538SAndroid Build Coastguard Worker
7269*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7270*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
7271*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
7272*6777b538SAndroid Build Coastguard Worker}
7273*6777b538SAndroid Build Coastguard Worker
7274*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
7275*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7276*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7277*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
7278*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
7279*6777b538SAndroid Build Coastguard Worker  [super dealloc];
7280*6777b538SAndroid Build Coastguard Worker}
7281*6777b538SAndroid Build Coastguard Worker
7282*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7283*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self];
7284*6777b538SAndroid Build Coastguard Worker}
7285*6777b538SAndroid Build Coastguard Worker
7286*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7287*6777b538SAndroid Build Coastguard Worker  if (self == other) {
7288*6777b538SAndroid Build Coastguard Worker    return YES;
7289*6777b538SAndroid Build Coastguard Worker  }
7290*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64Int64Dictionary class]]) {
7291*6777b538SAndroid Build Coastguard Worker    return NO;
7292*6777b538SAndroid Build Coastguard Worker  }
7293*6777b538SAndroid Build Coastguard Worker  GPBInt64Int64Dictionary *otherDictionary = other;
7294*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7295*6777b538SAndroid Build Coastguard Worker}
7296*6777b538SAndroid Build Coastguard Worker
7297*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
7298*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7299*6777b538SAndroid Build Coastguard Worker}
7300*6777b538SAndroid Build Coastguard Worker
7301*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
7302*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7303*6777b538SAndroid Build Coastguard Worker}
7304*6777b538SAndroid Build Coastguard Worker
7305*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
7306*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7307*6777b538SAndroid Build Coastguard Worker}
7308*6777b538SAndroid Build Coastguard Worker
7309*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
7310*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int64_t value, BOOL *stop))block {
7311*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
7312*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7313*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7314*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7315*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7316*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7317*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue longLongValue], &stop);
7318*6777b538SAndroid Build Coastguard Worker    if (stop) {
7319*6777b538SAndroid Build Coastguard Worker      break;
7320*6777b538SAndroid Build Coastguard Worker    }
7321*6777b538SAndroid Build Coastguard Worker  }
7322*6777b538SAndroid Build Coastguard Worker}
7323*6777b538SAndroid Build Coastguard Worker
7324*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7325*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7326*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7327*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
7328*6777b538SAndroid Build Coastguard Worker    return 0;
7329*6777b538SAndroid Build Coastguard Worker  }
7330*6777b538SAndroid Build Coastguard Worker
7331*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7332*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7333*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
7334*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7335*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7336*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7337*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7338*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7339*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
7340*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7341*6777b538SAndroid Build Coastguard Worker  }
7342*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7343*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
7344*6777b538SAndroid Build Coastguard Worker  return result;
7345*6777b538SAndroid Build Coastguard Worker}
7346*6777b538SAndroid Build Coastguard Worker
7347*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7348*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7349*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7350*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7351*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7352*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7353*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7354*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7355*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7356*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7357*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7358*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
7359*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7360*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
7361*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7362*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7363*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7364*6777b538SAndroid Build Coastguard Worker    // Write the fields.
7365*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7366*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7367*6777b538SAndroid Build Coastguard Worker  }
7368*6777b538SAndroid Build Coastguard Worker}
7369*6777b538SAndroid Build Coastguard Worker
7370*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7371*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7372*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt64)];
7373*6777b538SAndroid Build Coastguard Worker}
7374*6777b538SAndroid Build Coastguard Worker
7375*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7376*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(int64_t key, int64_t value, BOOL *stop) {
7377*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
7378*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%lld", value]);
7379*6777b538SAndroid Build Coastguard Worker  }];
7380*6777b538SAndroid Build Coastguard Worker}
7381*6777b538SAndroid Build Coastguard Worker
7382*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(int64_t)key {
7383*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7384*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
7385*6777b538SAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
7386*6777b538SAndroid Build Coastguard Worker  }
7387*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
7388*6777b538SAndroid Build Coastguard Worker}
7389*6777b538SAndroid Build Coastguard Worker
7390*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64Int64Dictionary *)otherDictionary {
7391*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
7392*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7393*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
7394*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7395*6777b538SAndroid Build Coastguard Worker    }
7396*6777b538SAndroid Build Coastguard Worker  }
7397*6777b538SAndroid Build Coastguard Worker}
7398*6777b538SAndroid Build Coastguard Worker
7399*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(int64_t)key {
7400*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7401*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
7402*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7403*6777b538SAndroid Build Coastguard Worker  }
7404*6777b538SAndroid Build Coastguard Worker}
7405*6777b538SAndroid Build Coastguard Worker
7406*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(int64_t)aKey {
7407*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7408*6777b538SAndroid Build Coastguard Worker}
7409*6777b538SAndroid Build Coastguard Worker
7410*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
7411*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7412*6777b538SAndroid Build Coastguard Worker}
7413*6777b538SAndroid Build Coastguard Worker
7414*6777b538SAndroid Build Coastguard Worker@end
7415*6777b538SAndroid Build Coastguard Worker
7416*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Bool
7417*6777b538SAndroid Build Coastguard Worker
7418*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64BoolDictionary {
7419*6777b538SAndroid Build Coastguard Worker @package
7420*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7421*6777b538SAndroid Build Coastguard Worker}
7422*6777b538SAndroid Build Coastguard Worker
7423*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
7424*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
7425*6777b538SAndroid Build Coastguard Worker}
7426*6777b538SAndroid Build Coastguard Worker
7427*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
7428*6777b538SAndroid Build Coastguard Worker                      forKeys:(const int64_t [])keys
7429*6777b538SAndroid Build Coastguard Worker                        count:(NSUInteger)count {
7430*6777b538SAndroid Build Coastguard Worker  self = [super init];
7431*6777b538SAndroid Build Coastguard Worker  if (self) {
7432*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7433*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
7434*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7435*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7436*6777b538SAndroid Build Coastguard Worker      }
7437*6777b538SAndroid Build Coastguard Worker    }
7438*6777b538SAndroid Build Coastguard Worker  }
7439*6777b538SAndroid Build Coastguard Worker  return self;
7440*6777b538SAndroid Build Coastguard Worker}
7441*6777b538SAndroid Build Coastguard Worker
7442*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64BoolDictionary *)dictionary {
7443*6777b538SAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
7444*6777b538SAndroid Build Coastguard Worker  if (self) {
7445*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
7446*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7447*6777b538SAndroid Build Coastguard Worker    }
7448*6777b538SAndroid Build Coastguard Worker  }
7449*6777b538SAndroid Build Coastguard Worker  return self;
7450*6777b538SAndroid Build Coastguard Worker}
7451*6777b538SAndroid Build Coastguard Worker
7452*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7453*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
7454*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
7455*6777b538SAndroid Build Coastguard Worker}
7456*6777b538SAndroid Build Coastguard Worker
7457*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
7458*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7459*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7460*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
7461*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
7462*6777b538SAndroid Build Coastguard Worker  [super dealloc];
7463*6777b538SAndroid Build Coastguard Worker}
7464*6777b538SAndroid Build Coastguard Worker
7465*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7466*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
7467*6777b538SAndroid Build Coastguard Worker}
7468*6777b538SAndroid Build Coastguard Worker
7469*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7470*6777b538SAndroid Build Coastguard Worker  if (self == other) {
7471*6777b538SAndroid Build Coastguard Worker    return YES;
7472*6777b538SAndroid Build Coastguard Worker  }
7473*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64BoolDictionary class]]) {
7474*6777b538SAndroid Build Coastguard Worker    return NO;
7475*6777b538SAndroid Build Coastguard Worker  }
7476*6777b538SAndroid Build Coastguard Worker  GPBInt64BoolDictionary *otherDictionary = other;
7477*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7478*6777b538SAndroid Build Coastguard Worker}
7479*6777b538SAndroid Build Coastguard Worker
7480*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
7481*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7482*6777b538SAndroid Build Coastguard Worker}
7483*6777b538SAndroid Build Coastguard Worker
7484*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
7485*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7486*6777b538SAndroid Build Coastguard Worker}
7487*6777b538SAndroid Build Coastguard Worker
7488*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
7489*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7490*6777b538SAndroid Build Coastguard Worker}
7491*6777b538SAndroid Build Coastguard Worker
7492*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
7493*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, BOOL value, BOOL *stop))block {
7494*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
7495*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7496*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7497*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7498*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7499*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7500*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue boolValue], &stop);
7501*6777b538SAndroid Build Coastguard Worker    if (stop) {
7502*6777b538SAndroid Build Coastguard Worker      break;
7503*6777b538SAndroid Build Coastguard Worker    }
7504*6777b538SAndroid Build Coastguard Worker  }
7505*6777b538SAndroid Build Coastguard Worker}
7506*6777b538SAndroid Build Coastguard Worker
7507*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7508*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7509*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7510*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
7511*6777b538SAndroid Build Coastguard Worker    return 0;
7512*6777b538SAndroid Build Coastguard Worker  }
7513*6777b538SAndroid Build Coastguard Worker
7514*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7515*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7516*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
7517*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7518*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7519*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7520*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7521*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7522*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
7523*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7524*6777b538SAndroid Build Coastguard Worker  }
7525*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7526*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
7527*6777b538SAndroid Build Coastguard Worker  return result;
7528*6777b538SAndroid Build Coastguard Worker}
7529*6777b538SAndroid Build Coastguard Worker
7530*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7531*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7532*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7533*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7534*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7535*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7536*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7537*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7538*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7539*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7540*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7541*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
7542*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7543*6777b538SAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
7544*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7545*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7546*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7547*6777b538SAndroid Build Coastguard Worker    // Write the fields.
7548*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7549*6777b538SAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7550*6777b538SAndroid Build Coastguard Worker  }
7551*6777b538SAndroid Build Coastguard Worker}
7552*6777b538SAndroid Build Coastguard Worker
7553*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7554*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7555*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt64)];
7556*6777b538SAndroid Build Coastguard Worker}
7557*6777b538SAndroid Build Coastguard Worker
7558*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7559*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(int64_t key, BOOL value, BOOL *stop) {
7560*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
7561*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], (value ? @"true" : @"false"));
7562*6777b538SAndroid Build Coastguard Worker  }];
7563*6777b538SAndroid Build Coastguard Worker}
7564*6777b538SAndroid Build Coastguard Worker
7565*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(int64_t)key {
7566*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7567*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
7568*6777b538SAndroid Build Coastguard Worker    *value = [wrapped boolValue];
7569*6777b538SAndroid Build Coastguard Worker  }
7570*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
7571*6777b538SAndroid Build Coastguard Worker}
7572*6777b538SAndroid Build Coastguard Worker
7573*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64BoolDictionary *)otherDictionary {
7574*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
7575*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7576*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
7577*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7578*6777b538SAndroid Build Coastguard Worker    }
7579*6777b538SAndroid Build Coastguard Worker  }
7580*6777b538SAndroid Build Coastguard Worker}
7581*6777b538SAndroid Build Coastguard Worker
7582*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(int64_t)key {
7583*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7584*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
7585*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7586*6777b538SAndroid Build Coastguard Worker  }
7587*6777b538SAndroid Build Coastguard Worker}
7588*6777b538SAndroid Build Coastguard Worker
7589*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(int64_t)aKey {
7590*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7591*6777b538SAndroid Build Coastguard Worker}
7592*6777b538SAndroid Build Coastguard Worker
7593*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
7594*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7595*6777b538SAndroid Build Coastguard Worker}
7596*6777b538SAndroid Build Coastguard Worker
7597*6777b538SAndroid Build Coastguard Worker@end
7598*6777b538SAndroid Build Coastguard Worker
7599*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Float
7600*6777b538SAndroid Build Coastguard Worker
7601*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64FloatDictionary {
7602*6777b538SAndroid Build Coastguard Worker @package
7603*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7604*6777b538SAndroid Build Coastguard Worker}
7605*6777b538SAndroid Build Coastguard Worker
7606*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
7607*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
7608*6777b538SAndroid Build Coastguard Worker}
7609*6777b538SAndroid Build Coastguard Worker
7610*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
7611*6777b538SAndroid Build Coastguard Worker                       forKeys:(const int64_t [])keys
7612*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
7613*6777b538SAndroid Build Coastguard Worker  self = [super init];
7614*6777b538SAndroid Build Coastguard Worker  if (self) {
7615*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7616*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
7617*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7618*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7619*6777b538SAndroid Build Coastguard Worker      }
7620*6777b538SAndroid Build Coastguard Worker    }
7621*6777b538SAndroid Build Coastguard Worker  }
7622*6777b538SAndroid Build Coastguard Worker  return self;
7623*6777b538SAndroid Build Coastguard Worker}
7624*6777b538SAndroid Build Coastguard Worker
7625*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64FloatDictionary *)dictionary {
7626*6777b538SAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
7627*6777b538SAndroid Build Coastguard Worker  if (self) {
7628*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
7629*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7630*6777b538SAndroid Build Coastguard Worker    }
7631*6777b538SAndroid Build Coastguard Worker  }
7632*6777b538SAndroid Build Coastguard Worker  return self;
7633*6777b538SAndroid Build Coastguard Worker}
7634*6777b538SAndroid Build Coastguard Worker
7635*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7636*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
7637*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
7638*6777b538SAndroid Build Coastguard Worker}
7639*6777b538SAndroid Build Coastguard Worker
7640*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
7641*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7642*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7643*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
7644*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
7645*6777b538SAndroid Build Coastguard Worker  [super dealloc];
7646*6777b538SAndroid Build Coastguard Worker}
7647*6777b538SAndroid Build Coastguard Worker
7648*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7649*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64FloatDictionary allocWithZone:zone] initWithDictionary:self];
7650*6777b538SAndroid Build Coastguard Worker}
7651*6777b538SAndroid Build Coastguard Worker
7652*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7653*6777b538SAndroid Build Coastguard Worker  if (self == other) {
7654*6777b538SAndroid Build Coastguard Worker    return YES;
7655*6777b538SAndroid Build Coastguard Worker  }
7656*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64FloatDictionary class]]) {
7657*6777b538SAndroid Build Coastguard Worker    return NO;
7658*6777b538SAndroid Build Coastguard Worker  }
7659*6777b538SAndroid Build Coastguard Worker  GPBInt64FloatDictionary *otherDictionary = other;
7660*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7661*6777b538SAndroid Build Coastguard Worker}
7662*6777b538SAndroid Build Coastguard Worker
7663*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
7664*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7665*6777b538SAndroid Build Coastguard Worker}
7666*6777b538SAndroid Build Coastguard Worker
7667*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
7668*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7669*6777b538SAndroid Build Coastguard Worker}
7670*6777b538SAndroid Build Coastguard Worker
7671*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
7672*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7673*6777b538SAndroid Build Coastguard Worker}
7674*6777b538SAndroid Build Coastguard Worker
7675*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
7676*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, float value, BOOL *stop))block {
7677*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
7678*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7679*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7680*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7681*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7682*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7683*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue floatValue], &stop);
7684*6777b538SAndroid Build Coastguard Worker    if (stop) {
7685*6777b538SAndroid Build Coastguard Worker      break;
7686*6777b538SAndroid Build Coastguard Worker    }
7687*6777b538SAndroid Build Coastguard Worker  }
7688*6777b538SAndroid Build Coastguard Worker}
7689*6777b538SAndroid Build Coastguard Worker
7690*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7691*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7692*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7693*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
7694*6777b538SAndroid Build Coastguard Worker    return 0;
7695*6777b538SAndroid Build Coastguard Worker  }
7696*6777b538SAndroid Build Coastguard Worker
7697*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7698*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7699*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
7700*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7701*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7702*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7703*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7704*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7705*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
7706*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7707*6777b538SAndroid Build Coastguard Worker  }
7708*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7709*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
7710*6777b538SAndroid Build Coastguard Worker  return result;
7711*6777b538SAndroid Build Coastguard Worker}
7712*6777b538SAndroid Build Coastguard Worker
7713*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7714*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7715*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7716*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7717*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7718*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7719*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7720*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7721*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7722*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7723*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7724*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
7725*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7726*6777b538SAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
7727*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7728*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7729*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7730*6777b538SAndroid Build Coastguard Worker    // Write the fields.
7731*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7732*6777b538SAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7733*6777b538SAndroid Build Coastguard Worker  }
7734*6777b538SAndroid Build Coastguard Worker}
7735*6777b538SAndroid Build Coastguard Worker
7736*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7737*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7738*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt64)];
7739*6777b538SAndroid Build Coastguard Worker}
7740*6777b538SAndroid Build Coastguard Worker
7741*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7742*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(int64_t key, float value, BOOL *stop) {
7743*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
7744*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
7745*6777b538SAndroid Build Coastguard Worker  }];
7746*6777b538SAndroid Build Coastguard Worker}
7747*6777b538SAndroid Build Coastguard Worker
7748*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(int64_t)key {
7749*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7750*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
7751*6777b538SAndroid Build Coastguard Worker    *value = [wrapped floatValue];
7752*6777b538SAndroid Build Coastguard Worker  }
7753*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
7754*6777b538SAndroid Build Coastguard Worker}
7755*6777b538SAndroid Build Coastguard Worker
7756*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64FloatDictionary *)otherDictionary {
7757*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
7758*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7759*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
7760*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7761*6777b538SAndroid Build Coastguard Worker    }
7762*6777b538SAndroid Build Coastguard Worker  }
7763*6777b538SAndroid Build Coastguard Worker}
7764*6777b538SAndroid Build Coastguard Worker
7765*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(int64_t)key {
7766*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7767*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
7768*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7769*6777b538SAndroid Build Coastguard Worker  }
7770*6777b538SAndroid Build Coastguard Worker}
7771*6777b538SAndroid Build Coastguard Worker
7772*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(int64_t)aKey {
7773*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7774*6777b538SAndroid Build Coastguard Worker}
7775*6777b538SAndroid Build Coastguard Worker
7776*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
7777*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7778*6777b538SAndroid Build Coastguard Worker}
7779*6777b538SAndroid Build Coastguard Worker
7780*6777b538SAndroid Build Coastguard Worker@end
7781*6777b538SAndroid Build Coastguard Worker
7782*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Double
7783*6777b538SAndroid Build Coastguard Worker
7784*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64DoubleDictionary {
7785*6777b538SAndroid Build Coastguard Worker @package
7786*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7787*6777b538SAndroid Build Coastguard Worker}
7788*6777b538SAndroid Build Coastguard Worker
7789*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
7790*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
7791*6777b538SAndroid Build Coastguard Worker}
7792*6777b538SAndroid Build Coastguard Worker
7793*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
7794*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
7795*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
7796*6777b538SAndroid Build Coastguard Worker  self = [super init];
7797*6777b538SAndroid Build Coastguard Worker  if (self) {
7798*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7799*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
7800*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7801*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7802*6777b538SAndroid Build Coastguard Worker      }
7803*6777b538SAndroid Build Coastguard Worker    }
7804*6777b538SAndroid Build Coastguard Worker  }
7805*6777b538SAndroid Build Coastguard Worker  return self;
7806*6777b538SAndroid Build Coastguard Worker}
7807*6777b538SAndroid Build Coastguard Worker
7808*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64DoubleDictionary *)dictionary {
7809*6777b538SAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
7810*6777b538SAndroid Build Coastguard Worker  if (self) {
7811*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
7812*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7813*6777b538SAndroid Build Coastguard Worker    }
7814*6777b538SAndroid Build Coastguard Worker  }
7815*6777b538SAndroid Build Coastguard Worker  return self;
7816*6777b538SAndroid Build Coastguard Worker}
7817*6777b538SAndroid Build Coastguard Worker
7818*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7819*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
7820*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
7821*6777b538SAndroid Build Coastguard Worker}
7822*6777b538SAndroid Build Coastguard Worker
7823*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
7824*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7825*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7826*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
7827*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
7828*6777b538SAndroid Build Coastguard Worker  [super dealloc];
7829*6777b538SAndroid Build Coastguard Worker}
7830*6777b538SAndroid Build Coastguard Worker
7831*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7832*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self];
7833*6777b538SAndroid Build Coastguard Worker}
7834*6777b538SAndroid Build Coastguard Worker
7835*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7836*6777b538SAndroid Build Coastguard Worker  if (self == other) {
7837*6777b538SAndroid Build Coastguard Worker    return YES;
7838*6777b538SAndroid Build Coastguard Worker  }
7839*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64DoubleDictionary class]]) {
7840*6777b538SAndroid Build Coastguard Worker    return NO;
7841*6777b538SAndroid Build Coastguard Worker  }
7842*6777b538SAndroid Build Coastguard Worker  GPBInt64DoubleDictionary *otherDictionary = other;
7843*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7844*6777b538SAndroid Build Coastguard Worker}
7845*6777b538SAndroid Build Coastguard Worker
7846*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
7847*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7848*6777b538SAndroid Build Coastguard Worker}
7849*6777b538SAndroid Build Coastguard Worker
7850*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
7851*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7852*6777b538SAndroid Build Coastguard Worker}
7853*6777b538SAndroid Build Coastguard Worker
7854*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
7855*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
7856*6777b538SAndroid Build Coastguard Worker}
7857*6777b538SAndroid Build Coastguard Worker
7858*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
7859*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, double value, BOOL *stop))block {
7860*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
7861*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7862*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7863*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7864*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7865*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7866*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue doubleValue], &stop);
7867*6777b538SAndroid Build Coastguard Worker    if (stop) {
7868*6777b538SAndroid Build Coastguard Worker      break;
7869*6777b538SAndroid Build Coastguard Worker    }
7870*6777b538SAndroid Build Coastguard Worker  }
7871*6777b538SAndroid Build Coastguard Worker}
7872*6777b538SAndroid Build Coastguard Worker
7873*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7874*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7875*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7876*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
7877*6777b538SAndroid Build Coastguard Worker    return 0;
7878*6777b538SAndroid Build Coastguard Worker  }
7879*6777b538SAndroid Build Coastguard Worker
7880*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7881*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7882*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
7883*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7884*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7885*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7886*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7887*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7888*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
7889*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7890*6777b538SAndroid Build Coastguard Worker  }
7891*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7892*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
7893*6777b538SAndroid Build Coastguard Worker  return result;
7894*6777b538SAndroid Build Coastguard Worker}
7895*6777b538SAndroid Build Coastguard Worker
7896*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7897*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7898*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7899*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7900*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7901*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7902*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7903*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
7904*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7905*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7906*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7907*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
7908*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7909*6777b538SAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
7910*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7911*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7912*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7913*6777b538SAndroid Build Coastguard Worker    // Write the fields.
7914*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7915*6777b538SAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7916*6777b538SAndroid Build Coastguard Worker  }
7917*6777b538SAndroid Build Coastguard Worker}
7918*6777b538SAndroid Build Coastguard Worker
7919*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7920*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7921*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt64)];
7922*6777b538SAndroid Build Coastguard Worker}
7923*6777b538SAndroid Build Coastguard Worker
7924*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7925*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(int64_t key, double value, BOOL *stop) {
7926*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
7927*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
7928*6777b538SAndroid Build Coastguard Worker  }];
7929*6777b538SAndroid Build Coastguard Worker}
7930*6777b538SAndroid Build Coastguard Worker
7931*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(int64_t)key {
7932*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7933*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
7934*6777b538SAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
7935*6777b538SAndroid Build Coastguard Worker  }
7936*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
7937*6777b538SAndroid Build Coastguard Worker}
7938*6777b538SAndroid Build Coastguard Worker
7939*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64DoubleDictionary *)otherDictionary {
7940*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
7941*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7942*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
7943*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7944*6777b538SAndroid Build Coastguard Worker    }
7945*6777b538SAndroid Build Coastguard Worker  }
7946*6777b538SAndroid Build Coastguard Worker}
7947*6777b538SAndroid Build Coastguard Worker
7948*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(int64_t)key {
7949*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7950*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
7951*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7952*6777b538SAndroid Build Coastguard Worker  }
7953*6777b538SAndroid Build Coastguard Worker}
7954*6777b538SAndroid Build Coastguard Worker
7955*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(int64_t)aKey {
7956*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7957*6777b538SAndroid Build Coastguard Worker}
7958*6777b538SAndroid Build Coastguard Worker
7959*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
7960*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7961*6777b538SAndroid Build Coastguard Worker}
7962*6777b538SAndroid Build Coastguard Worker
7963*6777b538SAndroid Build Coastguard Worker@end
7964*6777b538SAndroid Build Coastguard Worker
7965*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Enum
7966*6777b538SAndroid Build Coastguard Worker
7967*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64EnumDictionary {
7968*6777b538SAndroid Build Coastguard Worker @package
7969*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7970*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
7971*6777b538SAndroid Build Coastguard Worker}
7972*6777b538SAndroid Build Coastguard Worker
7973*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
7974*6777b538SAndroid Build Coastguard Worker
7975*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
7976*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
7977*6777b538SAndroid Build Coastguard Worker}
7978*6777b538SAndroid Build Coastguard Worker
7979*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
7980*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
7981*6777b538SAndroid Build Coastguard Worker}
7982*6777b538SAndroid Build Coastguard Worker
7983*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
7984*6777b538SAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
7985*6777b538SAndroid Build Coastguard Worker                                   forKeys:(const int64_t [])keys
7986*6777b538SAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
7987*6777b538SAndroid Build Coastguard Worker  self = [super init];
7988*6777b538SAndroid Build Coastguard Worker  if (self) {
7989*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7990*6777b538SAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
7991*6777b538SAndroid Build Coastguard Worker    if (count && rawValues && keys) {
7992*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7993*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
7994*6777b538SAndroid Build Coastguard Worker      }
7995*6777b538SAndroid Build Coastguard Worker    }
7996*6777b538SAndroid Build Coastguard Worker  }
7997*6777b538SAndroid Build Coastguard Worker  return self;
7998*6777b538SAndroid Build Coastguard Worker}
7999*6777b538SAndroid Build Coastguard Worker
8000*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64EnumDictionary *)dictionary {
8001*6777b538SAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
8002*6777b538SAndroid Build Coastguard Worker                                rawValues:NULL
8003*6777b538SAndroid Build Coastguard Worker                                  forKeys:NULL
8004*6777b538SAndroid Build Coastguard Worker                                    count:0];
8005*6777b538SAndroid Build Coastguard Worker  if (self) {
8006*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
8007*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8008*6777b538SAndroid Build Coastguard Worker    }
8009*6777b538SAndroid Build Coastguard Worker  }
8010*6777b538SAndroid Build Coastguard Worker  return self;
8011*6777b538SAndroid Build Coastguard Worker}
8012*6777b538SAndroid Build Coastguard Worker
8013*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
8014*6777b538SAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
8015*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
8016*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
8017*6777b538SAndroid Build Coastguard Worker}
8018*6777b538SAndroid Build Coastguard Worker
8019*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
8020*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8021*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8022*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
8023*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
8024*6777b538SAndroid Build Coastguard Worker  [super dealloc];
8025*6777b538SAndroid Build Coastguard Worker}
8026*6777b538SAndroid Build Coastguard Worker
8027*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8028*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
8029*6777b538SAndroid Build Coastguard Worker}
8030*6777b538SAndroid Build Coastguard Worker
8031*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8032*6777b538SAndroid Build Coastguard Worker  if (self == other) {
8033*6777b538SAndroid Build Coastguard Worker    return YES;
8034*6777b538SAndroid Build Coastguard Worker  }
8035*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64EnumDictionary class]]) {
8036*6777b538SAndroid Build Coastguard Worker    return NO;
8037*6777b538SAndroid Build Coastguard Worker  }
8038*6777b538SAndroid Build Coastguard Worker  GPBInt64EnumDictionary *otherDictionary = other;
8039*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8040*6777b538SAndroid Build Coastguard Worker}
8041*6777b538SAndroid Build Coastguard Worker
8042*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
8043*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8044*6777b538SAndroid Build Coastguard Worker}
8045*6777b538SAndroid Build Coastguard Worker
8046*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
8047*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8048*6777b538SAndroid Build Coastguard Worker}
8049*6777b538SAndroid Build Coastguard Worker
8050*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
8051*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8052*6777b538SAndroid Build Coastguard Worker}
8053*6777b538SAndroid Build Coastguard Worker
8054*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
8055*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block {
8056*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
8057*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8058*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8059*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
8060*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8061*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8062*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue intValue], &stop);
8063*6777b538SAndroid Build Coastguard Worker    if (stop) {
8064*6777b538SAndroid Build Coastguard Worker      break;
8065*6777b538SAndroid Build Coastguard Worker    }
8066*6777b538SAndroid Build Coastguard Worker  }
8067*6777b538SAndroid Build Coastguard Worker}
8068*6777b538SAndroid Build Coastguard Worker
8069*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8070*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8071*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8072*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
8073*6777b538SAndroid Build Coastguard Worker    return 0;
8074*6777b538SAndroid Build Coastguard Worker  }
8075*6777b538SAndroid Build Coastguard Worker
8076*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8077*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8078*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
8079*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8080*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
8081*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8082*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8083*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8084*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
8085*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8086*6777b538SAndroid Build Coastguard Worker  }
8087*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8088*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
8089*6777b538SAndroid Build Coastguard Worker  return result;
8090*6777b538SAndroid Build Coastguard Worker}
8091*6777b538SAndroid Build Coastguard Worker
8092*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8093*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8094*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8095*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8096*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8097*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8098*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8099*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
8100*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8101*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8102*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8103*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
8104*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
8105*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
8106*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8107*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8108*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8109*6777b538SAndroid Build Coastguard Worker    // Write the fields.
8110*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8111*6777b538SAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8112*6777b538SAndroid Build Coastguard Worker  }
8113*6777b538SAndroid Build Coastguard Worker}
8114*6777b538SAndroid Build Coastguard Worker
8115*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
8116*6777b538SAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
8117*6777b538SAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
8118*6777b538SAndroid Build Coastguard Worker  size_t msgSize = ComputeDictInt64FieldSize(key->valueInt64, kMapKeyFieldNumber, keyDataType);
8119*6777b538SAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
8120*6777b538SAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
8121*6777b538SAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
8122*6777b538SAndroid Build Coastguard Worker  WriteDictInt64Field(outputStream, key->valueInt64, kMapKeyFieldNumber, keyDataType);
8123*6777b538SAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
8124*6777b538SAndroid Build Coastguard Worker  [outputStream release];
8125*6777b538SAndroid Build Coastguard Worker  return data;
8126*6777b538SAndroid Build Coastguard Worker}
8127*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8128*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8129*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt64)];
8130*6777b538SAndroid Build Coastguard Worker}
8131*6777b538SAndroid Build Coastguard Worker
8132*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8133*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
8134*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
8135*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], @(value));
8136*6777b538SAndroid Build Coastguard Worker  }];
8137*6777b538SAndroid Build Coastguard Worker}
8138*6777b538SAndroid Build Coastguard Worker
8139*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(int64_t)key {
8140*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8141*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
8142*6777b538SAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
8143*6777b538SAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
8144*6777b538SAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
8145*6777b538SAndroid Build Coastguard Worker    }
8146*6777b538SAndroid Build Coastguard Worker    *value = result;
8147*6777b538SAndroid Build Coastguard Worker  }
8148*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
8149*6777b538SAndroid Build Coastguard Worker}
8150*6777b538SAndroid Build Coastguard Worker
8151*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int64_t)key {
8152*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8153*6777b538SAndroid Build Coastguard Worker  if (wrapped && rawValue) {
8154*6777b538SAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
8155*6777b538SAndroid Build Coastguard Worker  }
8156*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
8157*6777b538SAndroid Build Coastguard Worker}
8158*6777b538SAndroid Build Coastguard Worker
8159*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
8160*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block {
8161*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
8162*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
8163*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
8164*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
8165*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8166*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
8167*6777b538SAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
8168*6777b538SAndroid Build Coastguard Worker      if (!func(unwrapped)) {
8169*6777b538SAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
8170*6777b538SAndroid Build Coastguard Worker      }
8171*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], unwrapped, &stop);
8172*6777b538SAndroid Build Coastguard Worker    if (stop) {
8173*6777b538SAndroid Build Coastguard Worker      break;
8174*6777b538SAndroid Build Coastguard Worker    }
8175*6777b538SAndroid Build Coastguard Worker  }
8176*6777b538SAndroid Build Coastguard Worker}
8177*6777b538SAndroid Build Coastguard Worker
8178*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBInt64EnumDictionary *)otherDictionary {
8179*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
8180*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8181*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
8182*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8183*6777b538SAndroid Build Coastguard Worker    }
8184*6777b538SAndroid Build Coastguard Worker  }
8185*6777b538SAndroid Build Coastguard Worker}
8186*6777b538SAndroid Build Coastguard Worker
8187*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(int64_t)key {
8188*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
8189*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
8190*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8191*6777b538SAndroid Build Coastguard Worker  }
8192*6777b538SAndroid Build Coastguard Worker}
8193*6777b538SAndroid Build Coastguard Worker
8194*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(int64_t)aKey {
8195*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
8196*6777b538SAndroid Build Coastguard Worker}
8197*6777b538SAndroid Build Coastguard Worker
8198*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
8199*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8200*6777b538SAndroid Build Coastguard Worker}
8201*6777b538SAndroid Build Coastguard Worker
8202*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(int64_t)key {
8203*6777b538SAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
8204*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8205*6777b538SAndroid Build Coastguard Worker                format:@"GPBInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
8206*6777b538SAndroid Build Coastguard Worker                       value];
8207*6777b538SAndroid Build Coastguard Worker  }
8208*6777b538SAndroid Build Coastguard Worker
8209*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
8210*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
8211*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8212*6777b538SAndroid Build Coastguard Worker  }
8213*6777b538SAndroid Build Coastguard Worker}
8214*6777b538SAndroid Build Coastguard Worker
8215*6777b538SAndroid Build Coastguard Worker@end
8216*6777b538SAndroid Build Coastguard Worker
8217*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Object
8218*6777b538SAndroid Build Coastguard Worker
8219*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64ObjectDictionary {
8220*6777b538SAndroid Build Coastguard Worker @package
8221*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8222*6777b538SAndroid Build Coastguard Worker}
8223*6777b538SAndroid Build Coastguard Worker
8224*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
8225*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
8226*6777b538SAndroid Build Coastguard Worker}
8227*6777b538SAndroid Build Coastguard Worker
8228*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
8229*6777b538SAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
8230*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
8231*6777b538SAndroid Build Coastguard Worker  self = [super init];
8232*6777b538SAndroid Build Coastguard Worker  if (self) {
8233*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8234*6777b538SAndroid Build Coastguard Worker    if (count && objects && keys) {
8235*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8236*6777b538SAndroid Build Coastguard Worker        if (!objects[i]) {
8237*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8238*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
8239*6777b538SAndroid Build Coastguard Worker        }
8240*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
8241*6777b538SAndroid Build Coastguard Worker      }
8242*6777b538SAndroid Build Coastguard Worker    }
8243*6777b538SAndroid Build Coastguard Worker  }
8244*6777b538SAndroid Build Coastguard Worker  return self;
8245*6777b538SAndroid Build Coastguard Worker}
8246*6777b538SAndroid Build Coastguard Worker
8247*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64ObjectDictionary *)dictionary {
8248*6777b538SAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
8249*6777b538SAndroid Build Coastguard Worker  if (self) {
8250*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
8251*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8252*6777b538SAndroid Build Coastguard Worker    }
8253*6777b538SAndroid Build Coastguard Worker  }
8254*6777b538SAndroid Build Coastguard Worker  return self;
8255*6777b538SAndroid Build Coastguard Worker}
8256*6777b538SAndroid Build Coastguard Worker
8257*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8258*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
8259*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
8260*6777b538SAndroid Build Coastguard Worker}
8261*6777b538SAndroid Build Coastguard Worker
8262*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
8263*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8264*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8265*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
8266*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
8267*6777b538SAndroid Build Coastguard Worker  [super dealloc];
8268*6777b538SAndroid Build Coastguard Worker}
8269*6777b538SAndroid Build Coastguard Worker
8270*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8271*6777b538SAndroid Build Coastguard Worker  return [[GPBInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self];
8272*6777b538SAndroid Build Coastguard Worker}
8273*6777b538SAndroid Build Coastguard Worker
8274*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8275*6777b538SAndroid Build Coastguard Worker  if (self == other) {
8276*6777b538SAndroid Build Coastguard Worker    return YES;
8277*6777b538SAndroid Build Coastguard Worker  }
8278*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64ObjectDictionary class]]) {
8279*6777b538SAndroid Build Coastguard Worker    return NO;
8280*6777b538SAndroid Build Coastguard Worker  }
8281*6777b538SAndroid Build Coastguard Worker  GPBInt64ObjectDictionary *otherDictionary = other;
8282*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8283*6777b538SAndroid Build Coastguard Worker}
8284*6777b538SAndroid Build Coastguard Worker
8285*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
8286*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8287*6777b538SAndroid Build Coastguard Worker}
8288*6777b538SAndroid Build Coastguard Worker
8289*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
8290*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8291*6777b538SAndroid Build Coastguard Worker}
8292*6777b538SAndroid Build Coastguard Worker
8293*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
8294*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8295*6777b538SAndroid Build Coastguard Worker}
8296*6777b538SAndroid Build Coastguard Worker
8297*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
8298*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, id object, BOOL *stop))block {
8299*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
8300*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8301*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8302*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
8303*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8304*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
8305*6777b538SAndroid Build Coastguard Worker    block([aKey longLongValue], aObject, &stop);
8306*6777b538SAndroid Build Coastguard Worker    if (stop) {
8307*6777b538SAndroid Build Coastguard Worker      break;
8308*6777b538SAndroid Build Coastguard Worker    }
8309*6777b538SAndroid Build Coastguard Worker  }
8310*6777b538SAndroid Build Coastguard Worker}
8311*6777b538SAndroid Build Coastguard Worker
8312*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized {
8313*6777b538SAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
8314*6777b538SAndroid Build Coastguard Worker    if (!msg.initialized) {
8315*6777b538SAndroid Build Coastguard Worker      return NO;
8316*6777b538SAndroid Build Coastguard Worker    }
8317*6777b538SAndroid Build Coastguard Worker  }
8318*6777b538SAndroid Build Coastguard Worker  return YES;
8319*6777b538SAndroid Build Coastguard Worker}
8320*6777b538SAndroid Build Coastguard Worker
8321*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
8322*6777b538SAndroid Build Coastguard Worker  GPBInt64ObjectDictionary *newDict =
8323*6777b538SAndroid Build Coastguard Worker      [[GPBInt64ObjectDictionary alloc] init];
8324*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
8325*6777b538SAndroid Build Coastguard Worker  id aKey;
8326*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
8327*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8328*6777b538SAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
8329*6777b538SAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
8330*6777b538SAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
8331*6777b538SAndroid Build Coastguard Worker    [copiedMsg release];
8332*6777b538SAndroid Build Coastguard Worker  }
8333*6777b538SAndroid Build Coastguard Worker  return newDict;
8334*6777b538SAndroid Build Coastguard Worker}
8335*6777b538SAndroid Build Coastguard Worker
8336*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8337*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8338*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8339*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
8340*6777b538SAndroid Build Coastguard Worker    return 0;
8341*6777b538SAndroid Build Coastguard Worker  }
8342*6777b538SAndroid Build Coastguard Worker
8343*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8344*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8345*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
8346*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8347*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
8348*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8349*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
8350*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8351*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
8352*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8353*6777b538SAndroid Build Coastguard Worker  }
8354*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8355*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
8356*6777b538SAndroid Build Coastguard Worker  return result;
8357*6777b538SAndroid Build Coastguard Worker}
8358*6777b538SAndroid Build Coastguard Worker
8359*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8360*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8361*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8362*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8363*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8364*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8365*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8366*6777b538SAndroid Build Coastguard Worker  NSNumber *aKey;
8367*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8368*6777b538SAndroid Build Coastguard Worker    id aObject = internal[aKey];
8369*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8370*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
8371*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
8372*6777b538SAndroid Build Coastguard Worker    id unwrappedValue = aObject;
8373*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8374*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8375*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8376*6777b538SAndroid Build Coastguard Worker    // Write the fields.
8377*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8378*6777b538SAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8379*6777b538SAndroid Build Coastguard Worker  }
8380*6777b538SAndroid Build Coastguard Worker}
8381*6777b538SAndroid Build Coastguard Worker
8382*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8383*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8384*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueInt64)];
8385*6777b538SAndroid Build Coastguard Worker}
8386*6777b538SAndroid Build Coastguard Worker
8387*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8388*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(int64_t key, id object, BOOL *stop) {
8389*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
8390*6777b538SAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], object);
8391*6777b538SAndroid Build Coastguard Worker  }];
8392*6777b538SAndroid Build Coastguard Worker}
8393*6777b538SAndroid Build Coastguard Worker
8394*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(int64_t)key {
8395*6777b538SAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
8396*6777b538SAndroid Build Coastguard Worker  return result;
8397*6777b538SAndroid Build Coastguard Worker}
8398*6777b538SAndroid Build Coastguard Worker
8399*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64ObjectDictionary *)otherDictionary {
8400*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
8401*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8402*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
8403*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8404*6777b538SAndroid Build Coastguard Worker    }
8405*6777b538SAndroid Build Coastguard Worker  }
8406*6777b538SAndroid Build Coastguard Worker}
8407*6777b538SAndroid Build Coastguard Worker
8408*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(int64_t)key {
8409*6777b538SAndroid Build Coastguard Worker  if (!object) {
8410*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8411*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
8412*6777b538SAndroid Build Coastguard Worker  }
8413*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
8414*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
8415*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8416*6777b538SAndroid Build Coastguard Worker  }
8417*6777b538SAndroid Build Coastguard Worker}
8418*6777b538SAndroid Build Coastguard Worker
8419*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(int64_t)aKey {
8420*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
8421*6777b538SAndroid Build Coastguard Worker}
8422*6777b538SAndroid Build Coastguard Worker
8423*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
8424*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8425*6777b538SAndroid Build Coastguard Worker}
8426*6777b538SAndroid Build Coastguard Worker
8427*6777b538SAndroid Build Coastguard Worker@end
8428*6777b538SAndroid Build Coastguard Worker
8429*6777b538SAndroid Build Coastguard Worker// clang-format on
8430*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_POD_IMPL_FOR_KEY(String, NSString, *, OBJECT)
8431*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
8432*6777b538SAndroid Build Coastguard Worker// clang-format off
8433*6777b538SAndroid Build Coastguard Worker
8434*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> UInt32
8435*6777b538SAndroid Build Coastguard Worker
8436*6777b538SAndroid Build Coastguard Worker@implementation GPBStringUInt32Dictionary {
8437*6777b538SAndroid Build Coastguard Worker @package
8438*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8439*6777b538SAndroid Build Coastguard Worker}
8440*6777b538SAndroid Build Coastguard Worker
8441*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
8442*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
8443*6777b538SAndroid Build Coastguard Worker}
8444*6777b538SAndroid Build Coastguard Worker
8445*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
8446*6777b538SAndroid Build Coastguard Worker                        forKeys:(const NSString * [])keys
8447*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
8448*6777b538SAndroid Build Coastguard Worker  self = [super init];
8449*6777b538SAndroid Build Coastguard Worker  if (self) {
8450*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8451*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
8452*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8453*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
8454*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8455*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
8456*6777b538SAndroid Build Coastguard Worker        }
8457*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
8458*6777b538SAndroid Build Coastguard Worker      }
8459*6777b538SAndroid Build Coastguard Worker    }
8460*6777b538SAndroid Build Coastguard Worker  }
8461*6777b538SAndroid Build Coastguard Worker  return self;
8462*6777b538SAndroid Build Coastguard Worker}
8463*6777b538SAndroid Build Coastguard Worker
8464*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringUInt32Dictionary *)dictionary {
8465*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
8466*6777b538SAndroid Build Coastguard Worker  if (self) {
8467*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
8468*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8469*6777b538SAndroid Build Coastguard Worker    }
8470*6777b538SAndroid Build Coastguard Worker  }
8471*6777b538SAndroid Build Coastguard Worker  return self;
8472*6777b538SAndroid Build Coastguard Worker}
8473*6777b538SAndroid Build Coastguard Worker
8474*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8475*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
8476*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
8477*6777b538SAndroid Build Coastguard Worker}
8478*6777b538SAndroid Build Coastguard Worker
8479*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
8480*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8481*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8482*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
8483*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
8484*6777b538SAndroid Build Coastguard Worker  [super dealloc];
8485*6777b538SAndroid Build Coastguard Worker}
8486*6777b538SAndroid Build Coastguard Worker
8487*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8488*6777b538SAndroid Build Coastguard Worker  return [[GPBStringUInt32Dictionary allocWithZone:zone] initWithDictionary:self];
8489*6777b538SAndroid Build Coastguard Worker}
8490*6777b538SAndroid Build Coastguard Worker
8491*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8492*6777b538SAndroid Build Coastguard Worker  if (self == other) {
8493*6777b538SAndroid Build Coastguard Worker    return YES;
8494*6777b538SAndroid Build Coastguard Worker  }
8495*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringUInt32Dictionary class]]) {
8496*6777b538SAndroid Build Coastguard Worker    return NO;
8497*6777b538SAndroid Build Coastguard Worker  }
8498*6777b538SAndroid Build Coastguard Worker  GPBStringUInt32Dictionary *otherDictionary = other;
8499*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8500*6777b538SAndroid Build Coastguard Worker}
8501*6777b538SAndroid Build Coastguard Worker
8502*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
8503*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8504*6777b538SAndroid Build Coastguard Worker}
8505*6777b538SAndroid Build Coastguard Worker
8506*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
8507*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8508*6777b538SAndroid Build Coastguard Worker}
8509*6777b538SAndroid Build Coastguard Worker
8510*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
8511*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8512*6777b538SAndroid Build Coastguard Worker}
8513*6777b538SAndroid Build Coastguard Worker
8514*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
8515*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, uint32_t value, BOOL *stop))block {
8516*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
8517*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8518*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8519*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8520*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8521*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8522*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue unsignedIntValue], &stop);
8523*6777b538SAndroid Build Coastguard Worker    if (stop) {
8524*6777b538SAndroid Build Coastguard Worker      break;
8525*6777b538SAndroid Build Coastguard Worker    }
8526*6777b538SAndroid Build Coastguard Worker  }
8527*6777b538SAndroid Build Coastguard Worker}
8528*6777b538SAndroid Build Coastguard Worker
8529*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8530*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8531*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8532*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
8533*6777b538SAndroid Build Coastguard Worker    return 0;
8534*6777b538SAndroid Build Coastguard Worker  }
8535*6777b538SAndroid Build Coastguard Worker
8536*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8537*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8538*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
8539*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8540*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8541*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8542*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8543*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
8544*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
8545*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8546*6777b538SAndroid Build Coastguard Worker  }
8547*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8548*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
8549*6777b538SAndroid Build Coastguard Worker  return result;
8550*6777b538SAndroid Build Coastguard Worker}
8551*6777b538SAndroid Build Coastguard Worker
8552*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8553*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8554*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8555*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8556*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8557*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8558*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8559*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8560*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8561*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8562*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8563*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
8564*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
8565*6777b538SAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
8566*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8567*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8568*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8569*6777b538SAndroid Build Coastguard Worker    // Write the fields.
8570*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8571*6777b538SAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8572*6777b538SAndroid Build Coastguard Worker  }
8573*6777b538SAndroid Build Coastguard Worker}
8574*6777b538SAndroid Build Coastguard Worker
8575*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8576*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8577*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:key->valueString];
8578*6777b538SAndroid Build Coastguard Worker}
8579*6777b538SAndroid Build Coastguard Worker
8580*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8581*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(NSString *key, uint32_t value, BOOL *stop) {
8582*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
8583*6777b538SAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%u", value]);
8584*6777b538SAndroid Build Coastguard Worker  }];
8585*6777b538SAndroid Build Coastguard Worker}
8586*6777b538SAndroid Build Coastguard Worker
8587*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(NSString *)key {
8588*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
8589*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
8590*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
8591*6777b538SAndroid Build Coastguard Worker  }
8592*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
8593*6777b538SAndroid Build Coastguard Worker}
8594*6777b538SAndroid Build Coastguard Worker
8595*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringUInt32Dictionary *)otherDictionary {
8596*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
8597*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8598*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
8599*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8600*6777b538SAndroid Build Coastguard Worker    }
8601*6777b538SAndroid Build Coastguard Worker  }
8602*6777b538SAndroid Build Coastguard Worker}
8603*6777b538SAndroid Build Coastguard Worker
8604*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(NSString *)key {
8605*6777b538SAndroid Build Coastguard Worker  if (!key) {
8606*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8607*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
8608*6777b538SAndroid Build Coastguard Worker  }
8609*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
8610*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
8611*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8612*6777b538SAndroid Build Coastguard Worker  }
8613*6777b538SAndroid Build Coastguard Worker}
8614*6777b538SAndroid Build Coastguard Worker
8615*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(NSString *)aKey {
8616*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
8617*6777b538SAndroid Build Coastguard Worker}
8618*6777b538SAndroid Build Coastguard Worker
8619*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
8620*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8621*6777b538SAndroid Build Coastguard Worker}
8622*6777b538SAndroid Build Coastguard Worker
8623*6777b538SAndroid Build Coastguard Worker@end
8624*6777b538SAndroid Build Coastguard Worker
8625*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Int32
8626*6777b538SAndroid Build Coastguard Worker
8627*6777b538SAndroid Build Coastguard Worker@implementation GPBStringInt32Dictionary {
8628*6777b538SAndroid Build Coastguard Worker @package
8629*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8630*6777b538SAndroid Build Coastguard Worker}
8631*6777b538SAndroid Build Coastguard Worker
8632*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
8633*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
8634*6777b538SAndroid Build Coastguard Worker}
8635*6777b538SAndroid Build Coastguard Worker
8636*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
8637*6777b538SAndroid Build Coastguard Worker                       forKeys:(const NSString * [])keys
8638*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
8639*6777b538SAndroid Build Coastguard Worker  self = [super init];
8640*6777b538SAndroid Build Coastguard Worker  if (self) {
8641*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8642*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
8643*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8644*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
8645*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8646*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
8647*6777b538SAndroid Build Coastguard Worker        }
8648*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
8649*6777b538SAndroid Build Coastguard Worker      }
8650*6777b538SAndroid Build Coastguard Worker    }
8651*6777b538SAndroid Build Coastguard Worker  }
8652*6777b538SAndroid Build Coastguard Worker  return self;
8653*6777b538SAndroid Build Coastguard Worker}
8654*6777b538SAndroid Build Coastguard Worker
8655*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringInt32Dictionary *)dictionary {
8656*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
8657*6777b538SAndroid Build Coastguard Worker  if (self) {
8658*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
8659*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8660*6777b538SAndroid Build Coastguard Worker    }
8661*6777b538SAndroid Build Coastguard Worker  }
8662*6777b538SAndroid Build Coastguard Worker  return self;
8663*6777b538SAndroid Build Coastguard Worker}
8664*6777b538SAndroid Build Coastguard Worker
8665*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8666*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
8667*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
8668*6777b538SAndroid Build Coastguard Worker}
8669*6777b538SAndroid Build Coastguard Worker
8670*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
8671*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8672*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8673*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
8674*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
8675*6777b538SAndroid Build Coastguard Worker  [super dealloc];
8676*6777b538SAndroid Build Coastguard Worker}
8677*6777b538SAndroid Build Coastguard Worker
8678*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8679*6777b538SAndroid Build Coastguard Worker  return [[GPBStringInt32Dictionary allocWithZone:zone] initWithDictionary:self];
8680*6777b538SAndroid Build Coastguard Worker}
8681*6777b538SAndroid Build Coastguard Worker
8682*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8683*6777b538SAndroid Build Coastguard Worker  if (self == other) {
8684*6777b538SAndroid Build Coastguard Worker    return YES;
8685*6777b538SAndroid Build Coastguard Worker  }
8686*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringInt32Dictionary class]]) {
8687*6777b538SAndroid Build Coastguard Worker    return NO;
8688*6777b538SAndroid Build Coastguard Worker  }
8689*6777b538SAndroid Build Coastguard Worker  GPBStringInt32Dictionary *otherDictionary = other;
8690*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8691*6777b538SAndroid Build Coastguard Worker}
8692*6777b538SAndroid Build Coastguard Worker
8693*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
8694*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8695*6777b538SAndroid Build Coastguard Worker}
8696*6777b538SAndroid Build Coastguard Worker
8697*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
8698*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8699*6777b538SAndroid Build Coastguard Worker}
8700*6777b538SAndroid Build Coastguard Worker
8701*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
8702*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8703*6777b538SAndroid Build Coastguard Worker}
8704*6777b538SAndroid Build Coastguard Worker
8705*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
8706*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block {
8707*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
8708*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8709*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8710*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8711*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8712*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8713*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue intValue], &stop);
8714*6777b538SAndroid Build Coastguard Worker    if (stop) {
8715*6777b538SAndroid Build Coastguard Worker      break;
8716*6777b538SAndroid Build Coastguard Worker    }
8717*6777b538SAndroid Build Coastguard Worker  }
8718*6777b538SAndroid Build Coastguard Worker}
8719*6777b538SAndroid Build Coastguard Worker
8720*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8721*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8722*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8723*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
8724*6777b538SAndroid Build Coastguard Worker    return 0;
8725*6777b538SAndroid Build Coastguard Worker  }
8726*6777b538SAndroid Build Coastguard Worker
8727*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8728*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8729*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
8730*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8731*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8732*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8733*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8734*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
8735*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
8736*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8737*6777b538SAndroid Build Coastguard Worker  }
8738*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8739*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
8740*6777b538SAndroid Build Coastguard Worker  return result;
8741*6777b538SAndroid Build Coastguard Worker}
8742*6777b538SAndroid Build Coastguard Worker
8743*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8744*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8745*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8746*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8747*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8748*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8749*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8750*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8751*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8752*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8753*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8754*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
8755*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
8756*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
8757*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8758*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8759*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8760*6777b538SAndroid Build Coastguard Worker    // Write the fields.
8761*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8762*6777b538SAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8763*6777b538SAndroid Build Coastguard Worker  }
8764*6777b538SAndroid Build Coastguard Worker}
8765*6777b538SAndroid Build Coastguard Worker
8766*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8767*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8768*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:key->valueString];
8769*6777b538SAndroid Build Coastguard Worker}
8770*6777b538SAndroid Build Coastguard Worker
8771*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8772*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
8773*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
8774*6777b538SAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%d", value]);
8775*6777b538SAndroid Build Coastguard Worker  }];
8776*6777b538SAndroid Build Coastguard Worker}
8777*6777b538SAndroid Build Coastguard Worker
8778*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(NSString *)key {
8779*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
8780*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
8781*6777b538SAndroid Build Coastguard Worker    *value = [wrapped intValue];
8782*6777b538SAndroid Build Coastguard Worker  }
8783*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
8784*6777b538SAndroid Build Coastguard Worker}
8785*6777b538SAndroid Build Coastguard Worker
8786*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringInt32Dictionary *)otherDictionary {
8787*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
8788*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8789*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
8790*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8791*6777b538SAndroid Build Coastguard Worker    }
8792*6777b538SAndroid Build Coastguard Worker  }
8793*6777b538SAndroid Build Coastguard Worker}
8794*6777b538SAndroid Build Coastguard Worker
8795*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(NSString *)key {
8796*6777b538SAndroid Build Coastguard Worker  if (!key) {
8797*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8798*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
8799*6777b538SAndroid Build Coastguard Worker  }
8800*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
8801*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
8802*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8803*6777b538SAndroid Build Coastguard Worker  }
8804*6777b538SAndroid Build Coastguard Worker}
8805*6777b538SAndroid Build Coastguard Worker
8806*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(NSString *)aKey {
8807*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
8808*6777b538SAndroid Build Coastguard Worker}
8809*6777b538SAndroid Build Coastguard Worker
8810*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
8811*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8812*6777b538SAndroid Build Coastguard Worker}
8813*6777b538SAndroid Build Coastguard Worker
8814*6777b538SAndroid Build Coastguard Worker@end
8815*6777b538SAndroid Build Coastguard Worker
8816*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> UInt64
8817*6777b538SAndroid Build Coastguard Worker
8818*6777b538SAndroid Build Coastguard Worker@implementation GPBStringUInt64Dictionary {
8819*6777b538SAndroid Build Coastguard Worker @package
8820*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8821*6777b538SAndroid Build Coastguard Worker}
8822*6777b538SAndroid Build Coastguard Worker
8823*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
8824*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
8825*6777b538SAndroid Build Coastguard Worker}
8826*6777b538SAndroid Build Coastguard Worker
8827*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
8828*6777b538SAndroid Build Coastguard Worker                        forKeys:(const NSString * [])keys
8829*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
8830*6777b538SAndroid Build Coastguard Worker  self = [super init];
8831*6777b538SAndroid Build Coastguard Worker  if (self) {
8832*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8833*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
8834*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8835*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
8836*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8837*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
8838*6777b538SAndroid Build Coastguard Worker        }
8839*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
8840*6777b538SAndroid Build Coastguard Worker      }
8841*6777b538SAndroid Build Coastguard Worker    }
8842*6777b538SAndroid Build Coastguard Worker  }
8843*6777b538SAndroid Build Coastguard Worker  return self;
8844*6777b538SAndroid Build Coastguard Worker}
8845*6777b538SAndroid Build Coastguard Worker
8846*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringUInt64Dictionary *)dictionary {
8847*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
8848*6777b538SAndroid Build Coastguard Worker  if (self) {
8849*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
8850*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8851*6777b538SAndroid Build Coastguard Worker    }
8852*6777b538SAndroid Build Coastguard Worker  }
8853*6777b538SAndroid Build Coastguard Worker  return self;
8854*6777b538SAndroid Build Coastguard Worker}
8855*6777b538SAndroid Build Coastguard Worker
8856*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8857*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
8858*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
8859*6777b538SAndroid Build Coastguard Worker}
8860*6777b538SAndroid Build Coastguard Worker
8861*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
8862*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8863*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8864*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
8865*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
8866*6777b538SAndroid Build Coastguard Worker  [super dealloc];
8867*6777b538SAndroid Build Coastguard Worker}
8868*6777b538SAndroid Build Coastguard Worker
8869*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8870*6777b538SAndroid Build Coastguard Worker  return [[GPBStringUInt64Dictionary allocWithZone:zone] initWithDictionary:self];
8871*6777b538SAndroid Build Coastguard Worker}
8872*6777b538SAndroid Build Coastguard Worker
8873*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8874*6777b538SAndroid Build Coastguard Worker  if (self == other) {
8875*6777b538SAndroid Build Coastguard Worker    return YES;
8876*6777b538SAndroid Build Coastguard Worker  }
8877*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringUInt64Dictionary class]]) {
8878*6777b538SAndroid Build Coastguard Worker    return NO;
8879*6777b538SAndroid Build Coastguard Worker  }
8880*6777b538SAndroid Build Coastguard Worker  GPBStringUInt64Dictionary *otherDictionary = other;
8881*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8882*6777b538SAndroid Build Coastguard Worker}
8883*6777b538SAndroid Build Coastguard Worker
8884*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
8885*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8886*6777b538SAndroid Build Coastguard Worker}
8887*6777b538SAndroid Build Coastguard Worker
8888*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
8889*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8890*6777b538SAndroid Build Coastguard Worker}
8891*6777b538SAndroid Build Coastguard Worker
8892*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
8893*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
8894*6777b538SAndroid Build Coastguard Worker}
8895*6777b538SAndroid Build Coastguard Worker
8896*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
8897*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, uint64_t value, BOOL *stop))block {
8898*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
8899*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8900*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8901*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8902*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8903*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8904*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue unsignedLongLongValue], &stop);
8905*6777b538SAndroid Build Coastguard Worker    if (stop) {
8906*6777b538SAndroid Build Coastguard Worker      break;
8907*6777b538SAndroid Build Coastguard Worker    }
8908*6777b538SAndroid Build Coastguard Worker  }
8909*6777b538SAndroid Build Coastguard Worker}
8910*6777b538SAndroid Build Coastguard Worker
8911*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8912*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8913*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8914*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
8915*6777b538SAndroid Build Coastguard Worker    return 0;
8916*6777b538SAndroid Build Coastguard Worker  }
8917*6777b538SAndroid Build Coastguard Worker
8918*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8919*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8920*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
8921*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8922*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8923*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8924*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8925*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
8926*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
8927*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8928*6777b538SAndroid Build Coastguard Worker  }
8929*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8930*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
8931*6777b538SAndroid Build Coastguard Worker  return result;
8932*6777b538SAndroid Build Coastguard Worker}
8933*6777b538SAndroid Build Coastguard Worker
8934*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8935*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8936*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8937*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8938*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8939*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8940*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8941*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
8942*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8943*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8944*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8945*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
8946*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
8947*6777b538SAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
8948*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8949*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8950*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8951*6777b538SAndroid Build Coastguard Worker    // Write the fields.
8952*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8953*6777b538SAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8954*6777b538SAndroid Build Coastguard Worker  }
8955*6777b538SAndroid Build Coastguard Worker}
8956*6777b538SAndroid Build Coastguard Worker
8957*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8958*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8959*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:key->valueString];
8960*6777b538SAndroid Build Coastguard Worker}
8961*6777b538SAndroid Build Coastguard Worker
8962*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8963*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(NSString *key, uint64_t value, BOOL *stop) {
8964*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
8965*6777b538SAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%llu", value]);
8966*6777b538SAndroid Build Coastguard Worker  }];
8967*6777b538SAndroid Build Coastguard Worker}
8968*6777b538SAndroid Build Coastguard Worker
8969*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(NSString *)key {
8970*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
8971*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
8972*6777b538SAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
8973*6777b538SAndroid Build Coastguard Worker  }
8974*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
8975*6777b538SAndroid Build Coastguard Worker}
8976*6777b538SAndroid Build Coastguard Worker
8977*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringUInt64Dictionary *)otherDictionary {
8978*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
8979*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8980*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
8981*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8982*6777b538SAndroid Build Coastguard Worker    }
8983*6777b538SAndroid Build Coastguard Worker  }
8984*6777b538SAndroid Build Coastguard Worker}
8985*6777b538SAndroid Build Coastguard Worker
8986*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(NSString *)key {
8987*6777b538SAndroid Build Coastguard Worker  if (!key) {
8988*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8989*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
8990*6777b538SAndroid Build Coastguard Worker  }
8991*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
8992*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
8993*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8994*6777b538SAndroid Build Coastguard Worker  }
8995*6777b538SAndroid Build Coastguard Worker}
8996*6777b538SAndroid Build Coastguard Worker
8997*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(NSString *)aKey {
8998*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
8999*6777b538SAndroid Build Coastguard Worker}
9000*6777b538SAndroid Build Coastguard Worker
9001*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
9002*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9003*6777b538SAndroid Build Coastguard Worker}
9004*6777b538SAndroid Build Coastguard Worker
9005*6777b538SAndroid Build Coastguard Worker@end
9006*6777b538SAndroid Build Coastguard Worker
9007*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Int64
9008*6777b538SAndroid Build Coastguard Worker
9009*6777b538SAndroid Build Coastguard Worker@implementation GPBStringInt64Dictionary {
9010*6777b538SAndroid Build Coastguard Worker @package
9011*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9012*6777b538SAndroid Build Coastguard Worker}
9013*6777b538SAndroid Build Coastguard Worker
9014*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
9015*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
9016*6777b538SAndroid Build Coastguard Worker}
9017*6777b538SAndroid Build Coastguard Worker
9018*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
9019*6777b538SAndroid Build Coastguard Worker                       forKeys:(const NSString * [])keys
9020*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
9021*6777b538SAndroid Build Coastguard Worker  self = [super init];
9022*6777b538SAndroid Build Coastguard Worker  if (self) {
9023*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9024*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
9025*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9026*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
9027*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9028*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9029*6777b538SAndroid Build Coastguard Worker        }
9030*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9031*6777b538SAndroid Build Coastguard Worker      }
9032*6777b538SAndroid Build Coastguard Worker    }
9033*6777b538SAndroid Build Coastguard Worker  }
9034*6777b538SAndroid Build Coastguard Worker  return self;
9035*6777b538SAndroid Build Coastguard Worker}
9036*6777b538SAndroid Build Coastguard Worker
9037*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringInt64Dictionary *)dictionary {
9038*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
9039*6777b538SAndroid Build Coastguard Worker  if (self) {
9040*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
9041*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9042*6777b538SAndroid Build Coastguard Worker    }
9043*6777b538SAndroid Build Coastguard Worker  }
9044*6777b538SAndroid Build Coastguard Worker  return self;
9045*6777b538SAndroid Build Coastguard Worker}
9046*6777b538SAndroid Build Coastguard Worker
9047*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9048*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
9049*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
9050*6777b538SAndroid Build Coastguard Worker}
9051*6777b538SAndroid Build Coastguard Worker
9052*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
9053*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9054*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9055*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
9056*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
9057*6777b538SAndroid Build Coastguard Worker  [super dealloc];
9058*6777b538SAndroid Build Coastguard Worker}
9059*6777b538SAndroid Build Coastguard Worker
9060*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9061*6777b538SAndroid Build Coastguard Worker  return [[GPBStringInt64Dictionary allocWithZone:zone] initWithDictionary:self];
9062*6777b538SAndroid Build Coastguard Worker}
9063*6777b538SAndroid Build Coastguard Worker
9064*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9065*6777b538SAndroid Build Coastguard Worker  if (self == other) {
9066*6777b538SAndroid Build Coastguard Worker    return YES;
9067*6777b538SAndroid Build Coastguard Worker  }
9068*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringInt64Dictionary class]]) {
9069*6777b538SAndroid Build Coastguard Worker    return NO;
9070*6777b538SAndroid Build Coastguard Worker  }
9071*6777b538SAndroid Build Coastguard Worker  GPBStringInt64Dictionary *otherDictionary = other;
9072*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9073*6777b538SAndroid Build Coastguard Worker}
9074*6777b538SAndroid Build Coastguard Worker
9075*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
9076*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9077*6777b538SAndroid Build Coastguard Worker}
9078*6777b538SAndroid Build Coastguard Worker
9079*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
9080*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9081*6777b538SAndroid Build Coastguard Worker}
9082*6777b538SAndroid Build Coastguard Worker
9083*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
9084*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9085*6777b538SAndroid Build Coastguard Worker}
9086*6777b538SAndroid Build Coastguard Worker
9087*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
9088*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int64_t value, BOOL *stop))block {
9089*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
9090*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9091*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9092*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9093*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9094*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9095*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue longLongValue], &stop);
9096*6777b538SAndroid Build Coastguard Worker    if (stop) {
9097*6777b538SAndroid Build Coastguard Worker      break;
9098*6777b538SAndroid Build Coastguard Worker    }
9099*6777b538SAndroid Build Coastguard Worker  }
9100*6777b538SAndroid Build Coastguard Worker}
9101*6777b538SAndroid Build Coastguard Worker
9102*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9103*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9104*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9105*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
9106*6777b538SAndroid Build Coastguard Worker    return 0;
9107*6777b538SAndroid Build Coastguard Worker  }
9108*6777b538SAndroid Build Coastguard Worker
9109*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9110*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9111*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
9112*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9113*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9114*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9115*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9116*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9117*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
9118*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9119*6777b538SAndroid Build Coastguard Worker  }
9120*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9121*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
9122*6777b538SAndroid Build Coastguard Worker  return result;
9123*6777b538SAndroid Build Coastguard Worker}
9124*6777b538SAndroid Build Coastguard Worker
9125*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9126*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9127*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9128*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9129*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9130*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9131*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9132*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9133*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9134*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9135*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9136*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
9137*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9138*6777b538SAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
9139*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9140*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9141*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9142*6777b538SAndroid Build Coastguard Worker    // Write the fields.
9143*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9144*6777b538SAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9145*6777b538SAndroid Build Coastguard Worker  }
9146*6777b538SAndroid Build Coastguard Worker}
9147*6777b538SAndroid Build Coastguard Worker
9148*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9149*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9150*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:key->valueString];
9151*6777b538SAndroid Build Coastguard Worker}
9152*6777b538SAndroid Build Coastguard Worker
9153*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9154*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(NSString *key, int64_t value, BOOL *stop) {
9155*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
9156*6777b538SAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%lld", value]);
9157*6777b538SAndroid Build Coastguard Worker  }];
9158*6777b538SAndroid Build Coastguard Worker}
9159*6777b538SAndroid Build Coastguard Worker
9160*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(NSString *)key {
9161*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9162*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
9163*6777b538SAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
9164*6777b538SAndroid Build Coastguard Worker  }
9165*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
9166*6777b538SAndroid Build Coastguard Worker}
9167*6777b538SAndroid Build Coastguard Worker
9168*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringInt64Dictionary *)otherDictionary {
9169*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
9170*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9171*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
9172*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9173*6777b538SAndroid Build Coastguard Worker    }
9174*6777b538SAndroid Build Coastguard Worker  }
9175*6777b538SAndroid Build Coastguard Worker}
9176*6777b538SAndroid Build Coastguard Worker
9177*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(NSString *)key {
9178*6777b538SAndroid Build Coastguard Worker  if (!key) {
9179*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9180*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9181*6777b538SAndroid Build Coastguard Worker  }
9182*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9183*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
9184*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9185*6777b538SAndroid Build Coastguard Worker  }
9186*6777b538SAndroid Build Coastguard Worker}
9187*6777b538SAndroid Build Coastguard Worker
9188*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(NSString *)aKey {
9189*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9190*6777b538SAndroid Build Coastguard Worker}
9191*6777b538SAndroid Build Coastguard Worker
9192*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
9193*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9194*6777b538SAndroid Build Coastguard Worker}
9195*6777b538SAndroid Build Coastguard Worker
9196*6777b538SAndroid Build Coastguard Worker@end
9197*6777b538SAndroid Build Coastguard Worker
9198*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Bool
9199*6777b538SAndroid Build Coastguard Worker
9200*6777b538SAndroid Build Coastguard Worker@implementation GPBStringBoolDictionary {
9201*6777b538SAndroid Build Coastguard Worker @package
9202*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9203*6777b538SAndroid Build Coastguard Worker}
9204*6777b538SAndroid Build Coastguard Worker
9205*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
9206*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
9207*6777b538SAndroid Build Coastguard Worker}
9208*6777b538SAndroid Build Coastguard Worker
9209*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
9210*6777b538SAndroid Build Coastguard Worker                      forKeys:(const NSString * [])keys
9211*6777b538SAndroid Build Coastguard Worker                        count:(NSUInteger)count {
9212*6777b538SAndroid Build Coastguard Worker  self = [super init];
9213*6777b538SAndroid Build Coastguard Worker  if (self) {
9214*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9215*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
9216*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9217*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
9218*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9219*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9220*6777b538SAndroid Build Coastguard Worker        }
9221*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9222*6777b538SAndroid Build Coastguard Worker      }
9223*6777b538SAndroid Build Coastguard Worker    }
9224*6777b538SAndroid Build Coastguard Worker  }
9225*6777b538SAndroid Build Coastguard Worker  return self;
9226*6777b538SAndroid Build Coastguard Worker}
9227*6777b538SAndroid Build Coastguard Worker
9228*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringBoolDictionary *)dictionary {
9229*6777b538SAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
9230*6777b538SAndroid Build Coastguard Worker  if (self) {
9231*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
9232*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9233*6777b538SAndroid Build Coastguard Worker    }
9234*6777b538SAndroid Build Coastguard Worker  }
9235*6777b538SAndroid Build Coastguard Worker  return self;
9236*6777b538SAndroid Build Coastguard Worker}
9237*6777b538SAndroid Build Coastguard Worker
9238*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9239*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
9240*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
9241*6777b538SAndroid Build Coastguard Worker}
9242*6777b538SAndroid Build Coastguard Worker
9243*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
9244*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9245*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9246*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
9247*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
9248*6777b538SAndroid Build Coastguard Worker  [super dealloc];
9249*6777b538SAndroid Build Coastguard Worker}
9250*6777b538SAndroid Build Coastguard Worker
9251*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9252*6777b538SAndroid Build Coastguard Worker  return [[GPBStringBoolDictionary allocWithZone:zone] initWithDictionary:self];
9253*6777b538SAndroid Build Coastguard Worker}
9254*6777b538SAndroid Build Coastguard Worker
9255*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9256*6777b538SAndroid Build Coastguard Worker  if (self == other) {
9257*6777b538SAndroid Build Coastguard Worker    return YES;
9258*6777b538SAndroid Build Coastguard Worker  }
9259*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringBoolDictionary class]]) {
9260*6777b538SAndroid Build Coastguard Worker    return NO;
9261*6777b538SAndroid Build Coastguard Worker  }
9262*6777b538SAndroid Build Coastguard Worker  GPBStringBoolDictionary *otherDictionary = other;
9263*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9264*6777b538SAndroid Build Coastguard Worker}
9265*6777b538SAndroid Build Coastguard Worker
9266*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
9267*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9268*6777b538SAndroid Build Coastguard Worker}
9269*6777b538SAndroid Build Coastguard Worker
9270*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
9271*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9272*6777b538SAndroid Build Coastguard Worker}
9273*6777b538SAndroid Build Coastguard Worker
9274*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
9275*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9276*6777b538SAndroid Build Coastguard Worker}
9277*6777b538SAndroid Build Coastguard Worker
9278*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
9279*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, BOOL value, BOOL *stop))block {
9280*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
9281*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9282*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9283*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9284*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9285*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9286*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue boolValue], &stop);
9287*6777b538SAndroid Build Coastguard Worker    if (stop) {
9288*6777b538SAndroid Build Coastguard Worker      break;
9289*6777b538SAndroid Build Coastguard Worker    }
9290*6777b538SAndroid Build Coastguard Worker  }
9291*6777b538SAndroid Build Coastguard Worker}
9292*6777b538SAndroid Build Coastguard Worker
9293*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9294*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9295*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9296*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
9297*6777b538SAndroid Build Coastguard Worker    return 0;
9298*6777b538SAndroid Build Coastguard Worker  }
9299*6777b538SAndroid Build Coastguard Worker
9300*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9301*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9302*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
9303*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9304*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9305*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9306*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9307*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9308*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
9309*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9310*6777b538SAndroid Build Coastguard Worker  }
9311*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9312*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
9313*6777b538SAndroid Build Coastguard Worker  return result;
9314*6777b538SAndroid Build Coastguard Worker}
9315*6777b538SAndroid Build Coastguard Worker
9316*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9317*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9318*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9319*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9320*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9321*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9322*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9323*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9324*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9325*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9326*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9327*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
9328*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9329*6777b538SAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
9330*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9331*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9332*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9333*6777b538SAndroid Build Coastguard Worker    // Write the fields.
9334*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9335*6777b538SAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9336*6777b538SAndroid Build Coastguard Worker  }
9337*6777b538SAndroid Build Coastguard Worker}
9338*6777b538SAndroid Build Coastguard Worker
9339*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9340*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9341*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:key->valueString];
9342*6777b538SAndroid Build Coastguard Worker}
9343*6777b538SAndroid Build Coastguard Worker
9344*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9345*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(NSString *key, BOOL value, BOOL *stop) {
9346*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
9347*6777b538SAndroid Build Coastguard Worker      block(key, (value ? @"true" : @"false"));
9348*6777b538SAndroid Build Coastguard Worker  }];
9349*6777b538SAndroid Build Coastguard Worker}
9350*6777b538SAndroid Build Coastguard Worker
9351*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(NSString *)key {
9352*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9353*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
9354*6777b538SAndroid Build Coastguard Worker    *value = [wrapped boolValue];
9355*6777b538SAndroid Build Coastguard Worker  }
9356*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
9357*6777b538SAndroid Build Coastguard Worker}
9358*6777b538SAndroid Build Coastguard Worker
9359*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringBoolDictionary *)otherDictionary {
9360*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
9361*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9362*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
9363*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9364*6777b538SAndroid Build Coastguard Worker    }
9365*6777b538SAndroid Build Coastguard Worker  }
9366*6777b538SAndroid Build Coastguard Worker}
9367*6777b538SAndroid Build Coastguard Worker
9368*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(NSString *)key {
9369*6777b538SAndroid Build Coastguard Worker  if (!key) {
9370*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9371*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9372*6777b538SAndroid Build Coastguard Worker  }
9373*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9374*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
9375*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9376*6777b538SAndroid Build Coastguard Worker  }
9377*6777b538SAndroid Build Coastguard Worker}
9378*6777b538SAndroid Build Coastguard Worker
9379*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(NSString *)aKey {
9380*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9381*6777b538SAndroid Build Coastguard Worker}
9382*6777b538SAndroid Build Coastguard Worker
9383*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
9384*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9385*6777b538SAndroid Build Coastguard Worker}
9386*6777b538SAndroid Build Coastguard Worker
9387*6777b538SAndroid Build Coastguard Worker@end
9388*6777b538SAndroid Build Coastguard Worker
9389*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Float
9390*6777b538SAndroid Build Coastguard Worker
9391*6777b538SAndroid Build Coastguard Worker@implementation GPBStringFloatDictionary {
9392*6777b538SAndroid Build Coastguard Worker @package
9393*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9394*6777b538SAndroid Build Coastguard Worker}
9395*6777b538SAndroid Build Coastguard Worker
9396*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
9397*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
9398*6777b538SAndroid Build Coastguard Worker}
9399*6777b538SAndroid Build Coastguard Worker
9400*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
9401*6777b538SAndroid Build Coastguard Worker                       forKeys:(const NSString * [])keys
9402*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
9403*6777b538SAndroid Build Coastguard Worker  self = [super init];
9404*6777b538SAndroid Build Coastguard Worker  if (self) {
9405*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9406*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
9407*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9408*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
9409*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9410*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9411*6777b538SAndroid Build Coastguard Worker        }
9412*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9413*6777b538SAndroid Build Coastguard Worker      }
9414*6777b538SAndroid Build Coastguard Worker    }
9415*6777b538SAndroid Build Coastguard Worker  }
9416*6777b538SAndroid Build Coastguard Worker  return self;
9417*6777b538SAndroid Build Coastguard Worker}
9418*6777b538SAndroid Build Coastguard Worker
9419*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringFloatDictionary *)dictionary {
9420*6777b538SAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
9421*6777b538SAndroid Build Coastguard Worker  if (self) {
9422*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
9423*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9424*6777b538SAndroid Build Coastguard Worker    }
9425*6777b538SAndroid Build Coastguard Worker  }
9426*6777b538SAndroid Build Coastguard Worker  return self;
9427*6777b538SAndroid Build Coastguard Worker}
9428*6777b538SAndroid Build Coastguard Worker
9429*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9430*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
9431*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
9432*6777b538SAndroid Build Coastguard Worker}
9433*6777b538SAndroid Build Coastguard Worker
9434*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
9435*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9436*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9437*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
9438*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
9439*6777b538SAndroid Build Coastguard Worker  [super dealloc];
9440*6777b538SAndroid Build Coastguard Worker}
9441*6777b538SAndroid Build Coastguard Worker
9442*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9443*6777b538SAndroid Build Coastguard Worker  return [[GPBStringFloatDictionary allocWithZone:zone] initWithDictionary:self];
9444*6777b538SAndroid Build Coastguard Worker}
9445*6777b538SAndroid Build Coastguard Worker
9446*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9447*6777b538SAndroid Build Coastguard Worker  if (self == other) {
9448*6777b538SAndroid Build Coastguard Worker    return YES;
9449*6777b538SAndroid Build Coastguard Worker  }
9450*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringFloatDictionary class]]) {
9451*6777b538SAndroid Build Coastguard Worker    return NO;
9452*6777b538SAndroid Build Coastguard Worker  }
9453*6777b538SAndroid Build Coastguard Worker  GPBStringFloatDictionary *otherDictionary = other;
9454*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9455*6777b538SAndroid Build Coastguard Worker}
9456*6777b538SAndroid Build Coastguard Worker
9457*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
9458*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9459*6777b538SAndroid Build Coastguard Worker}
9460*6777b538SAndroid Build Coastguard Worker
9461*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
9462*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9463*6777b538SAndroid Build Coastguard Worker}
9464*6777b538SAndroid Build Coastguard Worker
9465*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
9466*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9467*6777b538SAndroid Build Coastguard Worker}
9468*6777b538SAndroid Build Coastguard Worker
9469*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
9470*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, float value, BOOL *stop))block {
9471*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
9472*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9473*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9474*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9475*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9476*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9477*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue floatValue], &stop);
9478*6777b538SAndroid Build Coastguard Worker    if (stop) {
9479*6777b538SAndroid Build Coastguard Worker      break;
9480*6777b538SAndroid Build Coastguard Worker    }
9481*6777b538SAndroid Build Coastguard Worker  }
9482*6777b538SAndroid Build Coastguard Worker}
9483*6777b538SAndroid Build Coastguard Worker
9484*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9485*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9486*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9487*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
9488*6777b538SAndroid Build Coastguard Worker    return 0;
9489*6777b538SAndroid Build Coastguard Worker  }
9490*6777b538SAndroid Build Coastguard Worker
9491*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9492*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9493*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
9494*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9495*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9496*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9497*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9498*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9499*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
9500*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9501*6777b538SAndroid Build Coastguard Worker  }
9502*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9503*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
9504*6777b538SAndroid Build Coastguard Worker  return result;
9505*6777b538SAndroid Build Coastguard Worker}
9506*6777b538SAndroid Build Coastguard Worker
9507*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9508*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9509*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9510*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9511*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9512*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9513*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9514*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9515*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9516*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9517*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9518*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
9519*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9520*6777b538SAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
9521*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9522*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9523*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9524*6777b538SAndroid Build Coastguard Worker    // Write the fields.
9525*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9526*6777b538SAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9527*6777b538SAndroid Build Coastguard Worker  }
9528*6777b538SAndroid Build Coastguard Worker}
9529*6777b538SAndroid Build Coastguard Worker
9530*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9531*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9532*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:key->valueString];
9533*6777b538SAndroid Build Coastguard Worker}
9534*6777b538SAndroid Build Coastguard Worker
9535*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9536*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(NSString *key, float value, BOOL *stop) {
9537*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
9538*6777b538SAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
9539*6777b538SAndroid Build Coastguard Worker  }];
9540*6777b538SAndroid Build Coastguard Worker}
9541*6777b538SAndroid Build Coastguard Worker
9542*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(NSString *)key {
9543*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9544*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
9545*6777b538SAndroid Build Coastguard Worker    *value = [wrapped floatValue];
9546*6777b538SAndroid Build Coastguard Worker  }
9547*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
9548*6777b538SAndroid Build Coastguard Worker}
9549*6777b538SAndroid Build Coastguard Worker
9550*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringFloatDictionary *)otherDictionary {
9551*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
9552*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9553*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
9554*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9555*6777b538SAndroid Build Coastguard Worker    }
9556*6777b538SAndroid Build Coastguard Worker  }
9557*6777b538SAndroid Build Coastguard Worker}
9558*6777b538SAndroid Build Coastguard Worker
9559*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(NSString *)key {
9560*6777b538SAndroid Build Coastguard Worker  if (!key) {
9561*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9562*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9563*6777b538SAndroid Build Coastguard Worker  }
9564*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9565*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
9566*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9567*6777b538SAndroid Build Coastguard Worker  }
9568*6777b538SAndroid Build Coastguard Worker}
9569*6777b538SAndroid Build Coastguard Worker
9570*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(NSString *)aKey {
9571*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9572*6777b538SAndroid Build Coastguard Worker}
9573*6777b538SAndroid Build Coastguard Worker
9574*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
9575*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9576*6777b538SAndroid Build Coastguard Worker}
9577*6777b538SAndroid Build Coastguard Worker
9578*6777b538SAndroid Build Coastguard Worker@end
9579*6777b538SAndroid Build Coastguard Worker
9580*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Double
9581*6777b538SAndroid Build Coastguard Worker
9582*6777b538SAndroid Build Coastguard Worker@implementation GPBStringDoubleDictionary {
9583*6777b538SAndroid Build Coastguard Worker @package
9584*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9585*6777b538SAndroid Build Coastguard Worker}
9586*6777b538SAndroid Build Coastguard Worker
9587*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
9588*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
9589*6777b538SAndroid Build Coastguard Worker}
9590*6777b538SAndroid Build Coastguard Worker
9591*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
9592*6777b538SAndroid Build Coastguard Worker                        forKeys:(const NSString * [])keys
9593*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
9594*6777b538SAndroid Build Coastguard Worker  self = [super init];
9595*6777b538SAndroid Build Coastguard Worker  if (self) {
9596*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9597*6777b538SAndroid Build Coastguard Worker    if (count && values && keys) {
9598*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9599*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
9600*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9601*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9602*6777b538SAndroid Build Coastguard Worker        }
9603*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9604*6777b538SAndroid Build Coastguard Worker      }
9605*6777b538SAndroid Build Coastguard Worker    }
9606*6777b538SAndroid Build Coastguard Worker  }
9607*6777b538SAndroid Build Coastguard Worker  return self;
9608*6777b538SAndroid Build Coastguard Worker}
9609*6777b538SAndroid Build Coastguard Worker
9610*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringDoubleDictionary *)dictionary {
9611*6777b538SAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
9612*6777b538SAndroid Build Coastguard Worker  if (self) {
9613*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
9614*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9615*6777b538SAndroid Build Coastguard Worker    }
9616*6777b538SAndroid Build Coastguard Worker  }
9617*6777b538SAndroid Build Coastguard Worker  return self;
9618*6777b538SAndroid Build Coastguard Worker}
9619*6777b538SAndroid Build Coastguard Worker
9620*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9621*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
9622*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
9623*6777b538SAndroid Build Coastguard Worker}
9624*6777b538SAndroid Build Coastguard Worker
9625*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
9626*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9627*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9628*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
9629*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
9630*6777b538SAndroid Build Coastguard Worker  [super dealloc];
9631*6777b538SAndroid Build Coastguard Worker}
9632*6777b538SAndroid Build Coastguard Worker
9633*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9634*6777b538SAndroid Build Coastguard Worker  return [[GPBStringDoubleDictionary allocWithZone:zone] initWithDictionary:self];
9635*6777b538SAndroid Build Coastguard Worker}
9636*6777b538SAndroid Build Coastguard Worker
9637*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9638*6777b538SAndroid Build Coastguard Worker  if (self == other) {
9639*6777b538SAndroid Build Coastguard Worker    return YES;
9640*6777b538SAndroid Build Coastguard Worker  }
9641*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringDoubleDictionary class]]) {
9642*6777b538SAndroid Build Coastguard Worker    return NO;
9643*6777b538SAndroid Build Coastguard Worker  }
9644*6777b538SAndroid Build Coastguard Worker  GPBStringDoubleDictionary *otherDictionary = other;
9645*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9646*6777b538SAndroid Build Coastguard Worker}
9647*6777b538SAndroid Build Coastguard Worker
9648*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
9649*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9650*6777b538SAndroid Build Coastguard Worker}
9651*6777b538SAndroid Build Coastguard Worker
9652*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
9653*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9654*6777b538SAndroid Build Coastguard Worker}
9655*6777b538SAndroid Build Coastguard Worker
9656*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
9657*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9658*6777b538SAndroid Build Coastguard Worker}
9659*6777b538SAndroid Build Coastguard Worker
9660*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
9661*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, double value, BOOL *stop))block {
9662*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
9663*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9664*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9665*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9666*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9667*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9668*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue doubleValue], &stop);
9669*6777b538SAndroid Build Coastguard Worker    if (stop) {
9670*6777b538SAndroid Build Coastguard Worker      break;
9671*6777b538SAndroid Build Coastguard Worker    }
9672*6777b538SAndroid Build Coastguard Worker  }
9673*6777b538SAndroid Build Coastguard Worker}
9674*6777b538SAndroid Build Coastguard Worker
9675*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9676*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9677*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9678*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
9679*6777b538SAndroid Build Coastguard Worker    return 0;
9680*6777b538SAndroid Build Coastguard Worker  }
9681*6777b538SAndroid Build Coastguard Worker
9682*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9683*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9684*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
9685*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9686*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9687*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9688*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9689*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9690*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
9691*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9692*6777b538SAndroid Build Coastguard Worker  }
9693*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9694*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
9695*6777b538SAndroid Build Coastguard Worker  return result;
9696*6777b538SAndroid Build Coastguard Worker}
9697*6777b538SAndroid Build Coastguard Worker
9698*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9699*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9700*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9701*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9702*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9703*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9704*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9705*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9706*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9707*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9708*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9709*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
9710*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9711*6777b538SAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
9712*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9713*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9714*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9715*6777b538SAndroid Build Coastguard Worker    // Write the fields.
9716*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9717*6777b538SAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9718*6777b538SAndroid Build Coastguard Worker  }
9719*6777b538SAndroid Build Coastguard Worker}
9720*6777b538SAndroid Build Coastguard Worker
9721*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9722*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9723*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:key->valueString];
9724*6777b538SAndroid Build Coastguard Worker}
9725*6777b538SAndroid Build Coastguard Worker
9726*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9727*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(NSString *key, double value, BOOL *stop) {
9728*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
9729*6777b538SAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
9730*6777b538SAndroid Build Coastguard Worker  }];
9731*6777b538SAndroid Build Coastguard Worker}
9732*6777b538SAndroid Build Coastguard Worker
9733*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(NSString *)key {
9734*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9735*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
9736*6777b538SAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
9737*6777b538SAndroid Build Coastguard Worker  }
9738*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
9739*6777b538SAndroid Build Coastguard Worker}
9740*6777b538SAndroid Build Coastguard Worker
9741*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringDoubleDictionary *)otherDictionary {
9742*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
9743*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9744*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
9745*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9746*6777b538SAndroid Build Coastguard Worker    }
9747*6777b538SAndroid Build Coastguard Worker  }
9748*6777b538SAndroid Build Coastguard Worker}
9749*6777b538SAndroid Build Coastguard Worker
9750*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(NSString *)key {
9751*6777b538SAndroid Build Coastguard Worker  if (!key) {
9752*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9753*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9754*6777b538SAndroid Build Coastguard Worker  }
9755*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9756*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
9757*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9758*6777b538SAndroid Build Coastguard Worker  }
9759*6777b538SAndroid Build Coastguard Worker}
9760*6777b538SAndroid Build Coastguard Worker
9761*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(NSString *)aKey {
9762*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9763*6777b538SAndroid Build Coastguard Worker}
9764*6777b538SAndroid Build Coastguard Worker
9765*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
9766*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9767*6777b538SAndroid Build Coastguard Worker}
9768*6777b538SAndroid Build Coastguard Worker
9769*6777b538SAndroid Build Coastguard Worker@end
9770*6777b538SAndroid Build Coastguard Worker
9771*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Enum
9772*6777b538SAndroid Build Coastguard Worker
9773*6777b538SAndroid Build Coastguard Worker@implementation GPBStringEnumDictionary {
9774*6777b538SAndroid Build Coastguard Worker @package
9775*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9776*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
9777*6777b538SAndroid Build Coastguard Worker}
9778*6777b538SAndroid Build Coastguard Worker
9779*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
9780*6777b538SAndroid Build Coastguard Worker
9781*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
9782*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
9783*6777b538SAndroid Build Coastguard Worker}
9784*6777b538SAndroid Build Coastguard Worker
9785*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
9786*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
9787*6777b538SAndroid Build Coastguard Worker}
9788*6777b538SAndroid Build Coastguard Worker
9789*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
9790*6777b538SAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
9791*6777b538SAndroid Build Coastguard Worker                                   forKeys:(const NSString * [])keys
9792*6777b538SAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
9793*6777b538SAndroid Build Coastguard Worker  self = [super init];
9794*6777b538SAndroid Build Coastguard Worker  if (self) {
9795*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9796*6777b538SAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
9797*6777b538SAndroid Build Coastguard Worker    if (count && rawValues && keys) {
9798*6777b538SAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9799*6777b538SAndroid Build Coastguard Worker        if (!keys[i]) {
9800*6777b538SAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9801*6777b538SAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9802*6777b538SAndroid Build Coastguard Worker        }
9803*6777b538SAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:keys[i]];
9804*6777b538SAndroid Build Coastguard Worker      }
9805*6777b538SAndroid Build Coastguard Worker    }
9806*6777b538SAndroid Build Coastguard Worker  }
9807*6777b538SAndroid Build Coastguard Worker  return self;
9808*6777b538SAndroid Build Coastguard Worker}
9809*6777b538SAndroid Build Coastguard Worker
9810*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringEnumDictionary *)dictionary {
9811*6777b538SAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
9812*6777b538SAndroid Build Coastguard Worker                                rawValues:NULL
9813*6777b538SAndroid Build Coastguard Worker                                  forKeys:NULL
9814*6777b538SAndroid Build Coastguard Worker                                    count:0];
9815*6777b538SAndroid Build Coastguard Worker  if (self) {
9816*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
9817*6777b538SAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9818*6777b538SAndroid Build Coastguard Worker    }
9819*6777b538SAndroid Build Coastguard Worker  }
9820*6777b538SAndroid Build Coastguard Worker  return self;
9821*6777b538SAndroid Build Coastguard Worker}
9822*6777b538SAndroid Build Coastguard Worker
9823*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
9824*6777b538SAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
9825*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
9826*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
9827*6777b538SAndroid Build Coastguard Worker}
9828*6777b538SAndroid Build Coastguard Worker
9829*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
9830*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9831*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9832*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
9833*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
9834*6777b538SAndroid Build Coastguard Worker  [super dealloc];
9835*6777b538SAndroid Build Coastguard Worker}
9836*6777b538SAndroid Build Coastguard Worker
9837*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9838*6777b538SAndroid Build Coastguard Worker  return [[GPBStringEnumDictionary allocWithZone:zone] initWithDictionary:self];
9839*6777b538SAndroid Build Coastguard Worker}
9840*6777b538SAndroid Build Coastguard Worker
9841*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9842*6777b538SAndroid Build Coastguard Worker  if (self == other) {
9843*6777b538SAndroid Build Coastguard Worker    return YES;
9844*6777b538SAndroid Build Coastguard Worker  }
9845*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringEnumDictionary class]]) {
9846*6777b538SAndroid Build Coastguard Worker    return NO;
9847*6777b538SAndroid Build Coastguard Worker  }
9848*6777b538SAndroid Build Coastguard Worker  GPBStringEnumDictionary *otherDictionary = other;
9849*6777b538SAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9850*6777b538SAndroid Build Coastguard Worker}
9851*6777b538SAndroid Build Coastguard Worker
9852*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
9853*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9854*6777b538SAndroid Build Coastguard Worker}
9855*6777b538SAndroid Build Coastguard Worker
9856*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
9857*6777b538SAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9858*6777b538SAndroid Build Coastguard Worker}
9859*6777b538SAndroid Build Coastguard Worker
9860*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
9861*6777b538SAndroid Build Coastguard Worker  return _dictionary.count;
9862*6777b538SAndroid Build Coastguard Worker}
9863*6777b538SAndroid Build Coastguard Worker
9864*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
9865*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block {
9866*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
9867*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9868*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9869*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9870*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9871*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9872*6777b538SAndroid Build Coastguard Worker    block(aKey, [aValue intValue], &stop);
9873*6777b538SAndroid Build Coastguard Worker    if (stop) {
9874*6777b538SAndroid Build Coastguard Worker      break;
9875*6777b538SAndroid Build Coastguard Worker    }
9876*6777b538SAndroid Build Coastguard Worker  }
9877*6777b538SAndroid Build Coastguard Worker}
9878*6777b538SAndroid Build Coastguard Worker
9879*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9880*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9881*6777b538SAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9882*6777b538SAndroid Build Coastguard Worker  if (count == 0) {
9883*6777b538SAndroid Build Coastguard Worker    return 0;
9884*6777b538SAndroid Build Coastguard Worker  }
9885*6777b538SAndroid Build Coastguard Worker
9886*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9887*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9888*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
9889*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9890*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9891*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9892*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9893*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9894*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
9895*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9896*6777b538SAndroid Build Coastguard Worker  }
9897*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9898*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
9899*6777b538SAndroid Build Coastguard Worker  return result;
9900*6777b538SAndroid Build Coastguard Worker}
9901*6777b538SAndroid Build Coastguard Worker
9902*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9903*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9904*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9905*6777b538SAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9906*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9907*6777b538SAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9908*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9909*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9910*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9911*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9912*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9913*6777b538SAndroid Build Coastguard Worker    // Write the size of the message.
9914*6777b538SAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9915*6777b538SAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
9916*6777b538SAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9917*6777b538SAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9918*6777b538SAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9919*6777b538SAndroid Build Coastguard Worker    // Write the fields.
9920*6777b538SAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9921*6777b538SAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9922*6777b538SAndroid Build Coastguard Worker  }
9923*6777b538SAndroid Build Coastguard Worker}
9924*6777b538SAndroid Build Coastguard Worker
9925*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
9926*6777b538SAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
9927*6777b538SAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
9928*6777b538SAndroid Build Coastguard Worker  size_t msgSize = ComputeDictStringFieldSize(key->valueString, kMapKeyFieldNumber, keyDataType);
9929*6777b538SAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
9930*6777b538SAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
9931*6777b538SAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
9932*6777b538SAndroid Build Coastguard Worker  WriteDictStringField(outputStream, key->valueString, kMapKeyFieldNumber, keyDataType);
9933*6777b538SAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
9934*6777b538SAndroid Build Coastguard Worker  [outputStream release];
9935*6777b538SAndroid Build Coastguard Worker  return data;
9936*6777b538SAndroid Build Coastguard Worker}
9937*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9938*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9939*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:key->valueString];
9940*6777b538SAndroid Build Coastguard Worker}
9941*6777b538SAndroid Build Coastguard Worker
9942*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9943*6777b538SAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
9944*6777b538SAndroid Build Coastguard Worker      #pragma unused(stop)
9945*6777b538SAndroid Build Coastguard Worker      block(key, @(value));
9946*6777b538SAndroid Build Coastguard Worker  }];
9947*6777b538SAndroid Build Coastguard Worker}
9948*6777b538SAndroid Build Coastguard Worker
9949*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(NSString *)key {
9950*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9951*6777b538SAndroid Build Coastguard Worker  if (wrapped && value) {
9952*6777b538SAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
9953*6777b538SAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
9954*6777b538SAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
9955*6777b538SAndroid Build Coastguard Worker    }
9956*6777b538SAndroid Build Coastguard Worker    *value = result;
9957*6777b538SAndroid Build Coastguard Worker  }
9958*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
9959*6777b538SAndroid Build Coastguard Worker}
9960*6777b538SAndroid Build Coastguard Worker
9961*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(NSString *)key {
9962*6777b538SAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9963*6777b538SAndroid Build Coastguard Worker  if (wrapped && rawValue) {
9964*6777b538SAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
9965*6777b538SAndroid Build Coastguard Worker  }
9966*6777b538SAndroid Build Coastguard Worker  return (wrapped != NULL);
9967*6777b538SAndroid Build Coastguard Worker}
9968*6777b538SAndroid Build Coastguard Worker
9969*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
9970*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block {
9971*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
9972*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
9973*6777b538SAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
9974*6777b538SAndroid Build Coastguard Worker  NSString *aKey;
9975*6777b538SAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9976*6777b538SAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
9977*6777b538SAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
9978*6777b538SAndroid Build Coastguard Worker      if (!func(unwrapped)) {
9979*6777b538SAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
9980*6777b538SAndroid Build Coastguard Worker      }
9981*6777b538SAndroid Build Coastguard Worker    block(aKey, unwrapped, &stop);
9982*6777b538SAndroid Build Coastguard Worker    if (stop) {
9983*6777b538SAndroid Build Coastguard Worker      break;
9984*6777b538SAndroid Build Coastguard Worker    }
9985*6777b538SAndroid Build Coastguard Worker  }
9986*6777b538SAndroid Build Coastguard Worker}
9987*6777b538SAndroid Build Coastguard Worker
9988*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBStringEnumDictionary *)otherDictionary {
9989*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
9990*6777b538SAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9991*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
9992*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9993*6777b538SAndroid Build Coastguard Worker    }
9994*6777b538SAndroid Build Coastguard Worker  }
9995*6777b538SAndroid Build Coastguard Worker}
9996*6777b538SAndroid Build Coastguard Worker
9997*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(NSString *)key {
9998*6777b538SAndroid Build Coastguard Worker  if (!key) {
9999*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
10000*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
10001*6777b538SAndroid Build Coastguard Worker  }
10002*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
10003*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
10004*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10005*6777b538SAndroid Build Coastguard Worker  }
10006*6777b538SAndroid Build Coastguard Worker}
10007*6777b538SAndroid Build Coastguard Worker
10008*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(NSString *)aKey {
10009*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
10010*6777b538SAndroid Build Coastguard Worker}
10011*6777b538SAndroid Build Coastguard Worker
10012*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
10013*6777b538SAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
10014*6777b538SAndroid Build Coastguard Worker}
10015*6777b538SAndroid Build Coastguard Worker
10016*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(NSString *)key {
10017*6777b538SAndroid Build Coastguard Worker  if (!key) {
10018*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
10019*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
10020*6777b538SAndroid Build Coastguard Worker  }
10021*6777b538SAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
10022*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
10023*6777b538SAndroid Build Coastguard Worker                format:@"GPBStringEnumDictionary: Attempt to set an unknown enum value (%d)",
10024*6777b538SAndroid Build Coastguard Worker                       value];
10025*6777b538SAndroid Build Coastguard Worker  }
10026*6777b538SAndroid Build Coastguard Worker
10027*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
10028*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
10029*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10030*6777b538SAndroid Build Coastguard Worker  }
10031*6777b538SAndroid Build Coastguard Worker}
10032*6777b538SAndroid Build Coastguard Worker
10033*6777b538SAndroid Build Coastguard Worker@end
10034*6777b538SAndroid Build Coastguard Worker
10035*6777b538SAndroid Build Coastguard Worker// clang-format on
10036*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END (5 expansions)
10037*6777b538SAndroid Build Coastguard Worker
10038*6777b538SAndroid Build Coastguard Worker
10039*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt32, uint32_t)
10040*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10041*6777b538SAndroid Build Coastguard Worker// clang-format off
10042*6777b538SAndroid Build Coastguard Worker
10043*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> UInt32
10044*6777b538SAndroid Build Coastguard Worker
10045*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolUInt32Dictionary {
10046*6777b538SAndroid Build Coastguard Worker @package
10047*6777b538SAndroid Build Coastguard Worker  uint32_t _values[2];
10048*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
10049*6777b538SAndroid Build Coastguard Worker}
10050*6777b538SAndroid Build Coastguard Worker
10051*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
10052*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
10053*6777b538SAndroid Build Coastguard Worker}
10054*6777b538SAndroid Build Coastguard Worker
10055*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
10056*6777b538SAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
10057*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
10058*6777b538SAndroid Build Coastguard Worker  self = [super init];
10059*6777b538SAndroid Build Coastguard Worker  if (self) {
10060*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10061*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10062*6777b538SAndroid Build Coastguard Worker      _values[idx] = values[i];
10063*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10064*6777b538SAndroid Build Coastguard Worker    }
10065*6777b538SAndroid Build Coastguard Worker  }
10066*6777b538SAndroid Build Coastguard Worker  return self;
10067*6777b538SAndroid Build Coastguard Worker}
10068*6777b538SAndroid Build Coastguard Worker
10069*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolUInt32Dictionary *)dictionary {
10070*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
10071*6777b538SAndroid Build Coastguard Worker  if (self) {
10072*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
10073*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10074*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10075*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10076*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
10077*6777b538SAndroid Build Coastguard Worker        }
10078*6777b538SAndroid Build Coastguard Worker      }
10079*6777b538SAndroid Build Coastguard Worker    }
10080*6777b538SAndroid Build Coastguard Worker  }
10081*6777b538SAndroid Build Coastguard Worker  return self;
10082*6777b538SAndroid Build Coastguard Worker}
10083*6777b538SAndroid Build Coastguard Worker
10084*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10085*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
10086*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
10087*6777b538SAndroid Build Coastguard Worker}
10088*6777b538SAndroid Build Coastguard Worker
10089*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10090*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
10091*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10092*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10093*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
10094*6777b538SAndroid Build Coastguard Worker  [super dealloc];
10095*6777b538SAndroid Build Coastguard Worker}
10096*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10097*6777b538SAndroid Build Coastguard Worker
10098*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10099*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolUInt32Dictionary allocWithZone:zone] initWithDictionary:self];
10100*6777b538SAndroid Build Coastguard Worker}
10101*6777b538SAndroid Build Coastguard Worker
10102*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10103*6777b538SAndroid Build Coastguard Worker  if (self == other) {
10104*6777b538SAndroid Build Coastguard Worker    return YES;
10105*6777b538SAndroid Build Coastguard Worker  }
10106*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolUInt32Dictionary class]]) {
10107*6777b538SAndroid Build Coastguard Worker    return NO;
10108*6777b538SAndroid Build Coastguard Worker  }
10109*6777b538SAndroid Build Coastguard Worker  GPBBoolUInt32Dictionary *otherDictionary = other;
10110*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10111*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10112*6777b538SAndroid Build Coastguard Worker    return NO;
10113*6777b538SAndroid Build Coastguard Worker  }
10114*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10115*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10116*6777b538SAndroid Build Coastguard Worker    return NO;
10117*6777b538SAndroid Build Coastguard Worker  }
10118*6777b538SAndroid Build Coastguard Worker  return YES;
10119*6777b538SAndroid Build Coastguard Worker}
10120*6777b538SAndroid Build Coastguard Worker
10121*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
10122*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10123*6777b538SAndroid Build Coastguard Worker}
10124*6777b538SAndroid Build Coastguard Worker
10125*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
10126*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10127*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10128*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %u", _values[0]];
10129*6777b538SAndroid Build Coastguard Worker  }
10130*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10131*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %u", _values[1]];
10132*6777b538SAndroid Build Coastguard Worker  }
10133*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
10134*6777b538SAndroid Build Coastguard Worker  return result;
10135*6777b538SAndroid Build Coastguard Worker}
10136*6777b538SAndroid Build Coastguard Worker
10137*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
10138*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10139*6777b538SAndroid Build Coastguard Worker}
10140*6777b538SAndroid Build Coastguard Worker
10141*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(uint32_t *)value forKey:(BOOL)key {
10142*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10143*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10144*6777b538SAndroid Build Coastguard Worker    if (value) {
10145*6777b538SAndroid Build Coastguard Worker      *value = _values[idx];
10146*6777b538SAndroid Build Coastguard Worker    }
10147*6777b538SAndroid Build Coastguard Worker    return YES;
10148*6777b538SAndroid Build Coastguard Worker  }
10149*6777b538SAndroid Build Coastguard Worker  return NO;
10150*6777b538SAndroid Build Coastguard Worker}
10151*6777b538SAndroid Build Coastguard Worker
10152*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10153*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10154*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10155*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueUInt32;
10156*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10157*6777b538SAndroid Build Coastguard Worker}
10158*6777b538SAndroid Build Coastguard Worker
10159*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10160*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10161*6777b538SAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%u", _values[0]]);
10162*6777b538SAndroid Build Coastguard Worker  }
10163*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10164*6777b538SAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%u", _values[1]]);
10165*6777b538SAndroid Build Coastguard Worker  }
10166*6777b538SAndroid Build Coastguard Worker}
10167*6777b538SAndroid Build Coastguard Worker
10168*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
10169*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, uint32_t value, BOOL *stop))block {
10170*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
10171*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10172*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10173*6777b538SAndroid Build Coastguard Worker  }
10174*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10175*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10176*6777b538SAndroid Build Coastguard Worker  }
10177*6777b538SAndroid Build Coastguard Worker}
10178*6777b538SAndroid Build Coastguard Worker
10179*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10180*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10181*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
10182*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
10183*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10184*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10185*6777b538SAndroid Build Coastguard Worker      ++count;
10186*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10187*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10188*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10189*6777b538SAndroid Build Coastguard Worker    }
10190*6777b538SAndroid Build Coastguard Worker  }
10191*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10192*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
10193*6777b538SAndroid Build Coastguard Worker  return result;
10194*6777b538SAndroid Build Coastguard Worker}
10195*6777b538SAndroid Build Coastguard Worker
10196*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10197*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10198*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10199*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10200*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10201*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10202*6777b538SAndroid Build Coastguard Worker      // Write the tag.
10203*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10204*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
10205*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10206*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10207*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10208*6777b538SAndroid Build Coastguard Worker      // Write the fields.
10209*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10210*6777b538SAndroid Build Coastguard Worker      WriteDictUInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10211*6777b538SAndroid Build Coastguard Worker    }
10212*6777b538SAndroid Build Coastguard Worker  }
10213*6777b538SAndroid Build Coastguard Worker}
10214*6777b538SAndroid Build Coastguard Worker
10215*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolUInt32Dictionary *)otherDictionary {
10216*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
10217*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10218*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10219*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
10220*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10221*6777b538SAndroid Build Coastguard Worker      }
10222*6777b538SAndroid Build Coastguard Worker    }
10223*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
10224*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10225*6777b538SAndroid Build Coastguard Worker    }
10226*6777b538SAndroid Build Coastguard Worker  }
10227*6777b538SAndroid Build Coastguard Worker}
10228*6777b538SAndroid Build Coastguard Worker
10229*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(BOOL)key {
10230*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10231*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
10232*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10233*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
10234*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10235*6777b538SAndroid Build Coastguard Worker  }
10236*6777b538SAndroid Build Coastguard Worker}
10237*6777b538SAndroid Build Coastguard Worker
10238*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(BOOL)aKey {
10239*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10240*6777b538SAndroid Build Coastguard Worker}
10241*6777b538SAndroid Build Coastguard Worker
10242*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
10243*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
10244*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
10245*6777b538SAndroid Build Coastguard Worker}
10246*6777b538SAndroid Build Coastguard Worker
10247*6777b538SAndroid Build Coastguard Worker@end
10248*6777b538SAndroid Build Coastguard Worker
10249*6777b538SAndroid Build Coastguard Worker// clang-format on
10250*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int32, int32_t)
10251*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10252*6777b538SAndroid Build Coastguard Worker// clang-format off
10253*6777b538SAndroid Build Coastguard Worker
10254*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Int32
10255*6777b538SAndroid Build Coastguard Worker
10256*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolInt32Dictionary {
10257*6777b538SAndroid Build Coastguard Worker @package
10258*6777b538SAndroid Build Coastguard Worker  int32_t _values[2];
10259*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
10260*6777b538SAndroid Build Coastguard Worker}
10261*6777b538SAndroid Build Coastguard Worker
10262*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
10263*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
10264*6777b538SAndroid Build Coastguard Worker}
10265*6777b538SAndroid Build Coastguard Worker
10266*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
10267*6777b538SAndroid Build Coastguard Worker                       forKeys:(const BOOL [])keys
10268*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
10269*6777b538SAndroid Build Coastguard Worker  self = [super init];
10270*6777b538SAndroid Build Coastguard Worker  if (self) {
10271*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10272*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10273*6777b538SAndroid Build Coastguard Worker      _values[idx] = values[i];
10274*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10275*6777b538SAndroid Build Coastguard Worker    }
10276*6777b538SAndroid Build Coastguard Worker  }
10277*6777b538SAndroid Build Coastguard Worker  return self;
10278*6777b538SAndroid Build Coastguard Worker}
10279*6777b538SAndroid Build Coastguard Worker
10280*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolInt32Dictionary *)dictionary {
10281*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
10282*6777b538SAndroid Build Coastguard Worker  if (self) {
10283*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
10284*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10285*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10286*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10287*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
10288*6777b538SAndroid Build Coastguard Worker        }
10289*6777b538SAndroid Build Coastguard Worker      }
10290*6777b538SAndroid Build Coastguard Worker    }
10291*6777b538SAndroid Build Coastguard Worker  }
10292*6777b538SAndroid Build Coastguard Worker  return self;
10293*6777b538SAndroid Build Coastguard Worker}
10294*6777b538SAndroid Build Coastguard Worker
10295*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10296*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
10297*6777b538SAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
10298*6777b538SAndroid Build Coastguard Worker}
10299*6777b538SAndroid Build Coastguard Worker
10300*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10301*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
10302*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10303*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10304*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
10305*6777b538SAndroid Build Coastguard Worker  [super dealloc];
10306*6777b538SAndroid Build Coastguard Worker}
10307*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10308*6777b538SAndroid Build Coastguard Worker
10309*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10310*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolInt32Dictionary allocWithZone:zone] initWithDictionary:self];
10311*6777b538SAndroid Build Coastguard Worker}
10312*6777b538SAndroid Build Coastguard Worker
10313*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10314*6777b538SAndroid Build Coastguard Worker  if (self == other) {
10315*6777b538SAndroid Build Coastguard Worker    return YES;
10316*6777b538SAndroid Build Coastguard Worker  }
10317*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolInt32Dictionary class]]) {
10318*6777b538SAndroid Build Coastguard Worker    return NO;
10319*6777b538SAndroid Build Coastguard Worker  }
10320*6777b538SAndroid Build Coastguard Worker  GPBBoolInt32Dictionary *otherDictionary = other;
10321*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10322*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10323*6777b538SAndroid Build Coastguard Worker    return NO;
10324*6777b538SAndroid Build Coastguard Worker  }
10325*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10326*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10327*6777b538SAndroid Build Coastguard Worker    return NO;
10328*6777b538SAndroid Build Coastguard Worker  }
10329*6777b538SAndroid Build Coastguard Worker  return YES;
10330*6777b538SAndroid Build Coastguard Worker}
10331*6777b538SAndroid Build Coastguard Worker
10332*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
10333*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10334*6777b538SAndroid Build Coastguard Worker}
10335*6777b538SAndroid Build Coastguard Worker
10336*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
10337*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10338*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10339*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %d", _values[0]];
10340*6777b538SAndroid Build Coastguard Worker  }
10341*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10342*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %d", _values[1]];
10343*6777b538SAndroid Build Coastguard Worker  }
10344*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
10345*6777b538SAndroid Build Coastguard Worker  return result;
10346*6777b538SAndroid Build Coastguard Worker}
10347*6777b538SAndroid Build Coastguard Worker
10348*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
10349*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10350*6777b538SAndroid Build Coastguard Worker}
10351*6777b538SAndroid Build Coastguard Worker
10352*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(int32_t *)value forKey:(BOOL)key {
10353*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10354*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10355*6777b538SAndroid Build Coastguard Worker    if (value) {
10356*6777b538SAndroid Build Coastguard Worker      *value = _values[idx];
10357*6777b538SAndroid Build Coastguard Worker    }
10358*6777b538SAndroid Build Coastguard Worker    return YES;
10359*6777b538SAndroid Build Coastguard Worker  }
10360*6777b538SAndroid Build Coastguard Worker  return NO;
10361*6777b538SAndroid Build Coastguard Worker}
10362*6777b538SAndroid Build Coastguard Worker
10363*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10364*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10365*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10366*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueInt32;
10367*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10368*6777b538SAndroid Build Coastguard Worker}
10369*6777b538SAndroid Build Coastguard Worker
10370*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10371*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10372*6777b538SAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%d", _values[0]]);
10373*6777b538SAndroid Build Coastguard Worker  }
10374*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10375*6777b538SAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%d", _values[1]]);
10376*6777b538SAndroid Build Coastguard Worker  }
10377*6777b538SAndroid Build Coastguard Worker}
10378*6777b538SAndroid Build Coastguard Worker
10379*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
10380*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int32_t value, BOOL *stop))block {
10381*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
10382*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10383*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10384*6777b538SAndroid Build Coastguard Worker  }
10385*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10386*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10387*6777b538SAndroid Build Coastguard Worker  }
10388*6777b538SAndroid Build Coastguard Worker}
10389*6777b538SAndroid Build Coastguard Worker
10390*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10391*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10392*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
10393*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
10394*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10395*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10396*6777b538SAndroid Build Coastguard Worker      ++count;
10397*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10398*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10399*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10400*6777b538SAndroid Build Coastguard Worker    }
10401*6777b538SAndroid Build Coastguard Worker  }
10402*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10403*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
10404*6777b538SAndroid Build Coastguard Worker  return result;
10405*6777b538SAndroid Build Coastguard Worker}
10406*6777b538SAndroid Build Coastguard Worker
10407*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10408*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10409*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10410*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10411*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10412*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10413*6777b538SAndroid Build Coastguard Worker      // Write the tag.
10414*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10415*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
10416*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10417*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10418*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10419*6777b538SAndroid Build Coastguard Worker      // Write the fields.
10420*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10421*6777b538SAndroid Build Coastguard Worker      WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10422*6777b538SAndroid Build Coastguard Worker    }
10423*6777b538SAndroid Build Coastguard Worker  }
10424*6777b538SAndroid Build Coastguard Worker}
10425*6777b538SAndroid Build Coastguard Worker
10426*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolInt32Dictionary *)otherDictionary {
10427*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
10428*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10429*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10430*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
10431*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10432*6777b538SAndroid Build Coastguard Worker      }
10433*6777b538SAndroid Build Coastguard Worker    }
10434*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
10435*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10436*6777b538SAndroid Build Coastguard Worker    }
10437*6777b538SAndroid Build Coastguard Worker  }
10438*6777b538SAndroid Build Coastguard Worker}
10439*6777b538SAndroid Build Coastguard Worker
10440*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(BOOL)key {
10441*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10442*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
10443*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10444*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
10445*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10446*6777b538SAndroid Build Coastguard Worker  }
10447*6777b538SAndroid Build Coastguard Worker}
10448*6777b538SAndroid Build Coastguard Worker
10449*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(BOOL)aKey {
10450*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10451*6777b538SAndroid Build Coastguard Worker}
10452*6777b538SAndroid Build Coastguard Worker
10453*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
10454*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
10455*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
10456*6777b538SAndroid Build Coastguard Worker}
10457*6777b538SAndroid Build Coastguard Worker
10458*6777b538SAndroid Build Coastguard Worker@end
10459*6777b538SAndroid Build Coastguard Worker
10460*6777b538SAndroid Build Coastguard Worker// clang-format on
10461*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt64, uint64_t)
10462*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10463*6777b538SAndroid Build Coastguard Worker// clang-format off
10464*6777b538SAndroid Build Coastguard Worker
10465*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> UInt64
10466*6777b538SAndroid Build Coastguard Worker
10467*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolUInt64Dictionary {
10468*6777b538SAndroid Build Coastguard Worker @package
10469*6777b538SAndroid Build Coastguard Worker  uint64_t _values[2];
10470*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
10471*6777b538SAndroid Build Coastguard Worker}
10472*6777b538SAndroid Build Coastguard Worker
10473*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
10474*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
10475*6777b538SAndroid Build Coastguard Worker}
10476*6777b538SAndroid Build Coastguard Worker
10477*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
10478*6777b538SAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
10479*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
10480*6777b538SAndroid Build Coastguard Worker  self = [super init];
10481*6777b538SAndroid Build Coastguard Worker  if (self) {
10482*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10483*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10484*6777b538SAndroid Build Coastguard Worker      _values[idx] = values[i];
10485*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10486*6777b538SAndroid Build Coastguard Worker    }
10487*6777b538SAndroid Build Coastguard Worker  }
10488*6777b538SAndroid Build Coastguard Worker  return self;
10489*6777b538SAndroid Build Coastguard Worker}
10490*6777b538SAndroid Build Coastguard Worker
10491*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolUInt64Dictionary *)dictionary {
10492*6777b538SAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
10493*6777b538SAndroid Build Coastguard Worker  if (self) {
10494*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
10495*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10496*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10497*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10498*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
10499*6777b538SAndroid Build Coastguard Worker        }
10500*6777b538SAndroid Build Coastguard Worker      }
10501*6777b538SAndroid Build Coastguard Worker    }
10502*6777b538SAndroid Build Coastguard Worker  }
10503*6777b538SAndroid Build Coastguard Worker  return self;
10504*6777b538SAndroid Build Coastguard Worker}
10505*6777b538SAndroid Build Coastguard Worker
10506*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10507*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
10508*6777b538SAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
10509*6777b538SAndroid Build Coastguard Worker}
10510*6777b538SAndroid Build Coastguard Worker
10511*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10512*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
10513*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10514*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10515*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
10516*6777b538SAndroid Build Coastguard Worker  [super dealloc];
10517*6777b538SAndroid Build Coastguard Worker}
10518*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10519*6777b538SAndroid Build Coastguard Worker
10520*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10521*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolUInt64Dictionary allocWithZone:zone] initWithDictionary:self];
10522*6777b538SAndroid Build Coastguard Worker}
10523*6777b538SAndroid Build Coastguard Worker
10524*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10525*6777b538SAndroid Build Coastguard Worker  if (self == other) {
10526*6777b538SAndroid Build Coastguard Worker    return YES;
10527*6777b538SAndroid Build Coastguard Worker  }
10528*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolUInt64Dictionary class]]) {
10529*6777b538SAndroid Build Coastguard Worker    return NO;
10530*6777b538SAndroid Build Coastguard Worker  }
10531*6777b538SAndroid Build Coastguard Worker  GPBBoolUInt64Dictionary *otherDictionary = other;
10532*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10533*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10534*6777b538SAndroid Build Coastguard Worker    return NO;
10535*6777b538SAndroid Build Coastguard Worker  }
10536*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10537*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10538*6777b538SAndroid Build Coastguard Worker    return NO;
10539*6777b538SAndroid Build Coastguard Worker  }
10540*6777b538SAndroid Build Coastguard Worker  return YES;
10541*6777b538SAndroid Build Coastguard Worker}
10542*6777b538SAndroid Build Coastguard Worker
10543*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
10544*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10545*6777b538SAndroid Build Coastguard Worker}
10546*6777b538SAndroid Build Coastguard Worker
10547*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
10548*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10549*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10550*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %llu", _values[0]];
10551*6777b538SAndroid Build Coastguard Worker  }
10552*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10553*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %llu", _values[1]];
10554*6777b538SAndroid Build Coastguard Worker  }
10555*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
10556*6777b538SAndroid Build Coastguard Worker  return result;
10557*6777b538SAndroid Build Coastguard Worker}
10558*6777b538SAndroid Build Coastguard Worker
10559*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
10560*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10561*6777b538SAndroid Build Coastguard Worker}
10562*6777b538SAndroid Build Coastguard Worker
10563*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(uint64_t *)value forKey:(BOOL)key {
10564*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10565*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10566*6777b538SAndroid Build Coastguard Worker    if (value) {
10567*6777b538SAndroid Build Coastguard Worker      *value = _values[idx];
10568*6777b538SAndroid Build Coastguard Worker    }
10569*6777b538SAndroid Build Coastguard Worker    return YES;
10570*6777b538SAndroid Build Coastguard Worker  }
10571*6777b538SAndroid Build Coastguard Worker  return NO;
10572*6777b538SAndroid Build Coastguard Worker}
10573*6777b538SAndroid Build Coastguard Worker
10574*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10575*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10576*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10577*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueUInt64;
10578*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10579*6777b538SAndroid Build Coastguard Worker}
10580*6777b538SAndroid Build Coastguard Worker
10581*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10582*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10583*6777b538SAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%llu", _values[0]]);
10584*6777b538SAndroid Build Coastguard Worker  }
10585*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10586*6777b538SAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%llu", _values[1]]);
10587*6777b538SAndroid Build Coastguard Worker  }
10588*6777b538SAndroid Build Coastguard Worker}
10589*6777b538SAndroid Build Coastguard Worker
10590*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
10591*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, uint64_t value, BOOL *stop))block {
10592*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
10593*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10594*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10595*6777b538SAndroid Build Coastguard Worker  }
10596*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10597*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10598*6777b538SAndroid Build Coastguard Worker  }
10599*6777b538SAndroid Build Coastguard Worker}
10600*6777b538SAndroid Build Coastguard Worker
10601*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10602*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10603*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
10604*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
10605*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10606*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10607*6777b538SAndroid Build Coastguard Worker      ++count;
10608*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10609*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10610*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10611*6777b538SAndroid Build Coastguard Worker    }
10612*6777b538SAndroid Build Coastguard Worker  }
10613*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10614*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
10615*6777b538SAndroid Build Coastguard Worker  return result;
10616*6777b538SAndroid Build Coastguard Worker}
10617*6777b538SAndroid Build Coastguard Worker
10618*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10619*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10620*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10621*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10622*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10623*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10624*6777b538SAndroid Build Coastguard Worker      // Write the tag.
10625*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10626*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
10627*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10628*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10629*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10630*6777b538SAndroid Build Coastguard Worker      // Write the fields.
10631*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10632*6777b538SAndroid Build Coastguard Worker      WriteDictUInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10633*6777b538SAndroid Build Coastguard Worker    }
10634*6777b538SAndroid Build Coastguard Worker  }
10635*6777b538SAndroid Build Coastguard Worker}
10636*6777b538SAndroid Build Coastguard Worker
10637*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolUInt64Dictionary *)otherDictionary {
10638*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
10639*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10640*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10641*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
10642*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10643*6777b538SAndroid Build Coastguard Worker      }
10644*6777b538SAndroid Build Coastguard Worker    }
10645*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
10646*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10647*6777b538SAndroid Build Coastguard Worker    }
10648*6777b538SAndroid Build Coastguard Worker  }
10649*6777b538SAndroid Build Coastguard Worker}
10650*6777b538SAndroid Build Coastguard Worker
10651*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(BOOL)key {
10652*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10653*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
10654*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10655*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
10656*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10657*6777b538SAndroid Build Coastguard Worker  }
10658*6777b538SAndroid Build Coastguard Worker}
10659*6777b538SAndroid Build Coastguard Worker
10660*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(BOOL)aKey {
10661*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10662*6777b538SAndroid Build Coastguard Worker}
10663*6777b538SAndroid Build Coastguard Worker
10664*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
10665*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
10666*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
10667*6777b538SAndroid Build Coastguard Worker}
10668*6777b538SAndroid Build Coastguard Worker
10669*6777b538SAndroid Build Coastguard Worker@end
10670*6777b538SAndroid Build Coastguard Worker
10671*6777b538SAndroid Build Coastguard Worker// clang-format on
10672*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int64, int64_t)
10673*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10674*6777b538SAndroid Build Coastguard Worker// clang-format off
10675*6777b538SAndroid Build Coastguard Worker
10676*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Int64
10677*6777b538SAndroid Build Coastguard Worker
10678*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolInt64Dictionary {
10679*6777b538SAndroid Build Coastguard Worker @package
10680*6777b538SAndroid Build Coastguard Worker  int64_t _values[2];
10681*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
10682*6777b538SAndroid Build Coastguard Worker}
10683*6777b538SAndroid Build Coastguard Worker
10684*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
10685*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
10686*6777b538SAndroid Build Coastguard Worker}
10687*6777b538SAndroid Build Coastguard Worker
10688*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
10689*6777b538SAndroid Build Coastguard Worker                       forKeys:(const BOOL [])keys
10690*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
10691*6777b538SAndroid Build Coastguard Worker  self = [super init];
10692*6777b538SAndroid Build Coastguard Worker  if (self) {
10693*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10694*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10695*6777b538SAndroid Build Coastguard Worker      _values[idx] = values[i];
10696*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10697*6777b538SAndroid Build Coastguard Worker    }
10698*6777b538SAndroid Build Coastguard Worker  }
10699*6777b538SAndroid Build Coastguard Worker  return self;
10700*6777b538SAndroid Build Coastguard Worker}
10701*6777b538SAndroid Build Coastguard Worker
10702*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolInt64Dictionary *)dictionary {
10703*6777b538SAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
10704*6777b538SAndroid Build Coastguard Worker  if (self) {
10705*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
10706*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10707*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10708*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10709*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
10710*6777b538SAndroid Build Coastguard Worker        }
10711*6777b538SAndroid Build Coastguard Worker      }
10712*6777b538SAndroid Build Coastguard Worker    }
10713*6777b538SAndroid Build Coastguard Worker  }
10714*6777b538SAndroid Build Coastguard Worker  return self;
10715*6777b538SAndroid Build Coastguard Worker}
10716*6777b538SAndroid Build Coastguard Worker
10717*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10718*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
10719*6777b538SAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
10720*6777b538SAndroid Build Coastguard Worker}
10721*6777b538SAndroid Build Coastguard Worker
10722*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10723*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
10724*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10725*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10726*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
10727*6777b538SAndroid Build Coastguard Worker  [super dealloc];
10728*6777b538SAndroid Build Coastguard Worker}
10729*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10730*6777b538SAndroid Build Coastguard Worker
10731*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10732*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolInt64Dictionary allocWithZone:zone] initWithDictionary:self];
10733*6777b538SAndroid Build Coastguard Worker}
10734*6777b538SAndroid Build Coastguard Worker
10735*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10736*6777b538SAndroid Build Coastguard Worker  if (self == other) {
10737*6777b538SAndroid Build Coastguard Worker    return YES;
10738*6777b538SAndroid Build Coastguard Worker  }
10739*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolInt64Dictionary class]]) {
10740*6777b538SAndroid Build Coastguard Worker    return NO;
10741*6777b538SAndroid Build Coastguard Worker  }
10742*6777b538SAndroid Build Coastguard Worker  GPBBoolInt64Dictionary *otherDictionary = other;
10743*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10744*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10745*6777b538SAndroid Build Coastguard Worker    return NO;
10746*6777b538SAndroid Build Coastguard Worker  }
10747*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10748*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10749*6777b538SAndroid Build Coastguard Worker    return NO;
10750*6777b538SAndroid Build Coastguard Worker  }
10751*6777b538SAndroid Build Coastguard Worker  return YES;
10752*6777b538SAndroid Build Coastguard Worker}
10753*6777b538SAndroid Build Coastguard Worker
10754*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
10755*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10756*6777b538SAndroid Build Coastguard Worker}
10757*6777b538SAndroid Build Coastguard Worker
10758*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
10759*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10760*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10761*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %lld", _values[0]];
10762*6777b538SAndroid Build Coastguard Worker  }
10763*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10764*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %lld", _values[1]];
10765*6777b538SAndroid Build Coastguard Worker  }
10766*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
10767*6777b538SAndroid Build Coastguard Worker  return result;
10768*6777b538SAndroid Build Coastguard Worker}
10769*6777b538SAndroid Build Coastguard Worker
10770*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
10771*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10772*6777b538SAndroid Build Coastguard Worker}
10773*6777b538SAndroid Build Coastguard Worker
10774*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(int64_t *)value forKey:(BOOL)key {
10775*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10776*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10777*6777b538SAndroid Build Coastguard Worker    if (value) {
10778*6777b538SAndroid Build Coastguard Worker      *value = _values[idx];
10779*6777b538SAndroid Build Coastguard Worker    }
10780*6777b538SAndroid Build Coastguard Worker    return YES;
10781*6777b538SAndroid Build Coastguard Worker  }
10782*6777b538SAndroid Build Coastguard Worker  return NO;
10783*6777b538SAndroid Build Coastguard Worker}
10784*6777b538SAndroid Build Coastguard Worker
10785*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10786*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10787*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10788*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueInt64;
10789*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10790*6777b538SAndroid Build Coastguard Worker}
10791*6777b538SAndroid Build Coastguard Worker
10792*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10793*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10794*6777b538SAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%lld", _values[0]]);
10795*6777b538SAndroid Build Coastguard Worker  }
10796*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10797*6777b538SAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%lld", _values[1]]);
10798*6777b538SAndroid Build Coastguard Worker  }
10799*6777b538SAndroid Build Coastguard Worker}
10800*6777b538SAndroid Build Coastguard Worker
10801*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
10802*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int64_t value, BOOL *stop))block {
10803*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
10804*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10805*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10806*6777b538SAndroid Build Coastguard Worker  }
10807*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10808*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10809*6777b538SAndroid Build Coastguard Worker  }
10810*6777b538SAndroid Build Coastguard Worker}
10811*6777b538SAndroid Build Coastguard Worker
10812*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10813*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10814*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
10815*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
10816*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10817*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10818*6777b538SAndroid Build Coastguard Worker      ++count;
10819*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10820*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10821*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10822*6777b538SAndroid Build Coastguard Worker    }
10823*6777b538SAndroid Build Coastguard Worker  }
10824*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10825*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
10826*6777b538SAndroid Build Coastguard Worker  return result;
10827*6777b538SAndroid Build Coastguard Worker}
10828*6777b538SAndroid Build Coastguard Worker
10829*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10830*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10831*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10832*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10833*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10834*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
10835*6777b538SAndroid Build Coastguard Worker      // Write the tag.
10836*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10837*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
10838*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10839*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10840*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10841*6777b538SAndroid Build Coastguard Worker      // Write the fields.
10842*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10843*6777b538SAndroid Build Coastguard Worker      WriteDictInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10844*6777b538SAndroid Build Coastguard Worker    }
10845*6777b538SAndroid Build Coastguard Worker  }
10846*6777b538SAndroid Build Coastguard Worker}
10847*6777b538SAndroid Build Coastguard Worker
10848*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolInt64Dictionary *)otherDictionary {
10849*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
10850*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10851*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10852*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
10853*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10854*6777b538SAndroid Build Coastguard Worker      }
10855*6777b538SAndroid Build Coastguard Worker    }
10856*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
10857*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10858*6777b538SAndroid Build Coastguard Worker    }
10859*6777b538SAndroid Build Coastguard Worker  }
10860*6777b538SAndroid Build Coastguard Worker}
10861*6777b538SAndroid Build Coastguard Worker
10862*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(BOOL)key {
10863*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10864*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
10865*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10866*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
10867*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10868*6777b538SAndroid Build Coastguard Worker  }
10869*6777b538SAndroid Build Coastguard Worker}
10870*6777b538SAndroid Build Coastguard Worker
10871*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(BOOL)aKey {
10872*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10873*6777b538SAndroid Build Coastguard Worker}
10874*6777b538SAndroid Build Coastguard Worker
10875*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
10876*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
10877*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
10878*6777b538SAndroid Build Coastguard Worker}
10879*6777b538SAndroid Build Coastguard Worker
10880*6777b538SAndroid Build Coastguard Worker@end
10881*6777b538SAndroid Build Coastguard Worker
10882*6777b538SAndroid Build Coastguard Worker// clang-format on
10883*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Bool, BOOL)
10884*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10885*6777b538SAndroid Build Coastguard Worker// clang-format off
10886*6777b538SAndroid Build Coastguard Worker
10887*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Bool
10888*6777b538SAndroid Build Coastguard Worker
10889*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolBoolDictionary {
10890*6777b538SAndroid Build Coastguard Worker @package
10891*6777b538SAndroid Build Coastguard Worker  BOOL _values[2];
10892*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
10893*6777b538SAndroid Build Coastguard Worker}
10894*6777b538SAndroid Build Coastguard Worker
10895*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
10896*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
10897*6777b538SAndroid Build Coastguard Worker}
10898*6777b538SAndroid Build Coastguard Worker
10899*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
10900*6777b538SAndroid Build Coastguard Worker                      forKeys:(const BOOL [])keys
10901*6777b538SAndroid Build Coastguard Worker                        count:(NSUInteger)count {
10902*6777b538SAndroid Build Coastguard Worker  self = [super init];
10903*6777b538SAndroid Build Coastguard Worker  if (self) {
10904*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10905*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10906*6777b538SAndroid Build Coastguard Worker      _values[idx] = values[i];
10907*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10908*6777b538SAndroid Build Coastguard Worker    }
10909*6777b538SAndroid Build Coastguard Worker  }
10910*6777b538SAndroid Build Coastguard Worker  return self;
10911*6777b538SAndroid Build Coastguard Worker}
10912*6777b538SAndroid Build Coastguard Worker
10913*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolBoolDictionary *)dictionary {
10914*6777b538SAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
10915*6777b538SAndroid Build Coastguard Worker  if (self) {
10916*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
10917*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10918*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10919*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10920*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
10921*6777b538SAndroid Build Coastguard Worker        }
10922*6777b538SAndroid Build Coastguard Worker      }
10923*6777b538SAndroid Build Coastguard Worker    }
10924*6777b538SAndroid Build Coastguard Worker  }
10925*6777b538SAndroid Build Coastguard Worker  return self;
10926*6777b538SAndroid Build Coastguard Worker}
10927*6777b538SAndroid Build Coastguard Worker
10928*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10929*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
10930*6777b538SAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
10931*6777b538SAndroid Build Coastguard Worker}
10932*6777b538SAndroid Build Coastguard Worker
10933*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10934*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
10935*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10936*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10937*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
10938*6777b538SAndroid Build Coastguard Worker  [super dealloc];
10939*6777b538SAndroid Build Coastguard Worker}
10940*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10941*6777b538SAndroid Build Coastguard Worker
10942*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10943*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolBoolDictionary allocWithZone:zone] initWithDictionary:self];
10944*6777b538SAndroid Build Coastguard Worker}
10945*6777b538SAndroid Build Coastguard Worker
10946*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10947*6777b538SAndroid Build Coastguard Worker  if (self == other) {
10948*6777b538SAndroid Build Coastguard Worker    return YES;
10949*6777b538SAndroid Build Coastguard Worker  }
10950*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolBoolDictionary class]]) {
10951*6777b538SAndroid Build Coastguard Worker    return NO;
10952*6777b538SAndroid Build Coastguard Worker  }
10953*6777b538SAndroid Build Coastguard Worker  GPBBoolBoolDictionary *otherDictionary = other;
10954*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10955*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10956*6777b538SAndroid Build Coastguard Worker    return NO;
10957*6777b538SAndroid Build Coastguard Worker  }
10958*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10959*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10960*6777b538SAndroid Build Coastguard Worker    return NO;
10961*6777b538SAndroid Build Coastguard Worker  }
10962*6777b538SAndroid Build Coastguard Worker  return YES;
10963*6777b538SAndroid Build Coastguard Worker}
10964*6777b538SAndroid Build Coastguard Worker
10965*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
10966*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10967*6777b538SAndroid Build Coastguard Worker}
10968*6777b538SAndroid Build Coastguard Worker
10969*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
10970*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10971*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
10972*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %d", _values[0]];
10973*6777b538SAndroid Build Coastguard Worker  }
10974*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
10975*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %d", _values[1]];
10976*6777b538SAndroid Build Coastguard Worker  }
10977*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
10978*6777b538SAndroid Build Coastguard Worker  return result;
10979*6777b538SAndroid Build Coastguard Worker}
10980*6777b538SAndroid Build Coastguard Worker
10981*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
10982*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10983*6777b538SAndroid Build Coastguard Worker}
10984*6777b538SAndroid Build Coastguard Worker
10985*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(BOOL *)value forKey:(BOOL)key {
10986*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10987*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10988*6777b538SAndroid Build Coastguard Worker    if (value) {
10989*6777b538SAndroid Build Coastguard Worker      *value = _values[idx];
10990*6777b538SAndroid Build Coastguard Worker    }
10991*6777b538SAndroid Build Coastguard Worker    return YES;
10992*6777b538SAndroid Build Coastguard Worker  }
10993*6777b538SAndroid Build Coastguard Worker  return NO;
10994*6777b538SAndroid Build Coastguard Worker}
10995*6777b538SAndroid Build Coastguard Worker
10996*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10997*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10998*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10999*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueBool;
11000*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11001*6777b538SAndroid Build Coastguard Worker}
11002*6777b538SAndroid Build Coastguard Worker
11003*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11004*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11005*6777b538SAndroid Build Coastguard Worker    block(@"false", (_values[0] ? @"true" : @"false"));
11006*6777b538SAndroid Build Coastguard Worker  }
11007*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
11008*6777b538SAndroid Build Coastguard Worker    block(@"true", (_values[1] ? @"true" : @"false"));
11009*6777b538SAndroid Build Coastguard Worker  }
11010*6777b538SAndroid Build Coastguard Worker}
11011*6777b538SAndroid Build Coastguard Worker
11012*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
11013*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, BOOL value, BOOL *stop))block {
11014*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
11015*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11016*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11017*6777b538SAndroid Build Coastguard Worker  }
11018*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11019*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11020*6777b538SAndroid Build Coastguard Worker  }
11021*6777b538SAndroid Build Coastguard Worker}
11022*6777b538SAndroid Build Coastguard Worker
11023*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11024*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11025*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
11026*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
11027*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11028*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11029*6777b538SAndroid Build Coastguard Worker      ++count;
11030*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11031*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11032*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11033*6777b538SAndroid Build Coastguard Worker    }
11034*6777b538SAndroid Build Coastguard Worker  }
11035*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11036*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
11037*6777b538SAndroid Build Coastguard Worker  return result;
11038*6777b538SAndroid Build Coastguard Worker}
11039*6777b538SAndroid Build Coastguard Worker
11040*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11041*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11042*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11043*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11044*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11045*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11046*6777b538SAndroid Build Coastguard Worker      // Write the tag.
11047*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11048*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
11049*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11050*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11051*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11052*6777b538SAndroid Build Coastguard Worker      // Write the fields.
11053*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11054*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11055*6777b538SAndroid Build Coastguard Worker    }
11056*6777b538SAndroid Build Coastguard Worker  }
11057*6777b538SAndroid Build Coastguard Worker}
11058*6777b538SAndroid Build Coastguard Worker
11059*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolBoolDictionary *)otherDictionary {
11060*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
11061*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11062*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11063*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
11064*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11065*6777b538SAndroid Build Coastguard Worker      }
11066*6777b538SAndroid Build Coastguard Worker    }
11067*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
11068*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11069*6777b538SAndroid Build Coastguard Worker    }
11070*6777b538SAndroid Build Coastguard Worker  }
11071*6777b538SAndroid Build Coastguard Worker}
11072*6777b538SAndroid Build Coastguard Worker
11073*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(BOOL)key {
11074*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11075*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
11076*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11077*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
11078*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11079*6777b538SAndroid Build Coastguard Worker  }
11080*6777b538SAndroid Build Coastguard Worker}
11081*6777b538SAndroid Build Coastguard Worker
11082*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(BOOL)aKey {
11083*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
11084*6777b538SAndroid Build Coastguard Worker}
11085*6777b538SAndroid Build Coastguard Worker
11086*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
11087*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
11088*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
11089*6777b538SAndroid Build Coastguard Worker}
11090*6777b538SAndroid Build Coastguard Worker
11091*6777b538SAndroid Build Coastguard Worker@end
11092*6777b538SAndroid Build Coastguard Worker
11093*6777b538SAndroid Build Coastguard Worker// clang-format on
11094*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Float, float)
11095*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11096*6777b538SAndroid Build Coastguard Worker// clang-format off
11097*6777b538SAndroid Build Coastguard Worker
11098*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Float
11099*6777b538SAndroid Build Coastguard Worker
11100*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolFloatDictionary {
11101*6777b538SAndroid Build Coastguard Worker @package
11102*6777b538SAndroid Build Coastguard Worker  float _values[2];
11103*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
11104*6777b538SAndroid Build Coastguard Worker}
11105*6777b538SAndroid Build Coastguard Worker
11106*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
11107*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
11108*6777b538SAndroid Build Coastguard Worker}
11109*6777b538SAndroid Build Coastguard Worker
11110*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
11111*6777b538SAndroid Build Coastguard Worker                       forKeys:(const BOOL [])keys
11112*6777b538SAndroid Build Coastguard Worker                         count:(NSUInteger)count {
11113*6777b538SAndroid Build Coastguard Worker  self = [super init];
11114*6777b538SAndroid Build Coastguard Worker  if (self) {
11115*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11116*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11117*6777b538SAndroid Build Coastguard Worker      _values[idx] = values[i];
11118*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
11119*6777b538SAndroid Build Coastguard Worker    }
11120*6777b538SAndroid Build Coastguard Worker  }
11121*6777b538SAndroid Build Coastguard Worker  return self;
11122*6777b538SAndroid Build Coastguard Worker}
11123*6777b538SAndroid Build Coastguard Worker
11124*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolFloatDictionary *)dictionary {
11125*6777b538SAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
11126*6777b538SAndroid Build Coastguard Worker  if (self) {
11127*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
11128*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
11129*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
11130*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
11131*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
11132*6777b538SAndroid Build Coastguard Worker        }
11133*6777b538SAndroid Build Coastguard Worker      }
11134*6777b538SAndroid Build Coastguard Worker    }
11135*6777b538SAndroid Build Coastguard Worker  }
11136*6777b538SAndroid Build Coastguard Worker  return self;
11137*6777b538SAndroid Build Coastguard Worker}
11138*6777b538SAndroid Build Coastguard Worker
11139*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
11140*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
11141*6777b538SAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
11142*6777b538SAndroid Build Coastguard Worker}
11143*6777b538SAndroid Build Coastguard Worker
11144*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
11145*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
11146*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11147*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11148*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
11149*6777b538SAndroid Build Coastguard Worker  [super dealloc];
11150*6777b538SAndroid Build Coastguard Worker}
11151*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
11152*6777b538SAndroid Build Coastguard Worker
11153*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11154*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolFloatDictionary allocWithZone:zone] initWithDictionary:self];
11155*6777b538SAndroid Build Coastguard Worker}
11156*6777b538SAndroid Build Coastguard Worker
11157*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11158*6777b538SAndroid Build Coastguard Worker  if (self == other) {
11159*6777b538SAndroid Build Coastguard Worker    return YES;
11160*6777b538SAndroid Build Coastguard Worker  }
11161*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolFloatDictionary class]]) {
11162*6777b538SAndroid Build Coastguard Worker    return NO;
11163*6777b538SAndroid Build Coastguard Worker  }
11164*6777b538SAndroid Build Coastguard Worker  GPBBoolFloatDictionary *otherDictionary = other;
11165*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
11166*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
11167*6777b538SAndroid Build Coastguard Worker    return NO;
11168*6777b538SAndroid Build Coastguard Worker  }
11169*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
11170*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
11171*6777b538SAndroid Build Coastguard Worker    return NO;
11172*6777b538SAndroid Build Coastguard Worker  }
11173*6777b538SAndroid Build Coastguard Worker  return YES;
11174*6777b538SAndroid Build Coastguard Worker}
11175*6777b538SAndroid Build Coastguard Worker
11176*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
11177*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11178*6777b538SAndroid Build Coastguard Worker}
11179*6777b538SAndroid Build Coastguard Worker
11180*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
11181*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11182*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11183*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %f", _values[0]];
11184*6777b538SAndroid Build Coastguard Worker  }
11185*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
11186*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %f", _values[1]];
11187*6777b538SAndroid Build Coastguard Worker  }
11188*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
11189*6777b538SAndroid Build Coastguard Worker  return result;
11190*6777b538SAndroid Build Coastguard Worker}
11191*6777b538SAndroid Build Coastguard Worker
11192*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
11193*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11194*6777b538SAndroid Build Coastguard Worker}
11195*6777b538SAndroid Build Coastguard Worker
11196*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(float *)value forKey:(BOOL)key {
11197*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11198*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11199*6777b538SAndroid Build Coastguard Worker    if (value) {
11200*6777b538SAndroid Build Coastguard Worker      *value = _values[idx];
11201*6777b538SAndroid Build Coastguard Worker    }
11202*6777b538SAndroid Build Coastguard Worker    return YES;
11203*6777b538SAndroid Build Coastguard Worker  }
11204*6777b538SAndroid Build Coastguard Worker  return NO;
11205*6777b538SAndroid Build Coastguard Worker}
11206*6777b538SAndroid Build Coastguard Worker
11207*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11208*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11209*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11210*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueFloat;
11211*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11212*6777b538SAndroid Build Coastguard Worker}
11213*6777b538SAndroid Build Coastguard Worker
11214*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11215*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11216*6777b538SAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[0]]);
11217*6777b538SAndroid Build Coastguard Worker  }
11218*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
11219*6777b538SAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[1]]);
11220*6777b538SAndroid Build Coastguard Worker  }
11221*6777b538SAndroid Build Coastguard Worker}
11222*6777b538SAndroid Build Coastguard Worker
11223*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
11224*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, float value, BOOL *stop))block {
11225*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
11226*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11227*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11228*6777b538SAndroid Build Coastguard Worker  }
11229*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11230*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11231*6777b538SAndroid Build Coastguard Worker  }
11232*6777b538SAndroid Build Coastguard Worker}
11233*6777b538SAndroid Build Coastguard Worker
11234*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11235*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11236*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
11237*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
11238*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11239*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11240*6777b538SAndroid Build Coastguard Worker      ++count;
11241*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11242*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11243*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11244*6777b538SAndroid Build Coastguard Worker    }
11245*6777b538SAndroid Build Coastguard Worker  }
11246*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11247*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
11248*6777b538SAndroid Build Coastguard Worker  return result;
11249*6777b538SAndroid Build Coastguard Worker}
11250*6777b538SAndroid Build Coastguard Worker
11251*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11252*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11253*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11254*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11255*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11256*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11257*6777b538SAndroid Build Coastguard Worker      // Write the tag.
11258*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11259*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
11260*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11261*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11262*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11263*6777b538SAndroid Build Coastguard Worker      // Write the fields.
11264*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11265*6777b538SAndroid Build Coastguard Worker      WriteDictFloatField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11266*6777b538SAndroid Build Coastguard Worker    }
11267*6777b538SAndroid Build Coastguard Worker  }
11268*6777b538SAndroid Build Coastguard Worker}
11269*6777b538SAndroid Build Coastguard Worker
11270*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolFloatDictionary *)otherDictionary {
11271*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
11272*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11273*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11274*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
11275*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11276*6777b538SAndroid Build Coastguard Worker      }
11277*6777b538SAndroid Build Coastguard Worker    }
11278*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
11279*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11280*6777b538SAndroid Build Coastguard Worker    }
11281*6777b538SAndroid Build Coastguard Worker  }
11282*6777b538SAndroid Build Coastguard Worker}
11283*6777b538SAndroid Build Coastguard Worker
11284*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(BOOL)key {
11285*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11286*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
11287*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11288*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
11289*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11290*6777b538SAndroid Build Coastguard Worker  }
11291*6777b538SAndroid Build Coastguard Worker}
11292*6777b538SAndroid Build Coastguard Worker
11293*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(BOOL)aKey {
11294*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
11295*6777b538SAndroid Build Coastguard Worker}
11296*6777b538SAndroid Build Coastguard Worker
11297*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
11298*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
11299*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
11300*6777b538SAndroid Build Coastguard Worker}
11301*6777b538SAndroid Build Coastguard Worker
11302*6777b538SAndroid Build Coastguard Worker@end
11303*6777b538SAndroid Build Coastguard Worker
11304*6777b538SAndroid Build Coastguard Worker// clang-format on
11305*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Double, double)
11306*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11307*6777b538SAndroid Build Coastguard Worker// clang-format off
11308*6777b538SAndroid Build Coastguard Worker
11309*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Double
11310*6777b538SAndroid Build Coastguard Worker
11311*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolDoubleDictionary {
11312*6777b538SAndroid Build Coastguard Worker @package
11313*6777b538SAndroid Build Coastguard Worker  double _values[2];
11314*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
11315*6777b538SAndroid Build Coastguard Worker}
11316*6777b538SAndroid Build Coastguard Worker
11317*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
11318*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
11319*6777b538SAndroid Build Coastguard Worker}
11320*6777b538SAndroid Build Coastguard Worker
11321*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
11322*6777b538SAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
11323*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
11324*6777b538SAndroid Build Coastguard Worker  self = [super init];
11325*6777b538SAndroid Build Coastguard Worker  if (self) {
11326*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11327*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11328*6777b538SAndroid Build Coastguard Worker      _values[idx] = values[i];
11329*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
11330*6777b538SAndroid Build Coastguard Worker    }
11331*6777b538SAndroid Build Coastguard Worker  }
11332*6777b538SAndroid Build Coastguard Worker  return self;
11333*6777b538SAndroid Build Coastguard Worker}
11334*6777b538SAndroid Build Coastguard Worker
11335*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolDoubleDictionary *)dictionary {
11336*6777b538SAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
11337*6777b538SAndroid Build Coastguard Worker  if (self) {
11338*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
11339*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
11340*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
11341*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
11342*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
11343*6777b538SAndroid Build Coastguard Worker        }
11344*6777b538SAndroid Build Coastguard Worker      }
11345*6777b538SAndroid Build Coastguard Worker    }
11346*6777b538SAndroid Build Coastguard Worker  }
11347*6777b538SAndroid Build Coastguard Worker  return self;
11348*6777b538SAndroid Build Coastguard Worker}
11349*6777b538SAndroid Build Coastguard Worker
11350*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
11351*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
11352*6777b538SAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
11353*6777b538SAndroid Build Coastguard Worker}
11354*6777b538SAndroid Build Coastguard Worker
11355*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
11356*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
11357*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11358*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11359*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
11360*6777b538SAndroid Build Coastguard Worker  [super dealloc];
11361*6777b538SAndroid Build Coastguard Worker}
11362*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
11363*6777b538SAndroid Build Coastguard Worker
11364*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11365*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolDoubleDictionary allocWithZone:zone] initWithDictionary:self];
11366*6777b538SAndroid Build Coastguard Worker}
11367*6777b538SAndroid Build Coastguard Worker
11368*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11369*6777b538SAndroid Build Coastguard Worker  if (self == other) {
11370*6777b538SAndroid Build Coastguard Worker    return YES;
11371*6777b538SAndroid Build Coastguard Worker  }
11372*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolDoubleDictionary class]]) {
11373*6777b538SAndroid Build Coastguard Worker    return NO;
11374*6777b538SAndroid Build Coastguard Worker  }
11375*6777b538SAndroid Build Coastguard Worker  GPBBoolDoubleDictionary *otherDictionary = other;
11376*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
11377*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
11378*6777b538SAndroid Build Coastguard Worker    return NO;
11379*6777b538SAndroid Build Coastguard Worker  }
11380*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
11381*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
11382*6777b538SAndroid Build Coastguard Worker    return NO;
11383*6777b538SAndroid Build Coastguard Worker  }
11384*6777b538SAndroid Build Coastguard Worker  return YES;
11385*6777b538SAndroid Build Coastguard Worker}
11386*6777b538SAndroid Build Coastguard Worker
11387*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
11388*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11389*6777b538SAndroid Build Coastguard Worker}
11390*6777b538SAndroid Build Coastguard Worker
11391*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
11392*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11393*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11394*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %lf", _values[0]];
11395*6777b538SAndroid Build Coastguard Worker  }
11396*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
11397*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %lf", _values[1]];
11398*6777b538SAndroid Build Coastguard Worker  }
11399*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
11400*6777b538SAndroid Build Coastguard Worker  return result;
11401*6777b538SAndroid Build Coastguard Worker}
11402*6777b538SAndroid Build Coastguard Worker
11403*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
11404*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11405*6777b538SAndroid Build Coastguard Worker}
11406*6777b538SAndroid Build Coastguard Worker
11407*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(double *)value forKey:(BOOL)key {
11408*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11409*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11410*6777b538SAndroid Build Coastguard Worker    if (value) {
11411*6777b538SAndroid Build Coastguard Worker      *value = _values[idx];
11412*6777b538SAndroid Build Coastguard Worker    }
11413*6777b538SAndroid Build Coastguard Worker    return YES;
11414*6777b538SAndroid Build Coastguard Worker  }
11415*6777b538SAndroid Build Coastguard Worker  return NO;
11416*6777b538SAndroid Build Coastguard Worker}
11417*6777b538SAndroid Build Coastguard Worker
11418*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11419*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11420*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11421*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueDouble;
11422*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11423*6777b538SAndroid Build Coastguard Worker}
11424*6777b538SAndroid Build Coastguard Worker
11425*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11426*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11427*6777b538SAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[0]]);
11428*6777b538SAndroid Build Coastguard Worker  }
11429*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
11430*6777b538SAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[1]]);
11431*6777b538SAndroid Build Coastguard Worker  }
11432*6777b538SAndroid Build Coastguard Worker}
11433*6777b538SAndroid Build Coastguard Worker
11434*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
11435*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, double value, BOOL *stop))block {
11436*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
11437*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11438*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11439*6777b538SAndroid Build Coastguard Worker  }
11440*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11441*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11442*6777b538SAndroid Build Coastguard Worker  }
11443*6777b538SAndroid Build Coastguard Worker}
11444*6777b538SAndroid Build Coastguard Worker
11445*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11446*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11447*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
11448*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
11449*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11450*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11451*6777b538SAndroid Build Coastguard Worker      ++count;
11452*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11453*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11454*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11455*6777b538SAndroid Build Coastguard Worker    }
11456*6777b538SAndroid Build Coastguard Worker  }
11457*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11458*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
11459*6777b538SAndroid Build Coastguard Worker  return result;
11460*6777b538SAndroid Build Coastguard Worker}
11461*6777b538SAndroid Build Coastguard Worker
11462*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11463*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11464*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11465*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11466*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11467*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11468*6777b538SAndroid Build Coastguard Worker      // Write the tag.
11469*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11470*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
11471*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11472*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11473*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11474*6777b538SAndroid Build Coastguard Worker      // Write the fields.
11475*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11476*6777b538SAndroid Build Coastguard Worker      WriteDictDoubleField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11477*6777b538SAndroid Build Coastguard Worker    }
11478*6777b538SAndroid Build Coastguard Worker  }
11479*6777b538SAndroid Build Coastguard Worker}
11480*6777b538SAndroid Build Coastguard Worker
11481*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolDoubleDictionary *)otherDictionary {
11482*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
11483*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11484*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11485*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
11486*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11487*6777b538SAndroid Build Coastguard Worker      }
11488*6777b538SAndroid Build Coastguard Worker    }
11489*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
11490*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11491*6777b538SAndroid Build Coastguard Worker    }
11492*6777b538SAndroid Build Coastguard Worker  }
11493*6777b538SAndroid Build Coastguard Worker}
11494*6777b538SAndroid Build Coastguard Worker
11495*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(BOOL)key {
11496*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11497*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
11498*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11499*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
11500*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11501*6777b538SAndroid Build Coastguard Worker  }
11502*6777b538SAndroid Build Coastguard Worker}
11503*6777b538SAndroid Build Coastguard Worker
11504*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(BOOL)aKey {
11505*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
11506*6777b538SAndroid Build Coastguard Worker}
11507*6777b538SAndroid Build Coastguard Worker
11508*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
11509*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
11510*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
11511*6777b538SAndroid Build Coastguard Worker}
11512*6777b538SAndroid Build Coastguard Worker
11513*6777b538SAndroid Build Coastguard Worker@end
11514*6777b538SAndroid Build Coastguard Worker
11515*6777b538SAndroid Build Coastguard Worker// clang-format on
11516*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(Object, id)
11517*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11518*6777b538SAndroid Build Coastguard Worker// clang-format off
11519*6777b538SAndroid Build Coastguard Worker
11520*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Object
11521*6777b538SAndroid Build Coastguard Worker
11522*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolObjectDictionary {
11523*6777b538SAndroid Build Coastguard Worker @package
11524*6777b538SAndroid Build Coastguard Worker  id _values[2];
11525*6777b538SAndroid Build Coastguard Worker}
11526*6777b538SAndroid Build Coastguard Worker
11527*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
11528*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
11529*6777b538SAndroid Build Coastguard Worker}
11530*6777b538SAndroid Build Coastguard Worker
11531*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
11532*6777b538SAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
11533*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
11534*6777b538SAndroid Build Coastguard Worker  self = [super init];
11535*6777b538SAndroid Build Coastguard Worker  if (self) {
11536*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11537*6777b538SAndroid Build Coastguard Worker      if (!objects[i]) {
11538*6777b538SAndroid Build Coastguard Worker        [NSException raise:NSInvalidArgumentException
11539*6777b538SAndroid Build Coastguard Worker                    format:@"Attempting to add nil object to a Dictionary"];
11540*6777b538SAndroid Build Coastguard Worker      }
11541*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11542*6777b538SAndroid Build Coastguard Worker      [_values[idx] release];
11543*6777b538SAndroid Build Coastguard Worker      _values[idx] = (id)[objects[i] retain];
11544*6777b538SAndroid Build Coastguard Worker    }
11545*6777b538SAndroid Build Coastguard Worker  }
11546*6777b538SAndroid Build Coastguard Worker  return self;
11547*6777b538SAndroid Build Coastguard Worker}
11548*6777b538SAndroid Build Coastguard Worker
11549*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolObjectDictionary *)dictionary {
11550*6777b538SAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
11551*6777b538SAndroid Build Coastguard Worker  if (self) {
11552*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
11553*6777b538SAndroid Build Coastguard Worker      _values[0] = [dictionary->_values[0] retain];
11554*6777b538SAndroid Build Coastguard Worker      _values[1] = [dictionary->_values[1] retain];
11555*6777b538SAndroid Build Coastguard Worker    }
11556*6777b538SAndroid Build Coastguard Worker  }
11557*6777b538SAndroid Build Coastguard Worker  return self;
11558*6777b538SAndroid Build Coastguard Worker}
11559*6777b538SAndroid Build Coastguard Worker
11560*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
11561*6777b538SAndroid Build Coastguard Worker  #pragma unused(numItems)
11562*6777b538SAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
11563*6777b538SAndroid Build Coastguard Worker}
11564*6777b538SAndroid Build Coastguard Worker
11565*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
11566*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11567*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11568*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
11569*6777b538SAndroid Build Coastguard Worker  [_values[0] release];
11570*6777b538SAndroid Build Coastguard Worker  [_values[1] release];
11571*6777b538SAndroid Build Coastguard Worker  [super dealloc];
11572*6777b538SAndroid Build Coastguard Worker}
11573*6777b538SAndroid Build Coastguard Worker
11574*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11575*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolObjectDictionary allocWithZone:zone] initWithDictionary:self];
11576*6777b538SAndroid Build Coastguard Worker}
11577*6777b538SAndroid Build Coastguard Worker
11578*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11579*6777b538SAndroid Build Coastguard Worker  if (self == other) {
11580*6777b538SAndroid Build Coastguard Worker    return YES;
11581*6777b538SAndroid Build Coastguard Worker  }
11582*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolObjectDictionary class]]) {
11583*6777b538SAndroid Build Coastguard Worker    return NO;
11584*6777b538SAndroid Build Coastguard Worker  }
11585*6777b538SAndroid Build Coastguard Worker  GPBBoolObjectDictionary *otherDictionary = other;
11586*6777b538SAndroid Build Coastguard Worker  if (((_values[0] != nil) != (otherDictionary->_values[0] != nil)) ||
11587*6777b538SAndroid Build Coastguard Worker      ((_values[1] != nil) != (otherDictionary->_values[1] != nil))) {
11588*6777b538SAndroid Build Coastguard Worker    return NO;
11589*6777b538SAndroid Build Coastguard Worker  }
11590*6777b538SAndroid Build Coastguard Worker  if (((_values[0] != nil) && (![_values[0] isEqual:otherDictionary->_values[0]])) ||
11591*6777b538SAndroid Build Coastguard Worker      ((_values[1] != nil) && (![_values[1] isEqual:otherDictionary->_values[1]]))) {
11592*6777b538SAndroid Build Coastguard Worker    return NO;
11593*6777b538SAndroid Build Coastguard Worker  }
11594*6777b538SAndroid Build Coastguard Worker  return YES;
11595*6777b538SAndroid Build Coastguard Worker}
11596*6777b538SAndroid Build Coastguard Worker
11597*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
11598*6777b538SAndroid Build Coastguard Worker  return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0);
11599*6777b538SAndroid Build Coastguard Worker}
11600*6777b538SAndroid Build Coastguard Worker
11601*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
11602*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11603*6777b538SAndroid Build Coastguard Worker  if ((_values[0] != nil)) {
11604*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %@", _values[0]];
11605*6777b538SAndroid Build Coastguard Worker  }
11606*6777b538SAndroid Build Coastguard Worker  if ((_values[1] != nil)) {
11607*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %@", _values[1]];
11608*6777b538SAndroid Build Coastguard Worker  }
11609*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
11610*6777b538SAndroid Build Coastguard Worker  return result;
11611*6777b538SAndroid Build Coastguard Worker}
11612*6777b538SAndroid Build Coastguard Worker
11613*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
11614*6777b538SAndroid Build Coastguard Worker  return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0);
11615*6777b538SAndroid Build Coastguard Worker}
11616*6777b538SAndroid Build Coastguard Worker
11617*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(BOOL)key {
11618*6777b538SAndroid Build Coastguard Worker  return _values[key ? 1 : 0];
11619*6777b538SAndroid Build Coastguard Worker}
11620*6777b538SAndroid Build Coastguard Worker
11621*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11622*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11623*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11624*6777b538SAndroid Build Coastguard Worker  [_values[idx] release];
11625*6777b538SAndroid Build Coastguard Worker  _values[idx] = [value->valueString retain];
11626*6777b538SAndroid Build Coastguard Worker}
11627*6777b538SAndroid Build Coastguard Worker
11628*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11629*6777b538SAndroid Build Coastguard Worker  if (_values[0] != nil) {
11630*6777b538SAndroid Build Coastguard Worker    block(@"false", _values[0]);
11631*6777b538SAndroid Build Coastguard Worker  }
11632*6777b538SAndroid Build Coastguard Worker  if ((_values[1] != nil)) {
11633*6777b538SAndroid Build Coastguard Worker    block(@"true", _values[1]);
11634*6777b538SAndroid Build Coastguard Worker  }
11635*6777b538SAndroid Build Coastguard Worker}
11636*6777b538SAndroid Build Coastguard Worker
11637*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
11638*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, id object, BOOL *stop))block {
11639*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
11640*6777b538SAndroid Build Coastguard Worker  if (_values[0] != nil) {
11641*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11642*6777b538SAndroid Build Coastguard Worker  }
11643*6777b538SAndroid Build Coastguard Worker  if (!stop && (_values[1] != nil)) {
11644*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11645*6777b538SAndroid Build Coastguard Worker  }
11646*6777b538SAndroid Build Coastguard Worker}
11647*6777b538SAndroid Build Coastguard Worker
11648*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized {
11649*6777b538SAndroid Build Coastguard Worker  if (_values[0] && ![_values[0] isInitialized]) {
11650*6777b538SAndroid Build Coastguard Worker    return NO;
11651*6777b538SAndroid Build Coastguard Worker  }
11652*6777b538SAndroid Build Coastguard Worker  if (_values[1] && ![_values[1] isInitialized]) {
11653*6777b538SAndroid Build Coastguard Worker    return NO;
11654*6777b538SAndroid Build Coastguard Worker  }
11655*6777b538SAndroid Build Coastguard Worker  return YES;
11656*6777b538SAndroid Build Coastguard Worker}
11657*6777b538SAndroid Build Coastguard Worker
11658*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
11659*6777b538SAndroid Build Coastguard Worker  GPBBoolObjectDictionary *newDict =
11660*6777b538SAndroid Build Coastguard Worker      [[GPBBoolObjectDictionary alloc] init];
11661*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11662*6777b538SAndroid Build Coastguard Worker    if (_values[i] != nil) {
11663*6777b538SAndroid Build Coastguard Worker      newDict->_values[i] = [_values[i] copyWithZone:zone];
11664*6777b538SAndroid Build Coastguard Worker    }
11665*6777b538SAndroid Build Coastguard Worker  }
11666*6777b538SAndroid Build Coastguard Worker  return newDict;
11667*6777b538SAndroid Build Coastguard Worker}
11668*6777b538SAndroid Build Coastguard Worker
11669*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11670*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11671*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
11672*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
11673*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11674*6777b538SAndroid Build Coastguard Worker    if (_values[i] != nil) {
11675*6777b538SAndroid Build Coastguard Worker      ++count;
11676*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11677*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11678*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11679*6777b538SAndroid Build Coastguard Worker    }
11680*6777b538SAndroid Build Coastguard Worker  }
11681*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11682*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
11683*6777b538SAndroid Build Coastguard Worker  return result;
11684*6777b538SAndroid Build Coastguard Worker}
11685*6777b538SAndroid Build Coastguard Worker
11686*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11687*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11688*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11689*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11690*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11691*6777b538SAndroid Build Coastguard Worker    if (_values[i] != nil) {
11692*6777b538SAndroid Build Coastguard Worker      // Write the tag.
11693*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11694*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
11695*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11696*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11697*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11698*6777b538SAndroid Build Coastguard Worker      // Write the fields.
11699*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11700*6777b538SAndroid Build Coastguard Worker      WriteDictObjectField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11701*6777b538SAndroid Build Coastguard Worker    }
11702*6777b538SAndroid Build Coastguard Worker  }
11703*6777b538SAndroid Build Coastguard Worker}
11704*6777b538SAndroid Build Coastguard Worker
11705*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolObjectDictionary *)otherDictionary {
11706*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
11707*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11708*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_values[i] != nil) {
11709*6777b538SAndroid Build Coastguard Worker        [_values[i] release];
11710*6777b538SAndroid Build Coastguard Worker        _values[i] = [otherDictionary->_values[i] retain];
11711*6777b538SAndroid Build Coastguard Worker      }
11712*6777b538SAndroid Build Coastguard Worker    }
11713*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
11714*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11715*6777b538SAndroid Build Coastguard Worker    }
11716*6777b538SAndroid Build Coastguard Worker  }
11717*6777b538SAndroid Build Coastguard Worker}
11718*6777b538SAndroid Build Coastguard Worker
11719*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(BOOL)key {
11720*6777b538SAndroid Build Coastguard Worker  if (!object) {
11721*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
11722*6777b538SAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
11723*6777b538SAndroid Build Coastguard Worker  }
11724*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11725*6777b538SAndroid Build Coastguard Worker  [_values[idx] release];
11726*6777b538SAndroid Build Coastguard Worker  _values[idx] = [object retain];
11727*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
11728*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11729*6777b538SAndroid Build Coastguard Worker  }
11730*6777b538SAndroid Build Coastguard Worker}
11731*6777b538SAndroid Build Coastguard Worker
11732*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(BOOL)aKey {
11733*6777b538SAndroid Build Coastguard Worker  int idx = (aKey ? 1 : 0);
11734*6777b538SAndroid Build Coastguard Worker  [_values[idx] release];
11735*6777b538SAndroid Build Coastguard Worker  _values[idx] = nil;
11736*6777b538SAndroid Build Coastguard Worker}
11737*6777b538SAndroid Build Coastguard Worker
11738*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
11739*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11740*6777b538SAndroid Build Coastguard Worker    [_values[i] release];
11741*6777b538SAndroid Build Coastguard Worker    _values[i] = nil;
11742*6777b538SAndroid Build Coastguard Worker  }
11743*6777b538SAndroid Build Coastguard Worker}
11744*6777b538SAndroid Build Coastguard Worker
11745*6777b538SAndroid Build Coastguard Worker@end
11746*6777b538SAndroid Build Coastguard Worker
11747*6777b538SAndroid Build Coastguard Worker// clang-format on
11748*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END (8 expansions)
11749*6777b538SAndroid Build Coastguard Worker
11750*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Enum
11751*6777b538SAndroid Build Coastguard Worker
11752*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolEnumDictionary {
11753*6777b538SAndroid Build Coastguard Worker @package
11754*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
11755*6777b538SAndroid Build Coastguard Worker  int32_t _values[2];
11756*6777b538SAndroid Build Coastguard Worker  BOOL _valueSet[2];
11757*6777b538SAndroid Build Coastguard Worker}
11758*6777b538SAndroid Build Coastguard Worker
11759*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
11760*6777b538SAndroid Build Coastguard Worker
11761*6777b538SAndroid Build Coastguard Worker- (instancetype)init {
11762*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
11763*6777b538SAndroid Build Coastguard Worker}
11764*6777b538SAndroid Build Coastguard Worker
11765*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
11766*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
11767*6777b538SAndroid Build Coastguard Worker}
11768*6777b538SAndroid Build Coastguard Worker
11769*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
11770*6777b538SAndroid Build Coastguard Worker                                rawValues:(const int32_t [])rawValues
11771*6777b538SAndroid Build Coastguard Worker                                   forKeys:(const BOOL [])keys
11772*6777b538SAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
11773*6777b538SAndroid Build Coastguard Worker  self = [super init];
11774*6777b538SAndroid Build Coastguard Worker  if (self) {
11775*6777b538SAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
11776*6777b538SAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11777*6777b538SAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11778*6777b538SAndroid Build Coastguard Worker      _values[idx] = rawValues[i];
11779*6777b538SAndroid Build Coastguard Worker      _valueSet[idx] = YES;
11780*6777b538SAndroid Build Coastguard Worker    }
11781*6777b538SAndroid Build Coastguard Worker  }
11782*6777b538SAndroid Build Coastguard Worker  return self;
11783*6777b538SAndroid Build Coastguard Worker}
11784*6777b538SAndroid Build Coastguard Worker
11785*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolEnumDictionary *)dictionary {
11786*6777b538SAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
11787*6777b538SAndroid Build Coastguard Worker                                rawValues:NULL
11788*6777b538SAndroid Build Coastguard Worker                                  forKeys:NULL
11789*6777b538SAndroid Build Coastguard Worker                                    count:0];
11790*6777b538SAndroid Build Coastguard Worker  if (self) {
11791*6777b538SAndroid Build Coastguard Worker    if (dictionary) {
11792*6777b538SAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
11793*6777b538SAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
11794*6777b538SAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
11795*6777b538SAndroid Build Coastguard Worker          _valueSet[i] = YES;
11796*6777b538SAndroid Build Coastguard Worker        }
11797*6777b538SAndroid Build Coastguard Worker      }
11798*6777b538SAndroid Build Coastguard Worker    }
11799*6777b538SAndroid Build Coastguard Worker  }
11800*6777b538SAndroid Build Coastguard Worker  return self;
11801*6777b538SAndroid Build Coastguard Worker}
11802*6777b538SAndroid Build Coastguard Worker
11803*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
11804*6777b538SAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
11805*6777b538SAndroid Build Coastguard Worker#pragma unused(numItems)
11806*6777b538SAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
11807*6777b538SAndroid Build Coastguard Worker}
11808*6777b538SAndroid Build Coastguard Worker
11809*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
11810*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
11811*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11812*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11813*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
11814*6777b538SAndroid Build Coastguard Worker  [super dealloc];
11815*6777b538SAndroid Build Coastguard Worker}
11816*6777b538SAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
11817*6777b538SAndroid Build Coastguard Worker
11818*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11819*6777b538SAndroid Build Coastguard Worker  return [[GPBBoolEnumDictionary allocWithZone:zone] initWithDictionary:self];
11820*6777b538SAndroid Build Coastguard Worker}
11821*6777b538SAndroid Build Coastguard Worker
11822*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11823*6777b538SAndroid Build Coastguard Worker  if (self == other) {
11824*6777b538SAndroid Build Coastguard Worker    return YES;
11825*6777b538SAndroid Build Coastguard Worker  }
11826*6777b538SAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolEnumDictionary class]]) {
11827*6777b538SAndroid Build Coastguard Worker    return NO;
11828*6777b538SAndroid Build Coastguard Worker  }
11829*6777b538SAndroid Build Coastguard Worker  GPBBoolEnumDictionary *otherDictionary = other;
11830*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
11831*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
11832*6777b538SAndroid Build Coastguard Worker    return NO;
11833*6777b538SAndroid Build Coastguard Worker  }
11834*6777b538SAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
11835*6777b538SAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
11836*6777b538SAndroid Build Coastguard Worker    return NO;
11837*6777b538SAndroid Build Coastguard Worker  }
11838*6777b538SAndroid Build Coastguard Worker  return YES;
11839*6777b538SAndroid Build Coastguard Worker}
11840*6777b538SAndroid Build Coastguard Worker
11841*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
11842*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11843*6777b538SAndroid Build Coastguard Worker}
11844*6777b538SAndroid Build Coastguard Worker
11845*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
11846*6777b538SAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11847*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11848*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"NO: %d", _values[0]];
11849*6777b538SAndroid Build Coastguard Worker  }
11850*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
11851*6777b538SAndroid Build Coastguard Worker    [result appendFormat:@"YES: %d", _values[1]];
11852*6777b538SAndroid Build Coastguard Worker  }
11853*6777b538SAndroid Build Coastguard Worker  [result appendString:@" }"];
11854*6777b538SAndroid Build Coastguard Worker  return result;
11855*6777b538SAndroid Build Coastguard Worker}
11856*6777b538SAndroid Build Coastguard Worker
11857*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
11858*6777b538SAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11859*6777b538SAndroid Build Coastguard Worker}
11860*6777b538SAndroid Build Coastguard Worker
11861*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t*)value forKey:(BOOL)key {
11862*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11863*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11864*6777b538SAndroid Build Coastguard Worker    if (value) {
11865*6777b538SAndroid Build Coastguard Worker      int32_t result = _values[idx];
11866*6777b538SAndroid Build Coastguard Worker      if (!_validationFunc(result)) {
11867*6777b538SAndroid Build Coastguard Worker        result = kGPBUnrecognizedEnumeratorValue;
11868*6777b538SAndroid Build Coastguard Worker      }
11869*6777b538SAndroid Build Coastguard Worker      *value = result;
11870*6777b538SAndroid Build Coastguard Worker    }
11871*6777b538SAndroid Build Coastguard Worker    return YES;
11872*6777b538SAndroid Build Coastguard Worker  }
11873*6777b538SAndroid Build Coastguard Worker  return NO;
11874*6777b538SAndroid Build Coastguard Worker}
11875*6777b538SAndroid Build Coastguard Worker
11876*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t*)rawValue forKey:(BOOL)key {
11877*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11878*6777b538SAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11879*6777b538SAndroid Build Coastguard Worker    if (rawValue) {
11880*6777b538SAndroid Build Coastguard Worker      *rawValue = _values[idx];
11881*6777b538SAndroid Build Coastguard Worker    }
11882*6777b538SAndroid Build Coastguard Worker    return YES;
11883*6777b538SAndroid Build Coastguard Worker  }
11884*6777b538SAndroid Build Coastguard Worker  return NO;
11885*6777b538SAndroid Build Coastguard Worker}
11886*6777b538SAndroid Build Coastguard Worker
11887*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
11888*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int32_t value, BOOL *stop))block {
11889*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
11890*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11891*6777b538SAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11892*6777b538SAndroid Build Coastguard Worker  }
11893*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11894*6777b538SAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11895*6777b538SAndroid Build Coastguard Worker  }
11896*6777b538SAndroid Build Coastguard Worker}
11897*6777b538SAndroid Build Coastguard Worker
11898*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
11899*6777b538SAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int32_t rawValue, BOOL *stop))block {
11900*6777b538SAndroid Build Coastguard Worker  BOOL stop = NO;
11901*6777b538SAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
11902*6777b538SAndroid Build Coastguard Worker  int32_t validatedValue;
11903*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11904*6777b538SAndroid Build Coastguard Worker    validatedValue = _values[0];
11905*6777b538SAndroid Build Coastguard Worker    if (!func(validatedValue)) {
11906*6777b538SAndroid Build Coastguard Worker      validatedValue = kGPBUnrecognizedEnumeratorValue;
11907*6777b538SAndroid Build Coastguard Worker    }
11908*6777b538SAndroid Build Coastguard Worker    block(NO, validatedValue, &stop);
11909*6777b538SAndroid Build Coastguard Worker  }
11910*6777b538SAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11911*6777b538SAndroid Build Coastguard Worker    validatedValue = _values[1];
11912*6777b538SAndroid Build Coastguard Worker    if (!func(validatedValue)) {
11913*6777b538SAndroid Build Coastguard Worker      validatedValue = kGPBUnrecognizedEnumeratorValue;
11914*6777b538SAndroid Build Coastguard Worker    }
11915*6777b538SAndroid Build Coastguard Worker    block(YES, validatedValue, &stop);
11916*6777b538SAndroid Build Coastguard Worker  }
11917*6777b538SAndroid Build Coastguard Worker}
11918*6777b538SAndroid Build Coastguard Worker
11919*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
11920*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11921*6777b538SAndroid Build Coastguard Worker// clang-format off
11922*6777b538SAndroid Build Coastguard Worker
11923*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
11924*6777b538SAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
11925*6777b538SAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
11926*6777b538SAndroid Build Coastguard Worker  size_t msgSize = ComputeDictBoolFieldSize(key->valueBool, kMapKeyFieldNumber, keyDataType);
11927*6777b538SAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
11928*6777b538SAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
11929*6777b538SAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
11930*6777b538SAndroid Build Coastguard Worker  WriteDictBoolField(outputStream, key->valueBool, kMapKeyFieldNumber, keyDataType);
11931*6777b538SAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
11932*6777b538SAndroid Build Coastguard Worker  [outputStream release];
11933*6777b538SAndroid Build Coastguard Worker  return data;
11934*6777b538SAndroid Build Coastguard Worker}
11935*6777b538SAndroid Build Coastguard Worker
11936*6777b538SAndroid Build Coastguard Worker// clang-format on
11937*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
11938*6777b538SAndroid Build Coastguard Worker
11939*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11940*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11941*6777b538SAndroid Build Coastguard Worker  NSUInteger count = 0;
11942*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
11943*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11944*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11945*6777b538SAndroid Build Coastguard Worker      ++count;
11946*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11947*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11948*6777b538SAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11949*6777b538SAndroid Build Coastguard Worker    }
11950*6777b538SAndroid Build Coastguard Worker  }
11951*6777b538SAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11952*6777b538SAndroid Build Coastguard Worker  result += tagSize * count;
11953*6777b538SAndroid Build Coastguard Worker  return result;
11954*6777b538SAndroid Build Coastguard Worker}
11955*6777b538SAndroid Build Coastguard Worker
11956*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11957*6777b538SAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11958*6777b538SAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11959*6777b538SAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11960*6777b538SAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11961*6777b538SAndroid Build Coastguard Worker    if (_valueSet[i]) {
11962*6777b538SAndroid Build Coastguard Worker      // Write the tag.
11963*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11964*6777b538SAndroid Build Coastguard Worker      // Write the size of the message.
11965*6777b538SAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11966*6777b538SAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11967*6777b538SAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11968*6777b538SAndroid Build Coastguard Worker      // Write the fields.
11969*6777b538SAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11970*6777b538SAndroid Build Coastguard Worker      WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11971*6777b538SAndroid Build Coastguard Worker    }
11972*6777b538SAndroid Build Coastguard Worker  }
11973*6777b538SAndroid Build Coastguard Worker}
11974*6777b538SAndroid Build Coastguard Worker
11975*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11976*6777b538SAndroid Build Coastguard Worker  if (_valueSet[0]) {
11977*6777b538SAndroid Build Coastguard Worker    block(@"false", @(_values[0]));
11978*6777b538SAndroid Build Coastguard Worker  }
11979*6777b538SAndroid Build Coastguard Worker  if (_valueSet[1]) {
11980*6777b538SAndroid Build Coastguard Worker    block(@"true", @(_values[1]));
11981*6777b538SAndroid Build Coastguard Worker  }
11982*6777b538SAndroid Build Coastguard Worker}
11983*6777b538SAndroid Build Coastguard Worker
11984*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11985*6777b538SAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11986*6777b538SAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11987*6777b538SAndroid Build Coastguard Worker  _values[idx] = value->valueInt32;
11988*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11989*6777b538SAndroid Build Coastguard Worker}
11990*6777b538SAndroid Build Coastguard Worker
11991*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBBoolEnumDictionary *)otherDictionary {
11992*6777b538SAndroid Build Coastguard Worker  if (otherDictionary) {
11993*6777b538SAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11994*6777b538SAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11995*6777b538SAndroid Build Coastguard Worker        _valueSet[i] = YES;
11996*6777b538SAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11997*6777b538SAndroid Build Coastguard Worker      }
11998*6777b538SAndroid Build Coastguard Worker    }
11999*6777b538SAndroid Build Coastguard Worker    if (_autocreator) {
12000*6777b538SAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
12001*6777b538SAndroid Build Coastguard Worker    }
12002*6777b538SAndroid Build Coastguard Worker  }
12003*6777b538SAndroid Build Coastguard Worker}
12004*6777b538SAndroid Build Coastguard Worker
12005*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(BOOL)key {
12006*6777b538SAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
12007*6777b538SAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
12008*6777b538SAndroid Build Coastguard Worker                format:@"GPBBoolEnumDictionary: Attempt to set an unknown enum value (%d)",
12009*6777b538SAndroid Build Coastguard Worker     value];
12010*6777b538SAndroid Build Coastguard Worker  }
12011*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
12012*6777b538SAndroid Build Coastguard Worker  _values[idx] = value;
12013*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
12014*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
12015*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12016*6777b538SAndroid Build Coastguard Worker  }
12017*6777b538SAndroid Build Coastguard Worker}
12018*6777b538SAndroid Build Coastguard Worker
12019*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)rawValue forKey:(BOOL)key {
12020*6777b538SAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
12021*6777b538SAndroid Build Coastguard Worker  _values[idx] = rawValue;
12022*6777b538SAndroid Build Coastguard Worker  _valueSet[idx] = YES;
12023*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
12024*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12025*6777b538SAndroid Build Coastguard Worker  }
12026*6777b538SAndroid Build Coastguard Worker}
12027*6777b538SAndroid Build Coastguard Worker
12028*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(BOOL)aKey {
12029*6777b538SAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
12030*6777b538SAndroid Build Coastguard Worker}
12031*6777b538SAndroid Build Coastguard Worker
12032*6777b538SAndroid Build Coastguard Worker- (void)removeAll {
12033*6777b538SAndroid Build Coastguard Worker  _valueSet[0] = NO;
12034*6777b538SAndroid Build Coastguard Worker  _valueSet[1] = NO;
12035*6777b538SAndroid Build Coastguard Worker}
12036*6777b538SAndroid Build Coastguard Worker
12037*6777b538SAndroid Build Coastguard Worker@end
12038*6777b538SAndroid Build Coastguard Worker
12039*6777b538SAndroid Build Coastguard Worker#pragma mark - NSDictionary Subclass
12040*6777b538SAndroid Build Coastguard Worker
12041*6777b538SAndroid Build Coastguard Worker@implementation GPBAutocreatedDictionary {
12042*6777b538SAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
12043*6777b538SAndroid Build Coastguard Worker}
12044*6777b538SAndroid Build Coastguard Worker
12045*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
12046*6777b538SAndroid Build Coastguard Worker  NSAssert(!_autocreator,
12047*6777b538SAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
12048*6777b538SAndroid Build Coastguard Worker           [self class], _autocreator);
12049*6777b538SAndroid Build Coastguard Worker  [_dictionary release];
12050*6777b538SAndroid Build Coastguard Worker  [super dealloc];
12051*6777b538SAndroid Build Coastguard Worker}
12052*6777b538SAndroid Build Coastguard Worker
12053*6777b538SAndroid Build Coastguard Worker#pragma mark Required NSDictionary overrides
12054*6777b538SAndroid Build Coastguard Worker
12055*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
12056*6777b538SAndroid Build Coastguard Worker                        forKeys:(const id<NSCopying> [])keys
12057*6777b538SAndroid Build Coastguard Worker                          count:(NSUInteger)count {
12058*6777b538SAndroid Build Coastguard Worker  self = [super init];
12059*6777b538SAndroid Build Coastguard Worker  if (self) {
12060*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] initWithObjects:objects
12061*6777b538SAndroid Build Coastguard Worker                                                       forKeys:keys
12062*6777b538SAndroid Build Coastguard Worker                                                         count:count];
12063*6777b538SAndroid Build Coastguard Worker  }
12064*6777b538SAndroid Build Coastguard Worker  return self;
12065*6777b538SAndroid Build Coastguard Worker}
12066*6777b538SAndroid Build Coastguard Worker
12067*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count {
12068*6777b538SAndroid Build Coastguard Worker  return [_dictionary count];
12069*6777b538SAndroid Build Coastguard Worker}
12070*6777b538SAndroid Build Coastguard Worker
12071*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(id)aKey {
12072*6777b538SAndroid Build Coastguard Worker  return [_dictionary objectForKey:aKey];
12073*6777b538SAndroid Build Coastguard Worker}
12074*6777b538SAndroid Build Coastguard Worker
12075*6777b538SAndroid Build Coastguard Worker- (NSEnumerator *)keyEnumerator {
12076*6777b538SAndroid Build Coastguard Worker  if (_dictionary == nil) {
12077*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
12078*6777b538SAndroid Build Coastguard Worker  }
12079*6777b538SAndroid Build Coastguard Worker  return [_dictionary keyEnumerator];
12080*6777b538SAndroid Build Coastguard Worker}
12081*6777b538SAndroid Build Coastguard Worker
12082*6777b538SAndroid Build Coastguard Worker#pragma mark Required NSMutableDictionary overrides
12083*6777b538SAndroid Build Coastguard Worker
12084*6777b538SAndroid Build Coastguard Worker// Only need to call GPBAutocreatedDictionaryModified() when adding things
12085*6777b538SAndroid Build Coastguard Worker// since we only autocreate empty dictionaries.
12086*6777b538SAndroid Build Coastguard Worker
12087*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey {
12088*6777b538SAndroid Build Coastguard Worker  if (_dictionary == nil) {
12089*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
12090*6777b538SAndroid Build Coastguard Worker  }
12091*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:anObject forKey:aKey];
12092*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
12093*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12094*6777b538SAndroid Build Coastguard Worker  }
12095*6777b538SAndroid Build Coastguard Worker}
12096*6777b538SAndroid Build Coastguard Worker
12097*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(id)aKey {
12098*6777b538SAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
12099*6777b538SAndroid Build Coastguard Worker}
12100*6777b538SAndroid Build Coastguard Worker
12101*6777b538SAndroid Build Coastguard Worker#pragma mark Extra things hooked
12102*6777b538SAndroid Build Coastguard Worker
12103*6777b538SAndroid Build Coastguard Worker- (id)copyWithZone:(NSZone *)zone {
12104*6777b538SAndroid Build Coastguard Worker  if (_dictionary == nil) {
12105*6777b538SAndroid Build Coastguard Worker    return [[NSMutableDictionary allocWithZone:zone] init];
12106*6777b538SAndroid Build Coastguard Worker  }
12107*6777b538SAndroid Build Coastguard Worker  return [_dictionary copyWithZone:zone];
12108*6777b538SAndroid Build Coastguard Worker}
12109*6777b538SAndroid Build Coastguard Worker
12110*6777b538SAndroid Build Coastguard Worker- (id)mutableCopyWithZone:(NSZone *)zone {
12111*6777b538SAndroid Build Coastguard Worker  if (_dictionary == nil) {
12112*6777b538SAndroid Build Coastguard Worker    return [[NSMutableDictionary allocWithZone:zone] init];
12113*6777b538SAndroid Build Coastguard Worker  }
12114*6777b538SAndroid Build Coastguard Worker  return [_dictionary mutableCopyWithZone:zone];
12115*6777b538SAndroid Build Coastguard Worker}
12116*6777b538SAndroid Build Coastguard Worker
12117*6777b538SAndroid Build Coastguard Worker// Not really needed, but subscripting is likely common enough it doesn't hurt
12118*6777b538SAndroid Build Coastguard Worker// to ensure it goes directly to the real NSMutableDictionary.
12119*6777b538SAndroid Build Coastguard Worker- (id)objectForKeyedSubscript:(id)key {
12120*6777b538SAndroid Build Coastguard Worker  return [_dictionary objectForKeyedSubscript:key];
12121*6777b538SAndroid Build Coastguard Worker}
12122*6777b538SAndroid Build Coastguard Worker
12123*6777b538SAndroid Build Coastguard Worker// Not really needed, but subscripting is likely common enough it doesn't hurt
12124*6777b538SAndroid Build Coastguard Worker// to ensure it goes directly to the real NSMutableDictionary.
12125*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key {
12126*6777b538SAndroid Build Coastguard Worker  if (_dictionary == nil) {
12127*6777b538SAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
12128*6777b538SAndroid Build Coastguard Worker  }
12129*6777b538SAndroid Build Coastguard Worker  [_dictionary setObject:obj forKeyedSubscript:key];
12130*6777b538SAndroid Build Coastguard Worker  if (_autocreator) {
12131*6777b538SAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12132*6777b538SAndroid Build Coastguard Worker  }
12133*6777b538SAndroid Build Coastguard Worker}
12134*6777b538SAndroid Build Coastguard Worker
12135*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:(void (NS_NOESCAPE ^)(id key,
12136*6777b538SAndroid Build Coastguard Worker                                                    id obj,
12137*6777b538SAndroid Build Coastguard Worker                                                    BOOL *stop))block {
12138*6777b538SAndroid Build Coastguard Worker  [_dictionary enumerateKeysAndObjectsUsingBlock:block];
12139*6777b538SAndroid Build Coastguard Worker}
12140*6777b538SAndroid Build Coastguard Worker
12141*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts
12142*6777b538SAndroid Build Coastguard Worker                                usingBlock:(void (NS_NOESCAPE ^)(id key,
12143*6777b538SAndroid Build Coastguard Worker                                                     id obj,
12144*6777b538SAndroid Build Coastguard Worker                                                     BOOL *stop))block {
12145*6777b538SAndroid Build Coastguard Worker  [_dictionary enumerateKeysAndObjectsWithOptions:opts usingBlock:block];
12146*6777b538SAndroid Build Coastguard Worker}
12147*6777b538SAndroid Build Coastguard Worker
12148*6777b538SAndroid Build Coastguard Worker@end
12149*6777b538SAndroid Build Coastguard Worker
12150*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic pop
12151