xref: /aosp_15_r20/external/protobuf/objectivec/GPBDictionary.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format
2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2008 Google Inc.  All rights reserved.
3*1b3f573fSAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/
4*1b3f573fSAndroid Build Coastguard Worker//
5*1b3f573fSAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without
6*1b3f573fSAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are
7*1b3f573fSAndroid Build Coastguard Worker// met:
8*1b3f573fSAndroid Build Coastguard Worker//
9*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions of source code must retain the above copyright
10*1b3f573fSAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer.
11*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions in binary form must reproduce the above
12*1b3f573fSAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer
13*1b3f573fSAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the
14*1b3f573fSAndroid Build Coastguard Worker// distribution.
15*1b3f573fSAndroid Build Coastguard Worker//     * Neither the name of Google Inc. nor the names of its
16*1b3f573fSAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from
17*1b3f573fSAndroid Build Coastguard Worker// this software without specific prior written permission.
18*1b3f573fSAndroid Build Coastguard Worker//
19*1b3f573fSAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*1b3f573fSAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*1b3f573fSAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*1b3f573fSAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*1b3f573fSAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*1b3f573fSAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*1b3f573fSAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*1b3f573fSAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*1b3f573fSAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*1b3f573fSAndroid Build Coastguard Worker
31*1b3f573fSAndroid Build Coastguard Worker#import "GPBDictionary_PackagePrivate.h"
32*1b3f573fSAndroid Build Coastguard Worker
33*1b3f573fSAndroid Build Coastguard Worker#import "GPBCodedInputStream_PackagePrivate.h"
34*1b3f573fSAndroid Build Coastguard Worker#import "GPBCodedOutputStream_PackagePrivate.h"
35*1b3f573fSAndroid Build Coastguard Worker#import "GPBDescriptor_PackagePrivate.h"
36*1b3f573fSAndroid Build Coastguard Worker#import "GPBMessage_PackagePrivate.h"
37*1b3f573fSAndroid Build Coastguard Worker#import "GPBUtilities_PackagePrivate.h"
38*1b3f573fSAndroid Build Coastguard Worker
39*1b3f573fSAndroid Build Coastguard Worker// ------------------------------ NOTE ------------------------------
40*1b3f573fSAndroid Build Coastguard Worker// At the moment, this is all using NSNumbers in NSDictionaries under
41*1b3f573fSAndroid Build Coastguard Worker// the hood, but it is all hidden so we can come back and optimize
42*1b3f573fSAndroid Build Coastguard Worker// with direct CFDictionary usage later.  The reason that wasn't
43*1b3f573fSAndroid Build Coastguard Worker// done yet is needing to support 32bit iOS builds.  Otherwise
44*1b3f573fSAndroid Build Coastguard Worker// it would be pretty simple to store all this data in CFDictionaries
45*1b3f573fSAndroid Build Coastguard Worker// directly.
46*1b3f573fSAndroid Build Coastguard Worker// ------------------------------------------------------------------
47*1b3f573fSAndroid Build Coastguard Worker
48*1b3f573fSAndroid Build Coastguard Worker// Direct access is use for speed, to avoid even internally declaring things
49*1b3f573fSAndroid Build Coastguard Worker// read/write, etc. The warning is enabled in the project to ensure code calling
50*1b3f573fSAndroid Build Coastguard Worker// protos can turn on -Wdirect-ivar-access without issues.
51*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic push
52*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wdirect-ivar-access"
53*1b3f573fSAndroid Build Coastguard Worker
54*1b3f573fSAndroid Build Coastguard Worker// Used to include code only visible to specific versions of the static
55*1b3f573fSAndroid Build Coastguard Worker// analyzer. Useful for wrapping code that only exists to silence the analyzer.
56*1b3f573fSAndroid Build Coastguard Worker// Determine the values you want to use for BEGIN_APPLE_BUILD_VERSION,
57*1b3f573fSAndroid Build Coastguard Worker// END_APPLE_BUILD_VERSION using:
58*1b3f573fSAndroid Build Coastguard Worker//   xcrun clang -dM -E -x c /dev/null | grep __apple_build_version__
59*1b3f573fSAndroid Build Coastguard Worker// Example usage:
60*1b3f573fSAndroid Build Coastguard Worker//  #if GPB_STATIC_ANALYZER_ONLY(5621, 5623) ... #endif
61*1b3f573fSAndroid Build Coastguard Worker#define GPB_STATIC_ANALYZER_ONLY(BEGIN_APPLE_BUILD_VERSION, END_APPLE_BUILD_VERSION) \
62*1b3f573fSAndroid Build Coastguard Worker    (defined(__clang_analyzer__) && \
63*1b3f573fSAndroid Build Coastguard Worker     (__apple_build_version__ >= BEGIN_APPLE_BUILD_VERSION && \
64*1b3f573fSAndroid Build Coastguard Worker      __apple_build_version__ <= END_APPLE_BUILD_VERSION))
65*1b3f573fSAndroid Build Coastguard Worker
66*1b3f573fSAndroid Build Coastguard Workerenum {
67*1b3f573fSAndroid Build Coastguard Worker  kMapKeyFieldNumber = 1,
68*1b3f573fSAndroid Build Coastguard Worker  kMapValueFieldNumber = 2,
69*1b3f573fSAndroid Build Coastguard Worker};
70*1b3f573fSAndroid Build Coastguard Worker
71*1b3f573fSAndroid Build Coastguard Workerstatic BOOL DictDefault_IsValidValue(int32_t value) {
72*1b3f573fSAndroid Build Coastguard Worker  // Anything but the bad value marker is allowed.
73*1b3f573fSAndroid Build Coastguard Worker  return (value != kGPBUnrecognizedEnumeratorValue);
74*1b3f573fSAndroid Build Coastguard Worker}
75*1b3f573fSAndroid Build Coastguard Worker
76*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_2_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME1, GPBDATATYPE_NAME2)
77*1b3f573fSAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
78*1b3f573fSAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
79*1b3f573fSAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value);
80*1b3f573fSAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
81*1b3f573fSAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value);
82*1b3f573fSAndroid Build Coastguard Worker//%  } else {
83*1b3f573fSAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
84*1b3f573fSAndroid Build Coastguard Worker//%    return 0;
85*1b3f573fSAndroid Build Coastguard Worker//%  }
86*1b3f573fSAndroid Build Coastguard Worker//%}
87*1b3f573fSAndroid Build Coastguard Worker//%
88*1b3f573fSAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
89*1b3f573fSAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
90*1b3f573fSAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME1##:fieldNum value:value];
91*1b3f573fSAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
92*1b3f573fSAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME2##:fieldNum value:value];
93*1b3f573fSAndroid Build Coastguard Worker//%  } else {
94*1b3f573fSAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
95*1b3f573fSAndroid Build Coastguard Worker//%  }
96*1b3f573fSAndroid Build Coastguard Worker//%}
97*1b3f573fSAndroid Build Coastguard Worker//%
98*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_3_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME1, GPBDATATYPE_NAME2, GPBDATATYPE_NAME3)
99*1b3f573fSAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
100*1b3f573fSAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
101*1b3f573fSAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value);
102*1b3f573fSAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
103*1b3f573fSAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value);
104*1b3f573fSAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) {
105*1b3f573fSAndroid Build Coastguard Worker//%    return GPBCompute##GPBDATATYPE_NAME3##Size(fieldNum, value);
106*1b3f573fSAndroid Build Coastguard Worker//%  } else {
107*1b3f573fSAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
108*1b3f573fSAndroid Build Coastguard Worker//%    return 0;
109*1b3f573fSAndroid Build Coastguard Worker//%  }
110*1b3f573fSAndroid Build Coastguard Worker//%}
111*1b3f573fSAndroid Build Coastguard Worker//%
112*1b3f573fSAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
113*1b3f573fSAndroid Build Coastguard Worker//%  if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
114*1b3f573fSAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME1##:fieldNum value:value];
115*1b3f573fSAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
116*1b3f573fSAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME2##:fieldNum value:value];
117*1b3f573fSAndroid Build Coastguard Worker//%  } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) {
118*1b3f573fSAndroid Build Coastguard Worker//%    [stream write##GPBDATATYPE_NAME3##:fieldNum value:value];
119*1b3f573fSAndroid Build Coastguard Worker//%  } else {
120*1b3f573fSAndroid Build Coastguard Worker//%    NSCAssert(NO, @"Unexpected type %d", dataType);
121*1b3f573fSAndroid Build Coastguard Worker//%  }
122*1b3f573fSAndroid Build Coastguard Worker//%}
123*1b3f573fSAndroid Build Coastguard Worker//%
124*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SIMPLE_SERIALIZE_SUPPORT(VALUE_NAME, VALUE_TYPE, VisP)
125*1b3f573fSAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) {
126*1b3f573fSAndroid Build Coastguard Worker//%  NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
127*1b3f573fSAndroid Build Coastguard Worker//%  #pragma unused(dataType)  // For when asserts are off in release.
128*1b3f573fSAndroid Build Coastguard Worker//%  return GPBCompute##VALUE_NAME##Size(fieldNum, value);
129*1b3f573fSAndroid Build Coastguard Worker//%}
130*1b3f573fSAndroid Build Coastguard Worker//%
131*1b3f573fSAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) {
132*1b3f573fSAndroid Build Coastguard Worker//%  NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
133*1b3f573fSAndroid Build Coastguard Worker//%  #pragma unused(dataType)  // For when asserts are off in release.
134*1b3f573fSAndroid Build Coastguard Worker//%  [stream write##VALUE_NAME##:fieldNum value:value];
135*1b3f573fSAndroid Build Coastguard Worker//%}
136*1b3f573fSAndroid Build Coastguard Worker//%
137*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_HELPERS()
138*1b3f573fSAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Int32, int32_t, Int32, SInt32, SFixed32)
139*1b3f573fSAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_2_TYPE(UInt32, uint32_t, UInt32, Fixed32)
140*1b3f573fSAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Int64, int64_t, Int64, SInt64, SFixed64)
141*1b3f573fSAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_2_TYPE(UInt64, uint64_t, UInt64, Fixed64)
142*1b3f573fSAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Bool, BOOL, )
143*1b3f573fSAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Enum, int32_t, )
144*1b3f573fSAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Float, float, )
145*1b3f573fSAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Double, double, )
146*1b3f573fSAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(String, NSString, *)
147*1b3f573fSAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Object, id, Message, String, Bytes)
148*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND SERIALIZE_SUPPORT_HELPERS()
149*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
150*1b3f573fSAndroid Build Coastguard Worker// clang-format off
151*1b3f573fSAndroid Build Coastguard Worker
152*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictInt32FieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) {
153*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt32) {
154*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeInt32Size(fieldNum, value);
155*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt32) {
156*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeSInt32Size(fieldNum, value);
157*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed32) {
158*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeSFixed32Size(fieldNum, value);
159*1b3f573fSAndroid Build Coastguard Worker  } else {
160*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
161*1b3f573fSAndroid Build Coastguard Worker    return 0;
162*1b3f573fSAndroid Build Coastguard Worker  }
163*1b3f573fSAndroid Build Coastguard Worker}
164*1b3f573fSAndroid Build Coastguard Worker
165*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictInt32Field(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, GPBDataType dataType) {
166*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt32) {
167*1b3f573fSAndroid Build Coastguard Worker    [stream writeInt32:fieldNum value:value];
168*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt32) {
169*1b3f573fSAndroid Build Coastguard Worker    [stream writeSInt32:fieldNum value:value];
170*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed32) {
171*1b3f573fSAndroid Build Coastguard Worker    [stream writeSFixed32:fieldNum value:value];
172*1b3f573fSAndroid Build Coastguard Worker  } else {
173*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
174*1b3f573fSAndroid Build Coastguard Worker  }
175*1b3f573fSAndroid Build Coastguard Worker}
176*1b3f573fSAndroid Build Coastguard Worker
177*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictUInt32FieldSize(uint32_t value, uint32_t fieldNum, GPBDataType dataType) {
178*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt32) {
179*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeUInt32Size(fieldNum, value);
180*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed32) {
181*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeFixed32Size(fieldNum, value);
182*1b3f573fSAndroid Build Coastguard Worker  } else {
183*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
184*1b3f573fSAndroid Build Coastguard Worker    return 0;
185*1b3f573fSAndroid Build Coastguard Worker  }
186*1b3f573fSAndroid Build Coastguard Worker}
187*1b3f573fSAndroid Build Coastguard Worker
188*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictUInt32Field(GPBCodedOutputStream *stream, uint32_t value, uint32_t fieldNum, GPBDataType dataType) {
189*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt32) {
190*1b3f573fSAndroid Build Coastguard Worker    [stream writeUInt32:fieldNum value:value];
191*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed32) {
192*1b3f573fSAndroid Build Coastguard Worker    [stream writeFixed32:fieldNum value:value];
193*1b3f573fSAndroid Build Coastguard Worker  } else {
194*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
195*1b3f573fSAndroid Build Coastguard Worker  }
196*1b3f573fSAndroid Build Coastguard Worker}
197*1b3f573fSAndroid Build Coastguard Worker
198*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictInt64FieldSize(int64_t value, uint32_t fieldNum, GPBDataType dataType) {
199*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt64) {
200*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeInt64Size(fieldNum, value);
201*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt64) {
202*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeSInt64Size(fieldNum, value);
203*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed64) {
204*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeSFixed64Size(fieldNum, value);
205*1b3f573fSAndroid Build Coastguard Worker  } else {
206*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
207*1b3f573fSAndroid Build Coastguard Worker    return 0;
208*1b3f573fSAndroid Build Coastguard Worker  }
209*1b3f573fSAndroid Build Coastguard Worker}
210*1b3f573fSAndroid Build Coastguard Worker
211*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictInt64Field(GPBCodedOutputStream *stream, int64_t value, uint32_t fieldNum, GPBDataType dataType) {
212*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeInt64) {
213*1b3f573fSAndroid Build Coastguard Worker    [stream writeInt64:fieldNum value:value];
214*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSInt64) {
215*1b3f573fSAndroid Build Coastguard Worker    [stream writeSInt64:fieldNum value:value];
216*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeSFixed64) {
217*1b3f573fSAndroid Build Coastguard Worker    [stream writeSFixed64:fieldNum value:value];
218*1b3f573fSAndroid Build Coastguard Worker  } else {
219*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
220*1b3f573fSAndroid Build Coastguard Worker  }
221*1b3f573fSAndroid Build Coastguard Worker}
222*1b3f573fSAndroid Build Coastguard Worker
223*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictUInt64FieldSize(uint64_t value, uint32_t fieldNum, GPBDataType dataType) {
224*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt64) {
225*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeUInt64Size(fieldNum, value);
226*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed64) {
227*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeFixed64Size(fieldNum, value);
228*1b3f573fSAndroid Build Coastguard Worker  } else {
229*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
230*1b3f573fSAndroid Build Coastguard Worker    return 0;
231*1b3f573fSAndroid Build Coastguard Worker  }
232*1b3f573fSAndroid Build Coastguard Worker}
233*1b3f573fSAndroid Build Coastguard Worker
234*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictUInt64Field(GPBCodedOutputStream *stream, uint64_t value, uint32_t fieldNum, GPBDataType dataType) {
235*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeUInt64) {
236*1b3f573fSAndroid Build Coastguard Worker    [stream writeUInt64:fieldNum value:value];
237*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeFixed64) {
238*1b3f573fSAndroid Build Coastguard Worker    [stream writeFixed64:fieldNum value:value];
239*1b3f573fSAndroid Build Coastguard Worker  } else {
240*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
241*1b3f573fSAndroid Build Coastguard Worker  }
242*1b3f573fSAndroid Build Coastguard Worker}
243*1b3f573fSAndroid Build Coastguard Worker
244*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictBoolFieldSize(BOOL value, uint32_t fieldNum, GPBDataType dataType) {
245*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
246*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
247*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeBoolSize(fieldNum, value);
248*1b3f573fSAndroid Build Coastguard Worker}
249*1b3f573fSAndroid Build Coastguard Worker
250*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictBoolField(GPBCodedOutputStream *stream, BOOL value, uint32_t fieldNum, GPBDataType dataType) {
251*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
252*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
253*1b3f573fSAndroid Build Coastguard Worker  [stream writeBool:fieldNum value:value];
254*1b3f573fSAndroid Build Coastguard Worker}
255*1b3f573fSAndroid Build Coastguard Worker
256*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictEnumFieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) {
257*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
258*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
259*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeEnumSize(fieldNum, value);
260*1b3f573fSAndroid Build Coastguard Worker}
261*1b3f573fSAndroid Build Coastguard Worker
262*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictEnumField(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, GPBDataType dataType) {
263*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
264*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
265*1b3f573fSAndroid Build Coastguard Worker  [stream writeEnum:fieldNum value:value];
266*1b3f573fSAndroid Build Coastguard Worker}
267*1b3f573fSAndroid Build Coastguard Worker
268*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictFloatFieldSize(float value, uint32_t fieldNum, GPBDataType dataType) {
269*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
270*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
271*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeFloatSize(fieldNum, value);
272*1b3f573fSAndroid Build Coastguard Worker}
273*1b3f573fSAndroid Build Coastguard Worker
274*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictFloatField(GPBCodedOutputStream *stream, float value, uint32_t fieldNum, GPBDataType dataType) {
275*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
276*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
277*1b3f573fSAndroid Build Coastguard Worker  [stream writeFloat:fieldNum value:value];
278*1b3f573fSAndroid Build Coastguard Worker}
279*1b3f573fSAndroid Build Coastguard Worker
280*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictDoubleFieldSize(double value, uint32_t fieldNum, GPBDataType dataType) {
281*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
282*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
283*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeDoubleSize(fieldNum, value);
284*1b3f573fSAndroid Build Coastguard Worker}
285*1b3f573fSAndroid Build Coastguard Worker
286*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictDoubleField(GPBCodedOutputStream *stream, double value, uint32_t fieldNum, GPBDataType dataType) {
287*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
288*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
289*1b3f573fSAndroid Build Coastguard Worker  [stream writeDouble:fieldNum value:value];
290*1b3f573fSAndroid Build Coastguard Worker}
291*1b3f573fSAndroid Build Coastguard Worker
292*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictStringFieldSize(NSString *value, uint32_t fieldNum, GPBDataType dataType) {
293*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
294*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
295*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeStringSize(fieldNum, value);
296*1b3f573fSAndroid Build Coastguard Worker}
297*1b3f573fSAndroid Build Coastguard Worker
298*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictStringField(GPBCodedOutputStream *stream, NSString *value, uint32_t fieldNum, GPBDataType dataType) {
299*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
300*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(dataType)  // For when asserts are off in release.
301*1b3f573fSAndroid Build Coastguard Worker  [stream writeString:fieldNum value:value];
302*1b3f573fSAndroid Build Coastguard Worker}
303*1b3f573fSAndroid Build Coastguard Worker
304*1b3f573fSAndroid Build Coastguard Workerstatic size_t ComputeDictObjectFieldSize(id value, uint32_t fieldNum, GPBDataType dataType) {
305*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeMessage) {
306*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeMessageSize(fieldNum, value);
307*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeString) {
308*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeStringSize(fieldNum, value);
309*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeBytes) {
310*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeBytesSize(fieldNum, value);
311*1b3f573fSAndroid Build Coastguard Worker  } else {
312*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
313*1b3f573fSAndroid Build Coastguard Worker    return 0;
314*1b3f573fSAndroid Build Coastguard Worker  }
315*1b3f573fSAndroid Build Coastguard Worker}
316*1b3f573fSAndroid Build Coastguard Worker
317*1b3f573fSAndroid Build Coastguard Workerstatic void WriteDictObjectField(GPBCodedOutputStream *stream, id value, uint32_t fieldNum, GPBDataType dataType) {
318*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeMessage) {
319*1b3f573fSAndroid Build Coastguard Worker    [stream writeMessage:fieldNum value:value];
320*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeString) {
321*1b3f573fSAndroid Build Coastguard Worker    [stream writeString:fieldNum value:value];
322*1b3f573fSAndroid Build Coastguard Worker  } else if (dataType == GPBDataTypeBytes) {
323*1b3f573fSAndroid Build Coastguard Worker    [stream writeBytes:fieldNum value:value];
324*1b3f573fSAndroid Build Coastguard Worker  } else {
325*1b3f573fSAndroid Build Coastguard Worker    NSCAssert(NO, @"Unexpected type %d", dataType);
326*1b3f573fSAndroid Build Coastguard Worker  }
327*1b3f573fSAndroid Build Coastguard Worker}
328*1b3f573fSAndroid Build Coastguard Worker
329*1b3f573fSAndroid Build Coastguard Worker// clang-format on
330*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END SERIALIZE_SUPPORT_HELPERS()
331*1b3f573fSAndroid Build Coastguard Worker
332*1b3f573fSAndroid Build Coastguard Workersize_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
333*1b3f573fSAndroid Build Coastguard Worker  GPBDataType mapValueType = GPBGetFieldDataType(field);
334*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
335*1b3f573fSAndroid Build Coastguard Worker  NSString *key;
336*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [dict keyEnumerator];
337*1b3f573fSAndroid Build Coastguard Worker  while ((key = [keys nextObject])) {
338*1b3f573fSAndroid Build Coastguard Worker    id obj = dict[key];
339*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key);
340*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueType);
341*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
342*1b3f573fSAndroid Build Coastguard Worker  }
343*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
344*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * dict.count;
345*1b3f573fSAndroid Build Coastguard Worker  return result;
346*1b3f573fSAndroid Build Coastguard Worker}
347*1b3f573fSAndroid Build Coastguard Worker
348*1b3f573fSAndroid Build Coastguard Workervoid GPBDictionaryWriteToStreamInternalHelper(GPBCodedOutputStream *outputStream,
349*1b3f573fSAndroid Build Coastguard Worker                                              NSDictionary *dict,
350*1b3f573fSAndroid Build Coastguard Worker                                              GPBFieldDescriptor *field) {
351*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
352*1b3f573fSAndroid Build Coastguard Worker  GPBDataType mapValueType = GPBGetFieldDataType(field);
353*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
354*1b3f573fSAndroid Build Coastguard Worker  NSString *key;
355*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [dict keyEnumerator];
356*1b3f573fSAndroid Build Coastguard Worker  while ((key = [keys nextObject])) {
357*1b3f573fSAndroid Build Coastguard Worker    id obj = dict[key];
358*1b3f573fSAndroid Build Coastguard Worker    // Write the tag.
359*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
360*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
361*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key);
362*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueType);
363*1b3f573fSAndroid Build Coastguard Worker
364*1b3f573fSAndroid Build Coastguard Worker    // Write the size and fields.
365*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
366*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeString:kMapKeyFieldNumber value:key];
367*1b3f573fSAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, obj, kMapValueFieldNumber, mapValueType);
368*1b3f573fSAndroid Build Coastguard Worker  }
369*1b3f573fSAndroid Build Coastguard Worker}
370*1b3f573fSAndroid Build Coastguard Worker
371*1b3f573fSAndroid Build Coastguard WorkerBOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
372*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
373*1b3f573fSAndroid Build Coastguard Worker  NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeMessage, @"Unexpected value type");
374*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(field)  // For when asserts are off in release.
375*1b3f573fSAndroid Build Coastguard Worker  GPBMessage *msg;
376*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *objects = [dict objectEnumerator];
377*1b3f573fSAndroid Build Coastguard Worker  while ((msg = [objects nextObject])) {
378*1b3f573fSAndroid Build Coastguard Worker    if (!msg.initialized) {
379*1b3f573fSAndroid Build Coastguard Worker      return NO;
380*1b3f573fSAndroid Build Coastguard Worker    }
381*1b3f573fSAndroid Build Coastguard Worker  }
382*1b3f573fSAndroid Build Coastguard Worker  return YES;
383*1b3f573fSAndroid Build Coastguard Worker}
384*1b3f573fSAndroid Build Coastguard Worker
385*1b3f573fSAndroid Build Coastguard Worker// Note: if the type is an object, it the retain pass back to the caller.
386*1b3f573fSAndroid Build Coastguard Workerstatic void ReadValue(GPBCodedInputStream *stream,
387*1b3f573fSAndroid Build Coastguard Worker                      GPBGenericValue *valueToFill,
388*1b3f573fSAndroid Build Coastguard Worker                      GPBDataType type,
389*1b3f573fSAndroid Build Coastguard Worker                      GPBExtensionRegistry *registry,
390*1b3f573fSAndroid Build Coastguard Worker                      GPBFieldDescriptor *field) {
391*1b3f573fSAndroid Build Coastguard Worker  switch (type) {
392*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeBool:
393*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueBool = GPBCodedInputStreamReadBool(&stream->state_);
394*1b3f573fSAndroid Build Coastguard Worker      break;
395*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeFixed32:
396*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueUInt32 = GPBCodedInputStreamReadFixed32(&stream->state_);
397*1b3f573fSAndroid Build Coastguard Worker      break;
398*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeSFixed32:
399*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueInt32 = GPBCodedInputStreamReadSFixed32(&stream->state_);
400*1b3f573fSAndroid Build Coastguard Worker      break;
401*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeFloat:
402*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueFloat = GPBCodedInputStreamReadFloat(&stream->state_);
403*1b3f573fSAndroid Build Coastguard Worker      break;
404*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeFixed64:
405*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueUInt64 = GPBCodedInputStreamReadFixed64(&stream->state_);
406*1b3f573fSAndroid Build Coastguard Worker      break;
407*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeSFixed64:
408*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueInt64 = GPBCodedInputStreamReadSFixed64(&stream->state_);
409*1b3f573fSAndroid Build Coastguard Worker      break;
410*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeDouble:
411*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueDouble = GPBCodedInputStreamReadDouble(&stream->state_);
412*1b3f573fSAndroid Build Coastguard Worker      break;
413*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeInt32:
414*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueInt32 = GPBCodedInputStreamReadInt32(&stream->state_);
415*1b3f573fSAndroid Build Coastguard Worker      break;
416*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeInt64:
417*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueInt64 = GPBCodedInputStreamReadInt64(&stream->state_);
418*1b3f573fSAndroid Build Coastguard Worker      break;
419*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeSInt32:
420*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueInt32 = GPBCodedInputStreamReadSInt32(&stream->state_);
421*1b3f573fSAndroid Build Coastguard Worker      break;
422*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeSInt64:
423*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueInt64 = GPBCodedInputStreamReadSInt64(&stream->state_);
424*1b3f573fSAndroid Build Coastguard Worker      break;
425*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeUInt32:
426*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueUInt32 = GPBCodedInputStreamReadUInt32(&stream->state_);
427*1b3f573fSAndroid Build Coastguard Worker      break;
428*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeUInt64:
429*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueUInt64 = GPBCodedInputStreamReadUInt64(&stream->state_);
430*1b3f573fSAndroid Build Coastguard Worker      break;
431*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeBytes:
432*1b3f573fSAndroid Build Coastguard Worker      [valueToFill->valueData release];
433*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueData = GPBCodedInputStreamReadRetainedBytes(&stream->state_);
434*1b3f573fSAndroid Build Coastguard Worker      break;
435*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeString:
436*1b3f573fSAndroid Build Coastguard Worker      [valueToFill->valueString release];
437*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueString = GPBCodedInputStreamReadRetainedString(&stream->state_);
438*1b3f573fSAndroid Build Coastguard Worker      break;
439*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeMessage: {
440*1b3f573fSAndroid Build Coastguard Worker      GPBMessage *message = [[field.msgClass alloc] init];
441*1b3f573fSAndroid Build Coastguard Worker      [stream readMessage:message extensionRegistry:registry];
442*1b3f573fSAndroid Build Coastguard Worker      [valueToFill->valueMessage release];
443*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueMessage = message;
444*1b3f573fSAndroid Build Coastguard Worker      break;
445*1b3f573fSAndroid Build Coastguard Worker    }
446*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeGroup:
447*1b3f573fSAndroid Build Coastguard Worker      NSCAssert(NO, @"Can't happen");
448*1b3f573fSAndroid Build Coastguard Worker      break;
449*1b3f573fSAndroid Build Coastguard Worker    case GPBDataTypeEnum:
450*1b3f573fSAndroid Build Coastguard Worker      valueToFill->valueEnum = GPBCodedInputStreamReadEnum(&stream->state_);
451*1b3f573fSAndroid Build Coastguard Worker      break;
452*1b3f573fSAndroid Build Coastguard Worker  }
453*1b3f573fSAndroid Build Coastguard Worker}
454*1b3f573fSAndroid Build Coastguard Worker
455*1b3f573fSAndroid Build Coastguard Workervoid GPBDictionaryReadEntry(id mapDictionary,
456*1b3f573fSAndroid Build Coastguard Worker                            GPBCodedInputStream *stream,
457*1b3f573fSAndroid Build Coastguard Worker                            GPBExtensionRegistry *registry,
458*1b3f573fSAndroid Build Coastguard Worker                            GPBFieldDescriptor *field,
459*1b3f573fSAndroid Build Coastguard Worker                            GPBMessage *parentMessage) {
460*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
461*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
462*1b3f573fSAndroid Build Coastguard Worker
463*1b3f573fSAndroid Build Coastguard Worker  GPBGenericValue key;
464*1b3f573fSAndroid Build Coastguard Worker  GPBGenericValue value;
465*1b3f573fSAndroid Build Coastguard Worker  // Zero them (but pick up any enum default for proto2).
466*1b3f573fSAndroid Build Coastguard Worker  key.valueString = value.valueString = nil;
467*1b3f573fSAndroid Build Coastguard Worker  if (valueDataType == GPBDataTypeEnum) {
468*1b3f573fSAndroid Build Coastguard Worker    value = field.defaultValue;
469*1b3f573fSAndroid Build Coastguard Worker  }
470*1b3f573fSAndroid Build Coastguard Worker
471*1b3f573fSAndroid Build Coastguard Worker  GPBCodedInputStreamState *state = &stream->state_;
472*1b3f573fSAndroid Build Coastguard Worker  uint32_t keyTag =
473*1b3f573fSAndroid Build Coastguard Worker      GPBWireFormatMakeTag(kMapKeyFieldNumber, GPBWireFormatForType(keyDataType, NO));
474*1b3f573fSAndroid Build Coastguard Worker  uint32_t valueTag =
475*1b3f573fSAndroid Build Coastguard Worker      GPBWireFormatMakeTag(kMapValueFieldNumber, GPBWireFormatForType(valueDataType, NO));
476*1b3f573fSAndroid Build Coastguard Worker
477*1b3f573fSAndroid Build Coastguard Worker  BOOL hitError = NO;
478*1b3f573fSAndroid Build Coastguard Worker  while (YES) {
479*1b3f573fSAndroid Build Coastguard Worker    uint32_t tag = GPBCodedInputStreamReadTag(state);
480*1b3f573fSAndroid Build Coastguard Worker    if (tag == keyTag) {
481*1b3f573fSAndroid Build Coastguard Worker      ReadValue(stream, &key, keyDataType, registry, field);
482*1b3f573fSAndroid Build Coastguard Worker    } else if (tag == valueTag) {
483*1b3f573fSAndroid Build Coastguard Worker      ReadValue(stream, &value, valueDataType, registry, field);
484*1b3f573fSAndroid Build Coastguard Worker    } else if (tag == 0) {
485*1b3f573fSAndroid Build Coastguard Worker      // zero signals EOF / limit reached
486*1b3f573fSAndroid Build Coastguard Worker      break;
487*1b3f573fSAndroid Build Coastguard Worker    } else {  // Unknown
488*1b3f573fSAndroid Build Coastguard Worker      if (![stream skipField:tag]){
489*1b3f573fSAndroid Build Coastguard Worker        hitError = YES;
490*1b3f573fSAndroid Build Coastguard Worker        break;
491*1b3f573fSAndroid Build Coastguard Worker      }
492*1b3f573fSAndroid Build Coastguard Worker    }
493*1b3f573fSAndroid Build Coastguard Worker  }
494*1b3f573fSAndroid Build Coastguard Worker
495*1b3f573fSAndroid Build Coastguard Worker  if (!hitError) {
496*1b3f573fSAndroid Build Coastguard Worker    // Handle the special defaults and/or missing key/value.
497*1b3f573fSAndroid Build Coastguard Worker    if ((keyDataType == GPBDataTypeString) && (key.valueString == nil)) {
498*1b3f573fSAndroid Build Coastguard Worker      key.valueString = [@"" retain];
499*1b3f573fSAndroid Build Coastguard Worker    }
500*1b3f573fSAndroid Build Coastguard Worker    if (GPBDataTypeIsObject(valueDataType) && value.valueString == nil) {
501*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic push
502*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wswitch-enum"
503*1b3f573fSAndroid Build Coastguard Worker      switch (valueDataType) {
504*1b3f573fSAndroid Build Coastguard Worker        case GPBDataTypeString:
505*1b3f573fSAndroid Build Coastguard Worker          value.valueString = [@"" retain];
506*1b3f573fSAndroid Build Coastguard Worker          break;
507*1b3f573fSAndroid Build Coastguard Worker        case GPBDataTypeBytes:
508*1b3f573fSAndroid Build Coastguard Worker          value.valueData = [GPBEmptyNSData() retain];
509*1b3f573fSAndroid Build Coastguard Worker          break;
510*1b3f573fSAndroid Build Coastguard Worker#if defined(__clang_analyzer__)
511*1b3f573fSAndroid Build Coastguard Worker        case GPBDataTypeGroup:
512*1b3f573fSAndroid Build Coastguard Worker          // Maps can't really have Groups as the value type, but this case is needed
513*1b3f573fSAndroid Build Coastguard Worker          // so the analyzer won't report the possibility of send nil in for the value
514*1b3f573fSAndroid Build Coastguard Worker          // in the NSMutableDictionary case below.
515*1b3f573fSAndroid Build Coastguard Worker#endif
516*1b3f573fSAndroid Build Coastguard Worker        case GPBDataTypeMessage: {
517*1b3f573fSAndroid Build Coastguard Worker          value.valueMessage = [[field.msgClass alloc] init];
518*1b3f573fSAndroid Build Coastguard Worker          break;
519*1b3f573fSAndroid Build Coastguard Worker        }
520*1b3f573fSAndroid Build Coastguard Worker        default:
521*1b3f573fSAndroid Build Coastguard Worker          // Nothing
522*1b3f573fSAndroid Build Coastguard Worker          break;
523*1b3f573fSAndroid Build Coastguard Worker      }
524*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic pop
525*1b3f573fSAndroid Build Coastguard Worker    }
526*1b3f573fSAndroid Build Coastguard Worker
527*1b3f573fSAndroid Build Coastguard Worker    if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) {
528*1b3f573fSAndroid Build Coastguard Worker#if GPB_STATIC_ANALYZER_ONLY(6020053, 7000181)
529*1b3f573fSAndroid Build Coastguard Worker     // Limited to Xcode 6.4 - 7.2, are known to fail here. The upper end can
530*1b3f573fSAndroid Build Coastguard Worker     // be raised as needed for new Xcodes.
531*1b3f573fSAndroid Build Coastguard Worker     //
532*1b3f573fSAndroid Build Coastguard Worker     // This is only needed on a "shallow" analyze; on a "deep" analyze, the
533*1b3f573fSAndroid Build Coastguard Worker     // existing code path gets this correct. In shallow, the analyzer decides
534*1b3f573fSAndroid Build Coastguard Worker     // GPBDataTypeIsObject(valueDataType) is both false and true on a single
535*1b3f573fSAndroid Build Coastguard Worker     // path through this function, allowing nil to be used for the
536*1b3f573fSAndroid Build Coastguard Worker     // setObject:forKey:.
537*1b3f573fSAndroid Build Coastguard Worker     if (value.valueString == nil) {
538*1b3f573fSAndroid Build Coastguard Worker       value.valueString = [@"" retain];
539*1b3f573fSAndroid Build Coastguard Worker     }
540*1b3f573fSAndroid Build Coastguard Worker#endif
541*1b3f573fSAndroid Build Coastguard Worker      // mapDictionary is an NSMutableDictionary
542*1b3f573fSAndroid Build Coastguard Worker      [(NSMutableDictionary *)mapDictionary setObject:value.valueString
543*1b3f573fSAndroid Build Coastguard Worker                                               forKey:key.valueString];
544*1b3f573fSAndroid Build Coastguard Worker    } else {
545*1b3f573fSAndroid Build Coastguard Worker      if (valueDataType == GPBDataTypeEnum) {
546*1b3f573fSAndroid Build Coastguard Worker        if (GPBHasPreservingUnknownEnumSemantics([parentMessage descriptor].file.syntax) ||
547*1b3f573fSAndroid Build Coastguard Worker            [field isValidEnumValue:value.valueEnum]) {
548*1b3f573fSAndroid Build Coastguard Worker          [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key];
549*1b3f573fSAndroid Build Coastguard Worker        } else {
550*1b3f573fSAndroid Build Coastguard Worker          NSData *data = [mapDictionary serializedDataForUnknownValue:value.valueEnum
551*1b3f573fSAndroid Build Coastguard Worker                                                               forKey:&key
552*1b3f573fSAndroid Build Coastguard Worker                                                          keyDataType:keyDataType];
553*1b3f573fSAndroid Build Coastguard Worker          [parentMessage addUnknownMapEntry:GPBFieldNumber(field) value:data];
554*1b3f573fSAndroid Build Coastguard Worker        }
555*1b3f573fSAndroid Build Coastguard Worker      } else {
556*1b3f573fSAndroid Build Coastguard Worker        [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key];
557*1b3f573fSAndroid Build Coastguard Worker      }
558*1b3f573fSAndroid Build Coastguard Worker    }
559*1b3f573fSAndroid Build Coastguard Worker  }
560*1b3f573fSAndroid Build Coastguard Worker
561*1b3f573fSAndroid Build Coastguard Worker  if (GPBDataTypeIsObject(keyDataType)) {
562*1b3f573fSAndroid Build Coastguard Worker    [key.valueString release];
563*1b3f573fSAndroid Build Coastguard Worker  }
564*1b3f573fSAndroid Build Coastguard Worker  if (GPBDataTypeIsObject(valueDataType)) {
565*1b3f573fSAndroid Build Coastguard Worker    [value.valueString release];
566*1b3f573fSAndroid Build Coastguard Worker  }
567*1b3f573fSAndroid Build Coastguard Worker}
568*1b3f573fSAndroid Build Coastguard Worker
569*1b3f573fSAndroid Build Coastguard Worker//
570*1b3f573fSAndroid Build Coastguard Worker// Macros for the common basic cases.
571*1b3f573fSAndroid Build Coastguard Worker//
572*1b3f573fSAndroid Build Coastguard Worker
573*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_IMPL_FOR_POD_KEY(KEY_NAME, KEY_TYPE)
574*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, , POD)
575*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, Object, id)
576*1b3f573fSAndroid Build Coastguard Worker
577*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, KisP, KHELPER)
578*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt32, uint32_t, KHELPER)
579*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int32, int32_t, KHELPER)
580*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt64, uint64_t, KHELPER)
581*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int64, int64_t, KHELPER)
582*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Bool, BOOL, KHELPER)
583*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Float, float, KHELPER)
584*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Double, double, KHELPER)
585*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, Enum, int32_t, KHELPER)
586*1b3f573fSAndroid Build Coastguard Worker
587*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
588*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD, VALUE_NAME, value)
589*1b3f573fSAndroid Build Coastguard Worker
590*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, VALUE_NAME, VALUE_TYPE)
591*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, , VALUE_NAME, VALUE_TYPE, POD, OBJECT, Object, object)
592*1b3f573fSAndroid Build Coastguard Worker
593*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR)
594*1b3f573fSAndroid Build Coastguard Worker//%#pragma mark - KEY_NAME -> VALUE_NAME
595*1b3f573fSAndroid Build Coastguard Worker//%
596*1b3f573fSAndroid Build Coastguard Worker//%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary {
597*1b3f573fSAndroid Build Coastguard Worker//% @package
598*1b3f573fSAndroid Build Coastguard Worker//%  NSMutableDictionary *_dictionary;
599*1b3f573fSAndroid Build Coastguard Worker//%}
600*1b3f573fSAndroid Build Coastguard Worker//%
601*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)init {
602*1b3f573fSAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
603*1b3f573fSAndroid Build Coastguard Worker//%}
604*1b3f573fSAndroid Build Coastguard Worker//%
605*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWith##VNAME##s:(const VALUE_TYPE [])##VNAME_VAR##s
606*1b3f573fSAndroid Build Coastguard Worker//%                ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
607*1b3f573fSAndroid Build Coastguard Worker//%                ##VNAME$S##    count:(NSUInteger)count {
608*1b3f573fSAndroid Build Coastguard Worker//%  self = [super init];
609*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
610*1b3f573fSAndroid Build Coastguard Worker//%    _dictionary = [[NSMutableDictionary alloc] init];
611*1b3f573fSAndroid Build Coastguard Worker//%    if (count && VNAME_VAR##s && keys) {
612*1b3f573fSAndroid Build Coastguard Worker//%      for (NSUInteger i = 0; i < count; ++i) {
613*1b3f573fSAndroid 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*1b3f573fSAndroid Build Coastguard Worker//%      }
615*1b3f573fSAndroid Build Coastguard Worker//%    }
616*1b3f573fSAndroid Build Coastguard Worker//%  }
617*1b3f573fSAndroid Build Coastguard Worker//%  return self;
618*1b3f573fSAndroid Build Coastguard Worker//%}
619*1b3f573fSAndroid Build Coastguard Worker//%
620*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary {
621*1b3f573fSAndroid Build Coastguard Worker//%  self = [self initWith##VNAME##s:NULL forKeys:NULL count:0];
622*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
623*1b3f573fSAndroid Build Coastguard Worker//%    if (dictionary) {
624*1b3f573fSAndroid Build Coastguard Worker//%      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
625*1b3f573fSAndroid Build Coastguard Worker//%    }
626*1b3f573fSAndroid Build Coastguard Worker//%  }
627*1b3f573fSAndroid Build Coastguard Worker//%  return self;
628*1b3f573fSAndroid Build Coastguard Worker//%}
629*1b3f573fSAndroid Build Coastguard Worker//%
630*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithCapacity:(NSUInteger)numItems {
631*1b3f573fSAndroid Build Coastguard Worker//%  #pragma unused(numItems)
632*1b3f573fSAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
633*1b3f573fSAndroid Build Coastguard Worker//%}
634*1b3f573fSAndroid Build Coastguard Worker//%
635*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, )
636*1b3f573fSAndroid Build Coastguard Worker//%
637*1b3f573fSAndroid Build Coastguard Worker//%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
638*1b3f573fSAndroid Build Coastguard Worker//%
639*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, )
640*1b3f573fSAndroid Build Coastguard Worker//%
641*1b3f573fSAndroid Build Coastguard Worker//%@end
642*1b3f573fSAndroid Build Coastguard Worker//%
643*1b3f573fSAndroid Build Coastguard Worker
644*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
645*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD)
646*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER)
647*1b3f573fSAndroid Build Coastguard Worker//%#pragma mark - KEY_NAME -> VALUE_NAME
648*1b3f573fSAndroid Build Coastguard Worker//%
649*1b3f573fSAndroid Build Coastguard Worker//%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary {
650*1b3f573fSAndroid Build Coastguard Worker//% @package
651*1b3f573fSAndroid Build Coastguard Worker//%  NSMutableDictionary *_dictionary;
652*1b3f573fSAndroid Build Coastguard Worker//%  GPBEnumValidationFunc _validationFunc;
653*1b3f573fSAndroid Build Coastguard Worker//%}
654*1b3f573fSAndroid Build Coastguard Worker//%
655*1b3f573fSAndroid Build Coastguard Worker//%@synthesize validationFunc = _validationFunc;
656*1b3f573fSAndroid Build Coastguard Worker//%
657*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)init {
658*1b3f573fSAndroid Build Coastguard Worker//%  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
659*1b3f573fSAndroid Build Coastguard Worker//%}
660*1b3f573fSAndroid Build Coastguard Worker//%
661*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
662*1b3f573fSAndroid Build Coastguard Worker//%  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
663*1b3f573fSAndroid Build Coastguard Worker//%}
664*1b3f573fSAndroid Build Coastguard Worker//%
665*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
666*1b3f573fSAndroid Build Coastguard Worker//%                                 rawValues:(const VALUE_TYPE [])rawValues
667*1b3f573fSAndroid Build Coastguard Worker//%                                   forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
668*1b3f573fSAndroid Build Coastguard Worker//%                                     count:(NSUInteger)count {
669*1b3f573fSAndroid Build Coastguard Worker//%  self = [super init];
670*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
671*1b3f573fSAndroid Build Coastguard Worker//%    _dictionary = [[NSMutableDictionary alloc] init];
672*1b3f573fSAndroid Build Coastguard Worker//%    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
673*1b3f573fSAndroid Build Coastguard Worker//%    if (count && rawValues && keys) {
674*1b3f573fSAndroid Build Coastguard Worker//%      for (NSUInteger i = 0; i < count; ++i) {
675*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______)        [_dictionary setObject:WRAPPED##VHELPER(rawValues[i]) forKey:WRAPPED##KHELPER(keys[i])];
676*1b3f573fSAndroid Build Coastguard Worker//%      }
677*1b3f573fSAndroid Build Coastguard Worker//%    }
678*1b3f573fSAndroid Build Coastguard Worker//%  }
679*1b3f573fSAndroid Build Coastguard Worker//%  return self;
680*1b3f573fSAndroid Build Coastguard Worker//%}
681*1b3f573fSAndroid Build Coastguard Worker//%
682*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary {
683*1b3f573fSAndroid Build Coastguard Worker//%  self = [self initWithValidationFunction:dictionary.validationFunc
684*1b3f573fSAndroid Build Coastguard Worker//%                                rawValues:NULL
685*1b3f573fSAndroid Build Coastguard Worker//%                                  forKeys:NULL
686*1b3f573fSAndroid Build Coastguard Worker//%                                    count:0];
687*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
688*1b3f573fSAndroid Build Coastguard Worker//%    if (dictionary) {
689*1b3f573fSAndroid Build Coastguard Worker//%      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
690*1b3f573fSAndroid Build Coastguard Worker//%    }
691*1b3f573fSAndroid Build Coastguard Worker//%  }
692*1b3f573fSAndroid Build Coastguard Worker//%  return self;
693*1b3f573fSAndroid Build Coastguard Worker//%}
694*1b3f573fSAndroid Build Coastguard Worker//%
695*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
696*1b3f573fSAndroid Build Coastguard Worker//%                                  capacity:(NSUInteger)numItems {
697*1b3f573fSAndroid Build Coastguard Worker//%  #pragma unused(numItems)
698*1b3f573fSAndroid Build Coastguard Worker//%  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
699*1b3f573fSAndroid Build Coastguard Worker//%}
700*1b3f573fSAndroid Build Coastguard Worker//%
701*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, value, Raw)
702*1b3f573fSAndroid Build Coastguard Worker//%
703*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)getEnum:(VALUE_TYPE *)value forKey:(KEY_TYPE##KisP$S##KisP)key {
704*1b3f573fSAndroid Build Coastguard Worker//%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
705*1b3f573fSAndroid Build Coastguard Worker//%  if (wrapped && value) {
706*1b3f573fSAndroid Build Coastguard Worker//%    VALUE_TYPE result = UNWRAP##VALUE_NAME(wrapped);
707*1b3f573fSAndroid Build Coastguard Worker//%    if (!_validationFunc(result)) {
708*1b3f573fSAndroid Build Coastguard Worker//%      result = kGPBUnrecognizedEnumeratorValue;
709*1b3f573fSAndroid Build Coastguard Worker//%    }
710*1b3f573fSAndroid Build Coastguard Worker//%    *value = result;
711*1b3f573fSAndroid Build Coastguard Worker//%  }
712*1b3f573fSAndroid Build Coastguard Worker//%  return (wrapped != NULL);
713*1b3f573fSAndroid Build Coastguard Worker//%}
714*1b3f573fSAndroid Build Coastguard Worker//%
715*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)getRawValue:(VALUE_TYPE *)rawValue forKey:(KEY_TYPE##KisP$S##KisP)key {
716*1b3f573fSAndroid Build Coastguard Worker//%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
717*1b3f573fSAndroid Build Coastguard Worker//%  if (wrapped && rawValue) {
718*1b3f573fSAndroid Build Coastguard Worker//%    *rawValue = UNWRAP##VALUE_NAME(wrapped);
719*1b3f573fSAndroid Build Coastguard Worker//%  }
720*1b3f573fSAndroid Build Coastguard Worker//%  return (wrapped != NULL);
721*1b3f573fSAndroid Build Coastguard Worker//%}
722*1b3f573fSAndroid Build Coastguard Worker//%
723*1b3f573fSAndroid Build Coastguard Worker//%- (void)enumerateKeysAndEnumsUsingBlock:
724*1b3f573fSAndroid Build Coastguard Worker//%    (void (NS_NOESCAPE ^)(KEY_TYPE KisP##key, VALUE_TYPE value, BOOL *stop))block {
725*1b3f573fSAndroid Build Coastguard Worker//%  GPBEnumValidationFunc func = _validationFunc;
726*1b3f573fSAndroid Build Coastguard Worker//%  BOOL stop = NO;
727*1b3f573fSAndroid Build Coastguard Worker//%  NSEnumerator *keys = [_dictionary keyEnumerator];
728*1b3f573fSAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
729*1b3f573fSAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
730*1b3f573fSAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##aValue = _dictionary[aKey];
731*1b3f573fSAndroid Build Coastguard Worker//%      VALUE_TYPE unwrapped = UNWRAP##VALUE_NAME(aValue);
732*1b3f573fSAndroid Build Coastguard Worker//%      if (!func(unwrapped)) {
733*1b3f573fSAndroid Build Coastguard Worker//%        unwrapped = kGPBUnrecognizedEnumeratorValue;
734*1b3f573fSAndroid Build Coastguard Worker//%      }
735*1b3f573fSAndroid Build Coastguard Worker//%    block(UNWRAP##KEY_NAME(aKey), unwrapped, &stop);
736*1b3f573fSAndroid Build Coastguard Worker//%    if (stop) {
737*1b3f573fSAndroid Build Coastguard Worker//%      break;
738*1b3f573fSAndroid Build Coastguard Worker//%    }
739*1b3f573fSAndroid Build Coastguard Worker//%  }
740*1b3f573fSAndroid Build Coastguard Worker//%}
741*1b3f573fSAndroid Build Coastguard Worker//%
742*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, Enum, value, Raw)
743*1b3f573fSAndroid Build Coastguard Worker//%
744*1b3f573fSAndroid Build Coastguard Worker//%- (void)setEnum:(VALUE_TYPE)value forKey:(KEY_TYPE##KisP$S##KisP)key {
745*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_KEY_##KHELPER(key, )  if (!_validationFunc(value)) {
746*1b3f573fSAndroid Build Coastguard Worker//%    [NSException raise:NSInvalidArgumentException
747*1b3f573fSAndroid Build Coastguard Worker//%                format:@"GPB##KEY_NAME##VALUE_NAME##Dictionary: Attempt to set an unknown enum value (%d)",
748*1b3f573fSAndroid Build Coastguard Worker//%                       value];
749*1b3f573fSAndroid Build Coastguard Worker//%  }
750*1b3f573fSAndroid Build Coastguard Worker//%
751*1b3f573fSAndroid Build Coastguard Worker//%  [_dictionary setObject:WRAPPED##VHELPER(value) forKey:WRAPPED##KHELPER(key)];
752*1b3f573fSAndroid Build Coastguard Worker//%  if (_autocreator) {
753*1b3f573fSAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
754*1b3f573fSAndroid Build Coastguard Worker//%  }
755*1b3f573fSAndroid Build Coastguard Worker//%}
756*1b3f573fSAndroid Build Coastguard Worker//%
757*1b3f573fSAndroid Build Coastguard Worker//%@end
758*1b3f573fSAndroid Build Coastguard Worker//%
759*1b3f573fSAndroid Build Coastguard Worker
760*1b3f573fSAndroid 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*1b3f573fSAndroid Build Coastguard Worker//%- (void)dealloc {
762*1b3f573fSAndroid Build Coastguard Worker//%  NSAssert(!_autocreator,
763*1b3f573fSAndroid Build Coastguard Worker//%           @"%@: Autocreator must be cleared before release, autocreator: %@",
764*1b3f573fSAndroid Build Coastguard Worker//%           [self class], _autocreator);
765*1b3f573fSAndroid Build Coastguard Worker//%  [_dictionary release];
766*1b3f573fSAndroid Build Coastguard Worker//%  [super dealloc];
767*1b3f573fSAndroid Build Coastguard Worker//%}
768*1b3f573fSAndroid Build Coastguard Worker//%
769*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)copyWithZone:(NSZone *)zone {
770*1b3f573fSAndroid Build Coastguard Worker//%  return [[GPB##KEY_NAME##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self];
771*1b3f573fSAndroid Build Coastguard Worker//%}
772*1b3f573fSAndroid Build Coastguard Worker//%
773*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)isEqual:(id)other {
774*1b3f573fSAndroid Build Coastguard Worker//%  if (self == other) {
775*1b3f573fSAndroid Build Coastguard Worker//%    return YES;
776*1b3f573fSAndroid Build Coastguard Worker//%  }
777*1b3f573fSAndroid Build Coastguard Worker//%  if (![other isKindOfClass:[GPB##KEY_NAME##VALUE_NAME##Dictionary class]]) {
778*1b3f573fSAndroid Build Coastguard Worker//%    return NO;
779*1b3f573fSAndroid Build Coastguard Worker//%  }
780*1b3f573fSAndroid Build Coastguard Worker//%  GPB##KEY_NAME##VALUE_NAME##Dictionary *otherDictionary = other;
781*1b3f573fSAndroid Build Coastguard Worker//%  return [_dictionary isEqual:otherDictionary->_dictionary];
782*1b3f573fSAndroid Build Coastguard Worker//%}
783*1b3f573fSAndroid Build Coastguard Worker//%
784*1b3f573fSAndroid Build Coastguard Worker//%- (NSUInteger)hash {
785*1b3f573fSAndroid Build Coastguard Worker//%  return _dictionary.count;
786*1b3f573fSAndroid Build Coastguard Worker//%}
787*1b3f573fSAndroid Build Coastguard Worker//%
788*1b3f573fSAndroid Build Coastguard Worker//%- (NSString *)description {
789*1b3f573fSAndroid Build Coastguard Worker//%  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
790*1b3f573fSAndroid Build Coastguard Worker//%}
791*1b3f573fSAndroid Build Coastguard Worker//%
792*1b3f573fSAndroid Build Coastguard Worker//%- (NSUInteger)count {
793*1b3f573fSAndroid Build Coastguard Worker//%  return _dictionary.count;
794*1b3f573fSAndroid Build Coastguard Worker//%}
795*1b3f573fSAndroid Build Coastguard Worker//%
796*1b3f573fSAndroid Build Coastguard Worker//%- (void)enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:
797*1b3f573fSAndroid Build Coastguard Worker//%    (void (NS_NOESCAPE ^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop))block {
798*1b3f573fSAndroid Build Coastguard Worker//%  BOOL stop = NO;
799*1b3f573fSAndroid Build Coastguard Worker//%  NSDictionary *internal = _dictionary;
800*1b3f573fSAndroid Build Coastguard Worker//%  NSEnumerator *keys = [internal keyEnumerator];
801*1b3f573fSAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
802*1b3f573fSAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
803*1b3f573fSAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
804*1b3f573fSAndroid Build Coastguard Worker//%    block(UNWRAP##KEY_NAME(aKey), UNWRAP##VALUE_NAME(a##VNAME_VAR$u), &stop);
805*1b3f573fSAndroid Build Coastguard Worker//%    if (stop) {
806*1b3f573fSAndroid Build Coastguard Worker//%      break;
807*1b3f573fSAndroid Build Coastguard Worker//%    }
808*1b3f573fSAndroid Build Coastguard Worker//%  }
809*1b3f573fSAndroid Build Coastguard Worker//%}
810*1b3f573fSAndroid Build Coastguard Worker//%
811*1b3f573fSAndroid Build Coastguard Worker//%EXTRA_METHODS_##VHELPER(KEY_NAME, VALUE_NAME)- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
812*1b3f573fSAndroid Build Coastguard Worker//%  NSDictionary *internal = _dictionary;
813*1b3f573fSAndroid Build Coastguard Worker//%  NSUInteger count = internal.count;
814*1b3f573fSAndroid Build Coastguard Worker//%  if (count == 0) {
815*1b3f573fSAndroid Build Coastguard Worker//%    return 0;
816*1b3f573fSAndroid Build Coastguard Worker//%  }
817*1b3f573fSAndroid Build Coastguard Worker//%
818*1b3f573fSAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
819*1b3f573fSAndroid Build Coastguard Worker//%  GPBDataType keyDataType = field.mapKeyDataType;
820*1b3f573fSAndroid Build Coastguard Worker//%  size_t result = 0;
821*1b3f573fSAndroid Build Coastguard Worker//%  NSEnumerator *keys = [internal keyEnumerator];
822*1b3f573fSAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
823*1b3f573fSAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
824*1b3f573fSAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
825*1b3f573fSAndroid Build Coastguard Worker//%    size_t msgSize = ComputeDict##KEY_NAME##FieldSize(UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType);
826*1b3f573fSAndroid Build Coastguard Worker//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME_VAR$u), kMapValueFieldNumber, valueDataType);
827*1b3f573fSAndroid Build Coastguard Worker//%    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
828*1b3f573fSAndroid Build Coastguard Worker//%  }
829*1b3f573fSAndroid Build Coastguard Worker//%  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
830*1b3f573fSAndroid Build Coastguard Worker//%  result += tagSize * count;
831*1b3f573fSAndroid Build Coastguard Worker//%  return result;
832*1b3f573fSAndroid Build Coastguard Worker//%}
833*1b3f573fSAndroid Build Coastguard Worker//%
834*1b3f573fSAndroid Build Coastguard Worker//%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
835*1b3f573fSAndroid Build Coastguard Worker//%                         asField:(GPBFieldDescriptor *)field {
836*1b3f573fSAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
837*1b3f573fSAndroid Build Coastguard Worker//%  GPBDataType keyDataType = field.mapKeyDataType;
838*1b3f573fSAndroid Build Coastguard Worker//%  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
839*1b3f573fSAndroid Build Coastguard Worker//%  NSDictionary *internal = _dictionary;
840*1b3f573fSAndroid Build Coastguard Worker//%  NSEnumerator *keys = [internal keyEnumerator];
841*1b3f573fSAndroid Build Coastguard Worker//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
842*1b3f573fSAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
843*1b3f573fSAndroid Build Coastguard Worker//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
844*1b3f573fSAndroid Build Coastguard Worker//%    [outputStream writeInt32NoTag:tag];
845*1b3f573fSAndroid Build Coastguard Worker//%    // Write the size of the message.
846*1b3f573fSAndroid Build Coastguard Worker//%    KEY_TYPE KisP##unwrappedKey = UNWRAP##KEY_NAME(aKey);
847*1b3f573fSAndroid Build Coastguard Worker//%    VALUE_TYPE unwrappedValue = UNWRAP##VALUE_NAME(a##VNAME_VAR$u);
848*1b3f573fSAndroid Build Coastguard Worker//%    size_t msgSize = ComputeDict##KEY_NAME##FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
849*1b3f573fSAndroid Build Coastguard Worker//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
850*1b3f573fSAndroid Build Coastguard Worker//%    [outputStream writeInt32NoTag:(int32_t)msgSize];
851*1b3f573fSAndroid Build Coastguard Worker//%    // Write the fields.
852*1b3f573fSAndroid Build Coastguard Worker//%    WriteDict##KEY_NAME##Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
853*1b3f573fSAndroid Build Coastguard Worker//%    WriteDict##VALUE_NAME##Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
854*1b3f573fSAndroid Build Coastguard Worker//%  }
855*1b3f573fSAndroid Build Coastguard Worker//%}
856*1b3f573fSAndroid Build Coastguard Worker//%
857*1b3f573fSAndroid Build Coastguard Worker//%SERIAL_DATA_FOR_ENTRY_##VHELPER(KEY_NAME, VALUE_NAME)- (void)setGPBGenericValue:(GPBGenericValue *)value
858*1b3f573fSAndroid Build Coastguard Worker//%     forGPBGenericValueKey:(GPBGenericValue *)key {
859*1b3f573fSAndroid Build Coastguard Worker//%  [_dictionary setObject:WRAPPED##VHELPER(value->##GPBVALUE_##VHELPER(VALUE_NAME)##) forKey:WRAPPED##KHELPER(key->value##KEY_NAME)];
860*1b3f573fSAndroid Build Coastguard Worker//%}
861*1b3f573fSAndroid Build Coastguard Worker//%
862*1b3f573fSAndroid Build Coastguard Worker//%- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
863*1b3f573fSAndroid Build Coastguard Worker//%  [self enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:^(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop) {
864*1b3f573fSAndroid Build Coastguard Worker//%      #pragma unused(stop)
865*1b3f573fSAndroid Build Coastguard Worker//%      block(TEXT_FORMAT_OBJ##KEY_NAME(key), TEXT_FORMAT_OBJ##VALUE_NAME(VNAME_VAR));
866*1b3f573fSAndroid Build Coastguard Worker//%  }];
867*1b3f573fSAndroid Build Coastguard Worker//%}
868*1b3f573fSAndroid 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*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME, VNAME_VAR, ACCESSOR_NAME)
870*1b3f573fSAndroid 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*1b3f573fSAndroid Build Coastguard Worker//%- (void)add##ACCESSOR_NAME##EntriesFromDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)otherDictionary {
872*1b3f573fSAndroid Build Coastguard Worker//%  if (otherDictionary) {
873*1b3f573fSAndroid Build Coastguard Worker//%    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
874*1b3f573fSAndroid Build Coastguard Worker//%    if (_autocreator) {
875*1b3f573fSAndroid Build Coastguard Worker//%      GPBAutocreatedDictionaryModified(_autocreator, self);
876*1b3f573fSAndroid Build Coastguard Worker//%    }
877*1b3f573fSAndroid Build Coastguard Worker//%  }
878*1b3f573fSAndroid Build Coastguard Worker//%}
879*1b3f573fSAndroid Build Coastguard Worker//%
880*1b3f573fSAndroid Build Coastguard Worker//%- (void)set##ACCESSOR_NAME##VNAME##:(VALUE_TYPE)VNAME_VAR forKey:(KEY_TYPE##KisP$S##KisP)key {
881*1b3f573fSAndroid 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*1b3f573fSAndroid Build Coastguard Worker//%  if (_autocreator) {
883*1b3f573fSAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
884*1b3f573fSAndroid Build Coastguard Worker//%  }
885*1b3f573fSAndroid Build Coastguard Worker//%}
886*1b3f573fSAndroid Build Coastguard Worker//%
887*1b3f573fSAndroid Build Coastguard Worker//%- (void)remove##VNAME_REMOVE##ForKey:(KEY_TYPE##KisP$S##KisP)aKey {
888*1b3f573fSAndroid Build Coastguard Worker//%  [_dictionary removeObjectForKey:WRAPPED##KHELPER(aKey)];
889*1b3f573fSAndroid Build Coastguard Worker//%}
890*1b3f573fSAndroid Build Coastguard Worker//%
891*1b3f573fSAndroid Build Coastguard Worker//%- (void)removeAll {
892*1b3f573fSAndroid Build Coastguard Worker//%  [_dictionary removeAllObjects];
893*1b3f573fSAndroid Build Coastguard Worker//%}
894*1b3f573fSAndroid Build Coastguard Worker
895*1b3f573fSAndroid Build Coastguard Worker//
896*1b3f573fSAndroid Build Coastguard Worker// Custom Generation for Bool keys
897*1b3f573fSAndroid Build Coastguard Worker//
898*1b3f573fSAndroid Build Coastguard Worker
899*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_POD_IMPL(VALUE_NAME, VALUE_TYPE)
900*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, POD, VALUE_NAME, value)
901*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(VALUE_NAME, VALUE_TYPE)
902*1b3f573fSAndroid Build Coastguard Worker//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, OBJECT, Object, object)
903*1b3f573fSAndroid Build Coastguard Worker
904*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, HELPER, VNAME, VNAME_VAR)
905*1b3f573fSAndroid Build Coastguard Worker//%#pragma mark - Bool -> VALUE_NAME
906*1b3f573fSAndroid Build Coastguard Worker//%
907*1b3f573fSAndroid Build Coastguard Worker//%@implementation GPBBool##VALUE_NAME##Dictionary {
908*1b3f573fSAndroid Build Coastguard Worker//% @package
909*1b3f573fSAndroid Build Coastguard Worker//%  VALUE_TYPE _values[2];
910*1b3f573fSAndroid Build Coastguard Worker//%BOOL_DICT_HAS_STORAGE_##HELPER()}
911*1b3f573fSAndroid Build Coastguard Worker//%
912*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)init {
913*1b3f573fSAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
914*1b3f573fSAndroid Build Coastguard Worker//%}
915*1b3f573fSAndroid Build Coastguard Worker//%
916*1b3f573fSAndroid Build Coastguard Worker//%BOOL_DICT_INITS_##HELPER(VALUE_NAME, VALUE_TYPE)
917*1b3f573fSAndroid Build Coastguard Worker//%
918*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithCapacity:(NSUInteger)numItems {
919*1b3f573fSAndroid Build Coastguard Worker//%  #pragma unused(numItems)
920*1b3f573fSAndroid Build Coastguard Worker//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
921*1b3f573fSAndroid Build Coastguard Worker//%}
922*1b3f573fSAndroid Build Coastguard Worker//%
923*1b3f573fSAndroid Build Coastguard Worker//%BOOL_DICT_DEALLOC##HELPER()
924*1b3f573fSAndroid Build Coastguard Worker//%
925*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)copyWithZone:(NSZone *)zone {
926*1b3f573fSAndroid Build Coastguard Worker//%  return [[GPBBool##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self];
927*1b3f573fSAndroid Build Coastguard Worker//%}
928*1b3f573fSAndroid Build Coastguard Worker//%
929*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)isEqual:(id)other {
930*1b3f573fSAndroid Build Coastguard Worker//%  if (self == other) {
931*1b3f573fSAndroid Build Coastguard Worker//%    return YES;
932*1b3f573fSAndroid Build Coastguard Worker//%  }
933*1b3f573fSAndroid Build Coastguard Worker//%  if (![other isKindOfClass:[GPBBool##VALUE_NAME##Dictionary class]]) {
934*1b3f573fSAndroid Build Coastguard Worker//%    return NO;
935*1b3f573fSAndroid Build Coastguard Worker//%  }
936*1b3f573fSAndroid Build Coastguard Worker//%  GPBBool##VALUE_NAME##Dictionary *otherDictionary = other;
937*1b3f573fSAndroid Build Coastguard Worker//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) != BOOL_DICT_W_HAS##HELPER(0, otherDictionary->)) ||
938*1b3f573fSAndroid Build Coastguard Worker//%      (BOOL_DICT_W_HAS##HELPER(1, ) != BOOL_DICT_W_HAS##HELPER(1, otherDictionary->))) {
939*1b3f573fSAndroid Build Coastguard Worker//%    return NO;
940*1b3f573fSAndroid Build Coastguard Worker//%  }
941*1b3f573fSAndroid Build Coastguard Worker//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) && (NEQ_##HELPER(_values[0], otherDictionary->_values[0]))) ||
942*1b3f573fSAndroid Build Coastguard Worker//%      (BOOL_DICT_W_HAS##HELPER(1, ) && (NEQ_##HELPER(_values[1], otherDictionary->_values[1])))) {
943*1b3f573fSAndroid Build Coastguard Worker//%    return NO;
944*1b3f573fSAndroid Build Coastguard Worker//%  }
945*1b3f573fSAndroid Build Coastguard Worker//%  return YES;
946*1b3f573fSAndroid Build Coastguard Worker//%}
947*1b3f573fSAndroid Build Coastguard Worker//%
948*1b3f573fSAndroid Build Coastguard Worker//%- (NSUInteger)hash {
949*1b3f573fSAndroid Build Coastguard Worker//%  return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0);
950*1b3f573fSAndroid Build Coastguard Worker//%}
951*1b3f573fSAndroid Build Coastguard Worker//%
952*1b3f573fSAndroid Build Coastguard Worker//%- (NSString *)description {
953*1b3f573fSAndroid Build Coastguard Worker//%  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
954*1b3f573fSAndroid Build Coastguard Worker//%  if (BOOL_DICT_W_HAS##HELPER(0, )) {
955*1b3f573fSAndroid Build Coastguard Worker//%    [result appendFormat:@"NO: STR_FORMAT_##HELPER(VALUE_NAME)", _values[0]];
956*1b3f573fSAndroid Build Coastguard Worker//%  }
957*1b3f573fSAndroid Build Coastguard Worker//%  if (BOOL_DICT_W_HAS##HELPER(1, )) {
958*1b3f573fSAndroid Build Coastguard Worker//%    [result appendFormat:@"YES: STR_FORMAT_##HELPER(VALUE_NAME)", _values[1]];
959*1b3f573fSAndroid Build Coastguard Worker//%  }
960*1b3f573fSAndroid Build Coastguard Worker//%  [result appendString:@" }"];
961*1b3f573fSAndroid Build Coastguard Worker//%  return result;
962*1b3f573fSAndroid Build Coastguard Worker//%}
963*1b3f573fSAndroid Build Coastguard Worker//%
964*1b3f573fSAndroid Build Coastguard Worker//%- (NSUInteger)count {
965*1b3f573fSAndroid Build Coastguard Worker//%  return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0);
966*1b3f573fSAndroid Build Coastguard Worker//%}
967*1b3f573fSAndroid Build Coastguard Worker//%
968*1b3f573fSAndroid Build Coastguard Worker//%BOOL_VALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE)
969*1b3f573fSAndroid Build Coastguard Worker//%
970*1b3f573fSAndroid Build Coastguard Worker//%BOOL_SET_GPBVALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE, VisP)
971*1b3f573fSAndroid Build Coastguard Worker//%
972*1b3f573fSAndroid Build Coastguard Worker//%- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
973*1b3f573fSAndroid Build Coastguard Worker//%  if (BOOL_DICT_HAS##HELPER(0, )) {
974*1b3f573fSAndroid Build Coastguard Worker//%    block(@"false", TEXT_FORMAT_OBJ##VALUE_NAME(_values[0]));
975*1b3f573fSAndroid Build Coastguard Worker//%  }
976*1b3f573fSAndroid Build Coastguard Worker//%  if (BOOL_DICT_W_HAS##HELPER(1, )) {
977*1b3f573fSAndroid Build Coastguard Worker//%    block(@"true", TEXT_FORMAT_OBJ##VALUE_NAME(_values[1]));
978*1b3f573fSAndroid Build Coastguard Worker//%  }
979*1b3f573fSAndroid Build Coastguard Worker//%}
980*1b3f573fSAndroid Build Coastguard Worker//%
981*1b3f573fSAndroid Build Coastguard Worker//%- (void)enumerateKeysAnd##VNAME##sUsingBlock:
982*1b3f573fSAndroid Build Coastguard Worker//%    (void (NS_NOESCAPE ^)(BOOL key, VALUE_TYPE VNAME_VAR, BOOL *stop))block {
983*1b3f573fSAndroid Build Coastguard Worker//%  BOOL stop = NO;
984*1b3f573fSAndroid Build Coastguard Worker//%  if (BOOL_DICT_HAS##HELPER(0, )) {
985*1b3f573fSAndroid Build Coastguard Worker//%    block(NO, _values[0], &stop);
986*1b3f573fSAndroid Build Coastguard Worker//%  }
987*1b3f573fSAndroid Build Coastguard Worker//%  if (!stop && BOOL_DICT_W_HAS##HELPER(1, )) {
988*1b3f573fSAndroid Build Coastguard Worker//%    block(YES, _values[1], &stop);
989*1b3f573fSAndroid Build Coastguard Worker//%  }
990*1b3f573fSAndroid Build Coastguard Worker//%}
991*1b3f573fSAndroid Build Coastguard Worker//%
992*1b3f573fSAndroid Build Coastguard Worker//%BOOL_EXTRA_METHODS_##HELPER(Bool, VALUE_NAME)- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
993*1b3f573fSAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
994*1b3f573fSAndroid Build Coastguard Worker//%  NSUInteger count = 0;
995*1b3f573fSAndroid Build Coastguard Worker//%  size_t result = 0;
996*1b3f573fSAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
997*1b3f573fSAndroid Build Coastguard Worker//%    if (BOOL_DICT_HAS##HELPER(i, )) {
998*1b3f573fSAndroid Build Coastguard Worker//%      ++count;
999*1b3f573fSAndroid Build Coastguard Worker//%      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1000*1b3f573fSAndroid Build Coastguard Worker//%      msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
1001*1b3f573fSAndroid Build Coastguard Worker//%      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1002*1b3f573fSAndroid Build Coastguard Worker//%    }
1003*1b3f573fSAndroid Build Coastguard Worker//%  }
1004*1b3f573fSAndroid Build Coastguard Worker//%  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1005*1b3f573fSAndroid Build Coastguard Worker//%  result += tagSize * count;
1006*1b3f573fSAndroid Build Coastguard Worker//%  return result;
1007*1b3f573fSAndroid Build Coastguard Worker//%}
1008*1b3f573fSAndroid Build Coastguard Worker//%
1009*1b3f573fSAndroid Build Coastguard Worker//%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1010*1b3f573fSAndroid Build Coastguard Worker//%                         asField:(GPBFieldDescriptor *)field {
1011*1b3f573fSAndroid Build Coastguard Worker//%  GPBDataType valueDataType = GPBGetFieldDataType(field);
1012*1b3f573fSAndroid Build Coastguard Worker//%  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1013*1b3f573fSAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
1014*1b3f573fSAndroid Build Coastguard Worker//%    if (BOOL_DICT_HAS##HELPER(i, )) {
1015*1b3f573fSAndroid Build Coastguard Worker//%      // Write the tag.
1016*1b3f573fSAndroid Build Coastguard Worker//%      [outputStream writeInt32NoTag:tag];
1017*1b3f573fSAndroid Build Coastguard Worker//%      // Write the size of the message.
1018*1b3f573fSAndroid Build Coastguard Worker//%      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1019*1b3f573fSAndroid Build Coastguard Worker//%      msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
1020*1b3f573fSAndroid Build Coastguard Worker//%      [outputStream writeInt32NoTag:(int32_t)msgSize];
1021*1b3f573fSAndroid Build Coastguard Worker//%      // Write the fields.
1022*1b3f573fSAndroid Build Coastguard Worker//%      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1023*1b3f573fSAndroid Build Coastguard Worker//%      WriteDict##VALUE_NAME##Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
1024*1b3f573fSAndroid Build Coastguard Worker//%    }
1025*1b3f573fSAndroid Build Coastguard Worker//%  }
1026*1b3f573fSAndroid Build Coastguard Worker//%}
1027*1b3f573fSAndroid Build Coastguard Worker//%
1028*1b3f573fSAndroid Build Coastguard Worker//%BOOL_DICT_MUTATIONS_##HELPER(VALUE_NAME, VALUE_TYPE)
1029*1b3f573fSAndroid Build Coastguard Worker//%
1030*1b3f573fSAndroid Build Coastguard Worker//%@end
1031*1b3f573fSAndroid Build Coastguard Worker//%
1032*1b3f573fSAndroid Build Coastguard Worker
1033*1b3f573fSAndroid Build Coastguard Worker
1034*1b3f573fSAndroid Build Coastguard Worker//
1035*1b3f573fSAndroid Build Coastguard Worker// Helpers for PODs
1036*1b3f573fSAndroid Build Coastguard Worker//
1037*1b3f573fSAndroid Build Coastguard Worker
1038*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER)
1039*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)get##VALUE_NAME##:(nullable VALUE_TYPE *)value forKey:(KEY_TYPE)key {
1040*1b3f573fSAndroid Build Coastguard Worker//%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
1041*1b3f573fSAndroid Build Coastguard Worker//%  if (wrapped && value) {
1042*1b3f573fSAndroid Build Coastguard Worker//%    *value = UNWRAP##VALUE_NAME(wrapped);
1043*1b3f573fSAndroid Build Coastguard Worker//%  }
1044*1b3f573fSAndroid Build Coastguard Worker//%  return (wrapped != NULL);
1045*1b3f573fSAndroid Build Coastguard Worker//%}
1046*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE WRAPPEDPOD(VALUE)
1047*1b3f573fSAndroid Build Coastguard Worker//%@(VALUE)
1048*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPUInt32(VALUE)
1049*1b3f573fSAndroid Build Coastguard Worker//%[VALUE unsignedIntValue]
1050*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPInt32(VALUE)
1051*1b3f573fSAndroid Build Coastguard Worker//%[VALUE intValue]
1052*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPUInt64(VALUE)
1053*1b3f573fSAndroid Build Coastguard Worker//%[VALUE unsignedLongLongValue]
1054*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPInt64(VALUE)
1055*1b3f573fSAndroid Build Coastguard Worker//%[VALUE longLongValue]
1056*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPBool(VALUE)
1057*1b3f573fSAndroid Build Coastguard Worker//%[VALUE boolValue]
1058*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPFloat(VALUE)
1059*1b3f573fSAndroid Build Coastguard Worker//%[VALUE floatValue]
1060*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPDouble(VALUE)
1061*1b3f573fSAndroid Build Coastguard Worker//%[VALUE doubleValue]
1062*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPEnum(VALUE)
1063*1b3f573fSAndroid Build Coastguard Worker//%[VALUE intValue]
1064*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJUInt32(VALUE)
1065*1b3f573fSAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%u", VALUE]
1066*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJInt32(VALUE)
1067*1b3f573fSAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%d", VALUE]
1068*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJUInt64(VALUE)
1069*1b3f573fSAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%llu", VALUE]
1070*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJInt64(VALUE)
1071*1b3f573fSAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%lld", VALUE]
1072*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJBool(VALUE)
1073*1b3f573fSAndroid Build Coastguard Worker//%(VALUE ? @"true" : @"false")
1074*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJFloat(VALUE)
1075*1b3f573fSAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%.*g", FLT_DIG, VALUE]
1076*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJDouble(VALUE)
1077*1b3f573fSAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%.*lg", DBL_DIG, VALUE]
1078*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJEnum(VALUE)
1079*1b3f573fSAndroid Build Coastguard Worker//%@(VALUE)
1080*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEPOD(TYPE)
1081*1b3f573fSAndroid Build Coastguard Worker//%NSNumber *
1082*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE NEQ_POD(VAL1, VAL2)
1083*1b3f573fSAndroid Build Coastguard Worker//%VAL1 != VAL2
1084*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME)
1085*1b3f573fSAndroid Build Coastguard Worker// Empty
1086*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME)
1087*1b3f573fSAndroid Build Coastguard Worker// Empty
1088*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD(KEY_NAME, VALUE_NAME)
1089*1b3f573fSAndroid Build Coastguard Worker//%SERIAL_DATA_FOR_ENTRY_POD_##VALUE_NAME(KEY_NAME)
1090*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt32(KEY_NAME)
1091*1b3f573fSAndroid Build Coastguard Worker// Empty
1092*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int32(KEY_NAME)
1093*1b3f573fSAndroid Build Coastguard Worker// Empty
1094*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt64(KEY_NAME)
1095*1b3f573fSAndroid Build Coastguard Worker// Empty
1096*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int64(KEY_NAME)
1097*1b3f573fSAndroid Build Coastguard Worker// Empty
1098*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Bool(KEY_NAME)
1099*1b3f573fSAndroid Build Coastguard Worker// Empty
1100*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Float(KEY_NAME)
1101*1b3f573fSAndroid Build Coastguard Worker// Empty
1102*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Double(KEY_NAME)
1103*1b3f573fSAndroid Build Coastguard Worker// Empty
1104*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Enum(KEY_NAME)
1105*1b3f573fSAndroid Build Coastguard Worker//%- (NSData *)serializedDataForUnknownValue:(int32_t)value
1106*1b3f573fSAndroid Build Coastguard Worker//%                                   forKey:(GPBGenericValue *)key
1107*1b3f573fSAndroid Build Coastguard Worker//%                              keyDataType:(GPBDataType)keyDataType {
1108*1b3f573fSAndroid Build Coastguard Worker//%  size_t msgSize = ComputeDict##KEY_NAME##FieldSize(key->value##KEY_NAME, kMapKeyFieldNumber, keyDataType);
1109*1b3f573fSAndroid Build Coastguard Worker//%  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
1110*1b3f573fSAndroid Build Coastguard Worker//%  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
1111*1b3f573fSAndroid Build Coastguard Worker//%  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
1112*1b3f573fSAndroid Build Coastguard Worker//%  WriteDict##KEY_NAME##Field(outputStream, key->value##KEY_NAME, kMapKeyFieldNumber, keyDataType);
1113*1b3f573fSAndroid Build Coastguard Worker//%  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
1114*1b3f573fSAndroid Build Coastguard Worker//%  [outputStream release];
1115*1b3f573fSAndroid Build Coastguard Worker//%  return data;
1116*1b3f573fSAndroid Build Coastguard Worker//%}
1117*1b3f573fSAndroid Build Coastguard Worker//%
1118*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GPBVALUE_POD(VALUE_NAME)
1119*1b3f573fSAndroid Build Coastguard Worker//%value##VALUE_NAME
1120*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_POD(VALUE_NAME, EXTRA_INDENT)
1121*1b3f573fSAndroid Build Coastguard Worker// Empty
1122*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_POD(KEY_NAME, EXTRA_INDENT)
1123*1b3f573fSAndroid Build Coastguard Worker// Empty
1124*1b3f573fSAndroid Build Coastguard Worker
1125*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_POD()
1126*1b3f573fSAndroid Build Coastguard Worker//%  BOOL _valueSet[2];
1127*1b3f573fSAndroid Build Coastguard Worker//%
1128*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_INITS_POD(VALUE_NAME, VALUE_TYPE)
1129*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWith##VALUE_NAME##s:(const VALUE_TYPE [])values
1130*1b3f573fSAndroid Build Coastguard Worker//%                 ##VALUE_NAME$S## forKeys:(const BOOL [])keys
1131*1b3f573fSAndroid Build Coastguard Worker//%                 ##VALUE_NAME$S##   count:(NSUInteger)count {
1132*1b3f573fSAndroid Build Coastguard Worker//%  self = [super init];
1133*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
1134*1b3f573fSAndroid Build Coastguard Worker//%    for (NSUInteger i = 0; i < count; ++i) {
1135*1b3f573fSAndroid Build Coastguard Worker//%      int idx = keys[i] ? 1 : 0;
1136*1b3f573fSAndroid Build Coastguard Worker//%      _values[idx] = values[i];
1137*1b3f573fSAndroid Build Coastguard Worker//%      _valueSet[idx] = YES;
1138*1b3f573fSAndroid Build Coastguard Worker//%    }
1139*1b3f573fSAndroid Build Coastguard Worker//%  }
1140*1b3f573fSAndroid Build Coastguard Worker//%  return self;
1141*1b3f573fSAndroid Build Coastguard Worker//%}
1142*1b3f573fSAndroid Build Coastguard Worker//%
1143*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)dictionary {
1144*1b3f573fSAndroid Build Coastguard Worker//%  self = [self initWith##VALUE_NAME##s:NULL forKeys:NULL count:0];
1145*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
1146*1b3f573fSAndroid Build Coastguard Worker//%    if (dictionary) {
1147*1b3f573fSAndroid Build Coastguard Worker//%      for (int i = 0; i < 2; ++i) {
1148*1b3f573fSAndroid Build Coastguard Worker//%        if (dictionary->_valueSet[i]) {
1149*1b3f573fSAndroid Build Coastguard Worker//%          _values[i] = dictionary->_values[i];
1150*1b3f573fSAndroid Build Coastguard Worker//%          _valueSet[i] = YES;
1151*1b3f573fSAndroid Build Coastguard Worker//%        }
1152*1b3f573fSAndroid Build Coastguard Worker//%      }
1153*1b3f573fSAndroid Build Coastguard Worker//%    }
1154*1b3f573fSAndroid Build Coastguard Worker//%  }
1155*1b3f573fSAndroid Build Coastguard Worker//%  return self;
1156*1b3f573fSAndroid Build Coastguard Worker//%}
1157*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_DEALLOCPOD()
1158*1b3f573fSAndroid Build Coastguard Worker//%#if !defined(NS_BLOCK_ASSERTIONS)
1159*1b3f573fSAndroid Build Coastguard Worker//%- (void)dealloc {
1160*1b3f573fSAndroid Build Coastguard Worker//%  NSAssert(!_autocreator,
1161*1b3f573fSAndroid Build Coastguard Worker//%           @"%@: Autocreator must be cleared before release, autocreator: %@",
1162*1b3f573fSAndroid Build Coastguard Worker//%           [self class], _autocreator);
1163*1b3f573fSAndroid Build Coastguard Worker//%  [super dealloc];
1164*1b3f573fSAndroid Build Coastguard Worker//%}
1165*1b3f573fSAndroid Build Coastguard Worker//%#endif  // !defined(NS_BLOCK_ASSERTIONS)
1166*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_W_HASPOD(IDX, REF)
1167*1b3f573fSAndroid Build Coastguard Worker//%BOOL_DICT_HASPOD(IDX, REF)
1168*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HASPOD(IDX, REF)
1169*1b3f573fSAndroid Build Coastguard Worker//%REF##_valueSet[IDX]
1170*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE)
1171*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)get##VALUE_NAME##:(VALUE_TYPE *)value forKey:(BOOL)key {
1172*1b3f573fSAndroid Build Coastguard Worker//%  int idx = (key ? 1 : 0);
1173*1b3f573fSAndroid Build Coastguard Worker//%  if (_valueSet[idx]) {
1174*1b3f573fSAndroid Build Coastguard Worker//%    if (value) {
1175*1b3f573fSAndroid Build Coastguard Worker//%      *value = _values[idx];
1176*1b3f573fSAndroid Build Coastguard Worker//%    }
1177*1b3f573fSAndroid Build Coastguard Worker//%    return YES;
1178*1b3f573fSAndroid Build Coastguard Worker//%  }
1179*1b3f573fSAndroid Build Coastguard Worker//%  return NO;
1180*1b3f573fSAndroid Build Coastguard Worker//%}
1181*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE, VisP)
1182*1b3f573fSAndroid Build Coastguard Worker//%- (void)setGPBGenericValue:(GPBGenericValue *)value
1183*1b3f573fSAndroid Build Coastguard Worker//%     forGPBGenericValueKey:(GPBGenericValue *)key {
1184*1b3f573fSAndroid Build Coastguard Worker//%  int idx = (key->valueBool ? 1 : 0);
1185*1b3f573fSAndroid Build Coastguard Worker//%  _values[idx] = value->value##VALUE_NAME;
1186*1b3f573fSAndroid Build Coastguard Worker//%  _valueSet[idx] = YES;
1187*1b3f573fSAndroid Build Coastguard Worker//%}
1188*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_MUTATIONS_POD(VALUE_NAME, VALUE_TYPE)
1189*1b3f573fSAndroid Build Coastguard Worker//%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDictionary {
1190*1b3f573fSAndroid Build Coastguard Worker//%  if (otherDictionary) {
1191*1b3f573fSAndroid Build Coastguard Worker//%    for (int i = 0; i < 2; ++i) {
1192*1b3f573fSAndroid Build Coastguard Worker//%      if (otherDictionary->_valueSet[i]) {
1193*1b3f573fSAndroid Build Coastguard Worker//%        _valueSet[i] = YES;
1194*1b3f573fSAndroid Build Coastguard Worker//%        _values[i] = otherDictionary->_values[i];
1195*1b3f573fSAndroid Build Coastguard Worker//%      }
1196*1b3f573fSAndroid Build Coastguard Worker//%    }
1197*1b3f573fSAndroid Build Coastguard Worker//%    if (_autocreator) {
1198*1b3f573fSAndroid Build Coastguard Worker//%      GPBAutocreatedDictionaryModified(_autocreator, self);
1199*1b3f573fSAndroid Build Coastguard Worker//%    }
1200*1b3f573fSAndroid Build Coastguard Worker//%  }
1201*1b3f573fSAndroid Build Coastguard Worker//%}
1202*1b3f573fSAndroid Build Coastguard Worker//%
1203*1b3f573fSAndroid Build Coastguard Worker//%- (void)set##VALUE_NAME:(VALUE_TYPE)value forKey:(BOOL)key {
1204*1b3f573fSAndroid Build Coastguard Worker//%  int idx = (key ? 1 : 0);
1205*1b3f573fSAndroid Build Coastguard Worker//%  _values[idx] = value;
1206*1b3f573fSAndroid Build Coastguard Worker//%  _valueSet[idx] = YES;
1207*1b3f573fSAndroid Build Coastguard Worker//%  if (_autocreator) {
1208*1b3f573fSAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
1209*1b3f573fSAndroid Build Coastguard Worker//%  }
1210*1b3f573fSAndroid Build Coastguard Worker//%}
1211*1b3f573fSAndroid Build Coastguard Worker//%
1212*1b3f573fSAndroid Build Coastguard Worker//%- (void)remove##VALUE_NAME##ForKey:(BOOL)aKey {
1213*1b3f573fSAndroid Build Coastguard Worker//%  _valueSet[aKey ? 1 : 0] = NO;
1214*1b3f573fSAndroid Build Coastguard Worker//%}
1215*1b3f573fSAndroid Build Coastguard Worker//%
1216*1b3f573fSAndroid Build Coastguard Worker//%- (void)removeAll {
1217*1b3f573fSAndroid Build Coastguard Worker//%  _valueSet[0] = NO;
1218*1b3f573fSAndroid Build Coastguard Worker//%  _valueSet[1] = NO;
1219*1b3f573fSAndroid Build Coastguard Worker//%}
1220*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_POD(VALUE_NAME)
1221*1b3f573fSAndroid Build Coastguard Worker//%STR_FORMAT_##VALUE_NAME()
1222*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_UInt32()
1223*1b3f573fSAndroid Build Coastguard Worker//%%u
1224*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Int32()
1225*1b3f573fSAndroid Build Coastguard Worker//%%d
1226*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_UInt64()
1227*1b3f573fSAndroid Build Coastguard Worker//%%llu
1228*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Int64()
1229*1b3f573fSAndroid Build Coastguard Worker//%%lld
1230*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Bool()
1231*1b3f573fSAndroid Build Coastguard Worker//%%d
1232*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Float()
1233*1b3f573fSAndroid Build Coastguard Worker//%%f
1234*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Double()
1235*1b3f573fSAndroid Build Coastguard Worker//%%lf
1236*1b3f573fSAndroid Build Coastguard Worker
1237*1b3f573fSAndroid Build Coastguard Worker//
1238*1b3f573fSAndroid Build Coastguard Worker// Helpers for Objects
1239*1b3f573fSAndroid Build Coastguard Worker//
1240*1b3f573fSAndroid Build Coastguard Worker
1241*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE VALUE_FOR_KEY_OBJECT(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER)
1242*1b3f573fSAndroid Build Coastguard Worker//%- (VALUE_TYPE)objectForKey:(KEY_TYPE)key {
1243*1b3f573fSAndroid Build Coastguard Worker//%  VALUE_TYPE result = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
1244*1b3f573fSAndroid Build Coastguard Worker//%  return result;
1245*1b3f573fSAndroid Build Coastguard Worker//%}
1246*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE WRAPPEDOBJECT(VALUE)
1247*1b3f573fSAndroid Build Coastguard Worker//%VALUE
1248*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPString(VALUE)
1249*1b3f573fSAndroid Build Coastguard Worker//%VALUE
1250*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPObject(VALUE)
1251*1b3f573fSAndroid Build Coastguard Worker//%VALUE
1252*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJString(VALUE)
1253*1b3f573fSAndroid Build Coastguard Worker//%VALUE
1254*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJObject(VALUE)
1255*1b3f573fSAndroid Build Coastguard Worker//%VALUE
1256*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT(TYPE)
1257*1b3f573fSAndroid Build Coastguard Worker//%ENUM_TYPEOBJECT_##TYPE()
1258*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT_NSString()
1259*1b3f573fSAndroid Build Coastguard Worker//%NSString *
1260*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT_id()
1261*1b3f573fSAndroid Build Coastguard Worker//%id ##
1262*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE NEQ_OBJECT(VAL1, VAL2)
1263*1b3f573fSAndroid Build Coastguard Worker//%![VAL1 isEqual:VAL2]
1264*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME)
1265*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)isInitialized {
1266*1b3f573fSAndroid Build Coastguard Worker//%  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
1267*1b3f573fSAndroid Build Coastguard Worker//%    if (!msg.initialized) {
1268*1b3f573fSAndroid Build Coastguard Worker//%      return NO;
1269*1b3f573fSAndroid Build Coastguard Worker//%    }
1270*1b3f573fSAndroid Build Coastguard Worker//%  }
1271*1b3f573fSAndroid Build Coastguard Worker//%  return YES;
1272*1b3f573fSAndroid Build Coastguard Worker//%}
1273*1b3f573fSAndroid Build Coastguard Worker//%
1274*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)deepCopyWithZone:(NSZone *)zone {
1275*1b3f573fSAndroid Build Coastguard Worker//%  GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict =
1276*1b3f573fSAndroid Build Coastguard Worker//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
1277*1b3f573fSAndroid Build Coastguard Worker//%  NSEnumerator *keys = [_dictionary keyEnumerator];
1278*1b3f573fSAndroid Build Coastguard Worker//%  id aKey;
1279*1b3f573fSAndroid Build Coastguard Worker//%  NSMutableDictionary *internalDict = newDict->_dictionary;
1280*1b3f573fSAndroid Build Coastguard Worker//%  while ((aKey = [keys nextObject])) {
1281*1b3f573fSAndroid Build Coastguard Worker//%    GPBMessage *msg = _dictionary[aKey];
1282*1b3f573fSAndroid Build Coastguard Worker//%    GPBMessage *copiedMsg = [msg copyWithZone:zone];
1283*1b3f573fSAndroid Build Coastguard Worker//%    [internalDict setObject:copiedMsg forKey:aKey];
1284*1b3f573fSAndroid Build Coastguard Worker//%    [copiedMsg release];
1285*1b3f573fSAndroid Build Coastguard Worker//%  }
1286*1b3f573fSAndroid Build Coastguard Worker//%  return newDict;
1287*1b3f573fSAndroid Build Coastguard Worker//%}
1288*1b3f573fSAndroid Build Coastguard Worker//%
1289*1b3f573fSAndroid Build Coastguard Worker//%
1290*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME)
1291*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)isInitialized {
1292*1b3f573fSAndroid Build Coastguard Worker//%  if (_values[0] && ![_values[0] isInitialized]) {
1293*1b3f573fSAndroid Build Coastguard Worker//%    return NO;
1294*1b3f573fSAndroid Build Coastguard Worker//%  }
1295*1b3f573fSAndroid Build Coastguard Worker//%  if (_values[1] && ![_values[1] isInitialized]) {
1296*1b3f573fSAndroid Build Coastguard Worker//%    return NO;
1297*1b3f573fSAndroid Build Coastguard Worker//%  }
1298*1b3f573fSAndroid Build Coastguard Worker//%  return YES;
1299*1b3f573fSAndroid Build Coastguard Worker//%}
1300*1b3f573fSAndroid Build Coastguard Worker//%
1301*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)deepCopyWithZone:(NSZone *)zone {
1302*1b3f573fSAndroid Build Coastguard Worker//%  GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict =
1303*1b3f573fSAndroid Build Coastguard Worker//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
1304*1b3f573fSAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
1305*1b3f573fSAndroid Build Coastguard Worker//%    if (_values[i] != nil) {
1306*1b3f573fSAndroid Build Coastguard Worker//%      newDict->_values[i] = [_values[i] copyWithZone:zone];
1307*1b3f573fSAndroid Build Coastguard Worker//%    }
1308*1b3f573fSAndroid Build Coastguard Worker//%  }
1309*1b3f573fSAndroid Build Coastguard Worker//%  return newDict;
1310*1b3f573fSAndroid Build Coastguard Worker//%}
1311*1b3f573fSAndroid Build Coastguard Worker//%
1312*1b3f573fSAndroid Build Coastguard Worker//%
1313*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_OBJECT(KEY_NAME, VALUE_NAME)
1314*1b3f573fSAndroid Build Coastguard Worker// Empty
1315*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GPBVALUE_OBJECT(VALUE_NAME)
1316*1b3f573fSAndroid Build Coastguard Worker//%valueString
1317*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_OBJECT(VALUE_NAME, EXTRA_INDENT)
1318*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  if (!##VALUE_NAME) {
1319*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##    [NSException raise:NSInvalidArgumentException
1320*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##                format:@"Attempting to add nil object to a Dictionary"];
1321*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  }
1322*1b3f573fSAndroid Build Coastguard Worker//%
1323*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_OBJECT(KEY_NAME, EXTRA_INDENT)
1324*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  if (!##KEY_NAME) {
1325*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##    [NSException raise:NSInvalidArgumentException
1326*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##                format:@"Attempting to add nil key to a Dictionary"];
1327*1b3f573fSAndroid Build Coastguard Worker//%##EXTRA_INDENT$S##  }
1328*1b3f573fSAndroid Build Coastguard Worker//%
1329*1b3f573fSAndroid Build Coastguard Worker
1330*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_OBJECT()
1331*1b3f573fSAndroid Build Coastguard Worker// Empty
1332*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_INITS_OBJECT(VALUE_NAME, VALUE_TYPE)
1333*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithObjects:(const VALUE_TYPE [])objects
1334*1b3f573fSAndroid Build Coastguard Worker//%                        forKeys:(const BOOL [])keys
1335*1b3f573fSAndroid Build Coastguard Worker//%                          count:(NSUInteger)count {
1336*1b3f573fSAndroid Build Coastguard Worker//%  self = [super init];
1337*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
1338*1b3f573fSAndroid Build Coastguard Worker//%    for (NSUInteger i = 0; i < count; ++i) {
1339*1b3f573fSAndroid Build Coastguard Worker//%      if (!objects[i]) {
1340*1b3f573fSAndroid Build Coastguard Worker//%        [NSException raise:NSInvalidArgumentException
1341*1b3f573fSAndroid Build Coastguard Worker//%                    format:@"Attempting to add nil object to a Dictionary"];
1342*1b3f573fSAndroid Build Coastguard Worker//%      }
1343*1b3f573fSAndroid Build Coastguard Worker//%      int idx = keys[i] ? 1 : 0;
1344*1b3f573fSAndroid Build Coastguard Worker//%      [_values[idx] release];
1345*1b3f573fSAndroid Build Coastguard Worker//%      _values[idx] = (VALUE_TYPE)[objects[i] retain];
1346*1b3f573fSAndroid Build Coastguard Worker//%    }
1347*1b3f573fSAndroid Build Coastguard Worker//%  }
1348*1b3f573fSAndroid Build Coastguard Worker//%  return self;
1349*1b3f573fSAndroid Build Coastguard Worker//%}
1350*1b3f573fSAndroid Build Coastguard Worker//%
1351*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)dictionary {
1352*1b3f573fSAndroid Build Coastguard Worker//%  self = [self initWithObjects:NULL forKeys:NULL count:0];
1353*1b3f573fSAndroid Build Coastguard Worker//%  if (self) {
1354*1b3f573fSAndroid Build Coastguard Worker//%    if (dictionary) {
1355*1b3f573fSAndroid Build Coastguard Worker//%      _values[0] = [dictionary->_values[0] retain];
1356*1b3f573fSAndroid Build Coastguard Worker//%      _values[1] = [dictionary->_values[1] retain];
1357*1b3f573fSAndroid Build Coastguard Worker//%    }
1358*1b3f573fSAndroid Build Coastguard Worker//%  }
1359*1b3f573fSAndroid Build Coastguard Worker//%  return self;
1360*1b3f573fSAndroid Build Coastguard Worker//%}
1361*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_DEALLOCOBJECT()
1362*1b3f573fSAndroid Build Coastguard Worker//%- (void)dealloc {
1363*1b3f573fSAndroid Build Coastguard Worker//%  NSAssert(!_autocreator,
1364*1b3f573fSAndroid Build Coastguard Worker//%           @"%@: Autocreator must be cleared before release, autocreator: %@",
1365*1b3f573fSAndroid Build Coastguard Worker//%           [self class], _autocreator);
1366*1b3f573fSAndroid Build Coastguard Worker//%  [_values[0] release];
1367*1b3f573fSAndroid Build Coastguard Worker//%  [_values[1] release];
1368*1b3f573fSAndroid Build Coastguard Worker//%  [super dealloc];
1369*1b3f573fSAndroid Build Coastguard Worker//%}
1370*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_W_HASOBJECT(IDX, REF)
1371*1b3f573fSAndroid Build Coastguard Worker//%(BOOL_DICT_HASOBJECT(IDX, REF))
1372*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HASOBJECT(IDX, REF)
1373*1b3f573fSAndroid Build Coastguard Worker//%REF##_values[IDX] != nil
1374*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE)
1375*1b3f573fSAndroid Build Coastguard Worker//%- (VALUE_TYPE)objectForKey:(BOOL)key {
1376*1b3f573fSAndroid Build Coastguard Worker//%  return _values[key ? 1 : 0];
1377*1b3f573fSAndroid Build Coastguard Worker//%}
1378*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE, VisP)
1379*1b3f573fSAndroid Build Coastguard Worker//%- (void)setGPBGenericValue:(GPBGenericValue *)value
1380*1b3f573fSAndroid Build Coastguard Worker//%     forGPBGenericValueKey:(GPBGenericValue *)key {
1381*1b3f573fSAndroid Build Coastguard Worker//%  int idx = (key->valueBool ? 1 : 0);
1382*1b3f573fSAndroid Build Coastguard Worker//%  [_values[idx] release];
1383*1b3f573fSAndroid Build Coastguard Worker//%  _values[idx] = [value->valueString retain];
1384*1b3f573fSAndroid Build Coastguard Worker//%}
1385*1b3f573fSAndroid Build Coastguard Worker
1386*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_MUTATIONS_OBJECT(VALUE_NAME, VALUE_TYPE)
1387*1b3f573fSAndroid Build Coastguard Worker//%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDictionary {
1388*1b3f573fSAndroid Build Coastguard Worker//%  if (otherDictionary) {
1389*1b3f573fSAndroid Build Coastguard Worker//%    for (int i = 0; i < 2; ++i) {
1390*1b3f573fSAndroid Build Coastguard Worker//%      if (otherDictionary->_values[i] != nil) {
1391*1b3f573fSAndroid Build Coastguard Worker//%        [_values[i] release];
1392*1b3f573fSAndroid Build Coastguard Worker//%        _values[i] = [otherDictionary->_values[i] retain];
1393*1b3f573fSAndroid Build Coastguard Worker//%      }
1394*1b3f573fSAndroid Build Coastguard Worker//%    }
1395*1b3f573fSAndroid Build Coastguard Worker//%    if (_autocreator) {
1396*1b3f573fSAndroid Build Coastguard Worker//%      GPBAutocreatedDictionaryModified(_autocreator, self);
1397*1b3f573fSAndroid Build Coastguard Worker//%    }
1398*1b3f573fSAndroid Build Coastguard Worker//%  }
1399*1b3f573fSAndroid Build Coastguard Worker//%}
1400*1b3f573fSAndroid Build Coastguard Worker//%
1401*1b3f573fSAndroid Build Coastguard Worker//%- (void)setObject:(VALUE_TYPE)object forKey:(BOOL)key {
1402*1b3f573fSAndroid Build Coastguard Worker//%  if (!object) {
1403*1b3f573fSAndroid Build Coastguard Worker//%    [NSException raise:NSInvalidArgumentException
1404*1b3f573fSAndroid Build Coastguard Worker//%                format:@"Attempting to add nil object to a Dictionary"];
1405*1b3f573fSAndroid Build Coastguard Worker//%  }
1406*1b3f573fSAndroid Build Coastguard Worker//%  int idx = (key ? 1 : 0);
1407*1b3f573fSAndroid Build Coastguard Worker//%  [_values[idx] release];
1408*1b3f573fSAndroid Build Coastguard Worker//%  _values[idx] = [object retain];
1409*1b3f573fSAndroid Build Coastguard Worker//%  if (_autocreator) {
1410*1b3f573fSAndroid Build Coastguard Worker//%    GPBAutocreatedDictionaryModified(_autocreator, self);
1411*1b3f573fSAndroid Build Coastguard Worker//%  }
1412*1b3f573fSAndroid Build Coastguard Worker//%}
1413*1b3f573fSAndroid Build Coastguard Worker//%
1414*1b3f573fSAndroid Build Coastguard Worker//%- (void)removeObjectForKey:(BOOL)aKey {
1415*1b3f573fSAndroid Build Coastguard Worker//%  int idx = (aKey ? 1 : 0);
1416*1b3f573fSAndroid Build Coastguard Worker//%  [_values[idx] release];
1417*1b3f573fSAndroid Build Coastguard Worker//%  _values[idx] = nil;
1418*1b3f573fSAndroid Build Coastguard Worker//%}
1419*1b3f573fSAndroid Build Coastguard Worker//%
1420*1b3f573fSAndroid Build Coastguard Worker//%- (void)removeAll {
1421*1b3f573fSAndroid Build Coastguard Worker//%  for (int i = 0; i < 2; ++i) {
1422*1b3f573fSAndroid Build Coastguard Worker//%    [_values[i] release];
1423*1b3f573fSAndroid Build Coastguard Worker//%    _values[i] = nil;
1424*1b3f573fSAndroid Build Coastguard Worker//%  }
1425*1b3f573fSAndroid Build Coastguard Worker//%}
1426*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_OBJECT(VALUE_NAME)
1427*1b3f573fSAndroid Build Coastguard Worker//%%@
1428*1b3f573fSAndroid Build Coastguard Worker
1429*1b3f573fSAndroid Build Coastguard Worker
1430*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt32, uint32_t)
1431*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
1432*1b3f573fSAndroid Build Coastguard Worker// clang-format off
1433*1b3f573fSAndroid Build Coastguard Worker
1434*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> UInt32
1435*1b3f573fSAndroid Build Coastguard Worker
1436*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32UInt32Dictionary {
1437*1b3f573fSAndroid Build Coastguard Worker @package
1438*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1439*1b3f573fSAndroid Build Coastguard Worker}
1440*1b3f573fSAndroid Build Coastguard Worker
1441*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
1442*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
1443*1b3f573fSAndroid Build Coastguard Worker}
1444*1b3f573fSAndroid Build Coastguard Worker
1445*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
1446*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
1447*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
1448*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
1449*1b3f573fSAndroid Build Coastguard Worker  if (self) {
1450*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
1451*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
1452*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
1453*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1454*1b3f573fSAndroid Build Coastguard Worker      }
1455*1b3f573fSAndroid Build Coastguard Worker    }
1456*1b3f573fSAndroid Build Coastguard Worker  }
1457*1b3f573fSAndroid Build Coastguard Worker  return self;
1458*1b3f573fSAndroid Build Coastguard Worker}
1459*1b3f573fSAndroid Build Coastguard Worker
1460*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary {
1461*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
1462*1b3f573fSAndroid Build Coastguard Worker  if (self) {
1463*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
1464*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1465*1b3f573fSAndroid Build Coastguard Worker    }
1466*1b3f573fSAndroid Build Coastguard Worker  }
1467*1b3f573fSAndroid Build Coastguard Worker  return self;
1468*1b3f573fSAndroid Build Coastguard Worker}
1469*1b3f573fSAndroid Build Coastguard Worker
1470*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
1471*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
1472*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
1473*1b3f573fSAndroid Build Coastguard Worker}
1474*1b3f573fSAndroid Build Coastguard Worker
1475*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
1476*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
1477*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
1478*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
1479*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
1480*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
1481*1b3f573fSAndroid Build Coastguard Worker}
1482*1b3f573fSAndroid Build Coastguard Worker
1483*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
1484*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
1485*1b3f573fSAndroid Build Coastguard Worker}
1486*1b3f573fSAndroid Build Coastguard Worker
1487*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
1488*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
1489*1b3f573fSAndroid Build Coastguard Worker    return YES;
1490*1b3f573fSAndroid Build Coastguard Worker  }
1491*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32UInt32Dictionary class]]) {
1492*1b3f573fSAndroid Build Coastguard Worker    return NO;
1493*1b3f573fSAndroid Build Coastguard Worker  }
1494*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32UInt32Dictionary *otherDictionary = other;
1495*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
1496*1b3f573fSAndroid Build Coastguard Worker}
1497*1b3f573fSAndroid Build Coastguard Worker
1498*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
1499*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
1500*1b3f573fSAndroid Build Coastguard Worker}
1501*1b3f573fSAndroid Build Coastguard Worker
1502*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
1503*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
1504*1b3f573fSAndroid Build Coastguard Worker}
1505*1b3f573fSAndroid Build Coastguard Worker
1506*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
1507*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
1508*1b3f573fSAndroid Build Coastguard Worker}
1509*1b3f573fSAndroid Build Coastguard Worker
1510*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
1511*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, uint32_t value, BOOL *stop))block {
1512*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
1513*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1514*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1515*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1516*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1517*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1518*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue unsignedIntValue], &stop);
1519*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
1520*1b3f573fSAndroid Build Coastguard Worker      break;
1521*1b3f573fSAndroid Build Coastguard Worker    }
1522*1b3f573fSAndroid Build Coastguard Worker  }
1523*1b3f573fSAndroid Build Coastguard Worker}
1524*1b3f573fSAndroid Build Coastguard Worker
1525*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1526*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1527*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
1528*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
1529*1b3f573fSAndroid Build Coastguard Worker    return 0;
1530*1b3f573fSAndroid Build Coastguard Worker  }
1531*1b3f573fSAndroid Build Coastguard Worker
1532*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1533*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1534*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
1535*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1536*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1537*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1538*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1539*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
1540*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
1541*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1542*1b3f573fSAndroid Build Coastguard Worker  }
1543*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1544*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
1545*1b3f573fSAndroid Build Coastguard Worker  return result;
1546*1b3f573fSAndroid Build Coastguard Worker}
1547*1b3f573fSAndroid Build Coastguard Worker
1548*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1549*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
1550*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1551*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1552*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1553*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1554*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1555*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1556*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1557*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1558*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
1559*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
1560*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
1561*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
1562*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
1563*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
1564*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
1565*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
1566*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
1567*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
1568*1b3f573fSAndroid Build Coastguard Worker  }
1569*1b3f573fSAndroid Build Coastguard Worker}
1570*1b3f573fSAndroid Build Coastguard Worker
1571*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
1572*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
1573*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt32)];
1574*1b3f573fSAndroid Build Coastguard Worker}
1575*1b3f573fSAndroid Build Coastguard Worker
1576*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
1577*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(uint32_t key, uint32_t value, BOOL *stop) {
1578*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
1579*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%u", value]);
1580*1b3f573fSAndroid Build Coastguard Worker  }];
1581*1b3f573fSAndroid Build Coastguard Worker}
1582*1b3f573fSAndroid Build Coastguard Worker
1583*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint32_t)key {
1584*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1585*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
1586*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
1587*1b3f573fSAndroid Build Coastguard Worker  }
1588*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
1589*1b3f573fSAndroid Build Coastguard Worker}
1590*1b3f573fSAndroid Build Coastguard Worker
1591*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32UInt32Dictionary *)otherDictionary {
1592*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
1593*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1594*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
1595*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
1596*1b3f573fSAndroid Build Coastguard Worker    }
1597*1b3f573fSAndroid Build Coastguard Worker  }
1598*1b3f573fSAndroid Build Coastguard Worker}
1599*1b3f573fSAndroid Build Coastguard Worker
1600*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(uint32_t)key {
1601*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
1602*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
1603*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
1604*1b3f573fSAndroid Build Coastguard Worker  }
1605*1b3f573fSAndroid Build Coastguard Worker}
1606*1b3f573fSAndroid Build Coastguard Worker
1607*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(uint32_t)aKey {
1608*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
1609*1b3f573fSAndroid Build Coastguard Worker}
1610*1b3f573fSAndroid Build Coastguard Worker
1611*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
1612*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
1613*1b3f573fSAndroid Build Coastguard Worker}
1614*1b3f573fSAndroid Build Coastguard Worker
1615*1b3f573fSAndroid Build Coastguard Worker@end
1616*1b3f573fSAndroid Build Coastguard Worker
1617*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> Int32
1618*1b3f573fSAndroid Build Coastguard Worker
1619*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32Int32Dictionary {
1620*1b3f573fSAndroid Build Coastguard Worker @package
1621*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1622*1b3f573fSAndroid Build Coastguard Worker}
1623*1b3f573fSAndroid Build Coastguard Worker
1624*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
1625*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
1626*1b3f573fSAndroid Build Coastguard Worker}
1627*1b3f573fSAndroid Build Coastguard Worker
1628*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
1629*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const uint32_t [])keys
1630*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
1631*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
1632*1b3f573fSAndroid Build Coastguard Worker  if (self) {
1633*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
1634*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
1635*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
1636*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1637*1b3f573fSAndroid Build Coastguard Worker      }
1638*1b3f573fSAndroid Build Coastguard Worker    }
1639*1b3f573fSAndroid Build Coastguard Worker  }
1640*1b3f573fSAndroid Build Coastguard Worker  return self;
1641*1b3f573fSAndroid Build Coastguard Worker}
1642*1b3f573fSAndroid Build Coastguard Worker
1643*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32Int32Dictionary *)dictionary {
1644*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
1645*1b3f573fSAndroid Build Coastguard Worker  if (self) {
1646*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
1647*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1648*1b3f573fSAndroid Build Coastguard Worker    }
1649*1b3f573fSAndroid Build Coastguard Worker  }
1650*1b3f573fSAndroid Build Coastguard Worker  return self;
1651*1b3f573fSAndroid Build Coastguard Worker}
1652*1b3f573fSAndroid Build Coastguard Worker
1653*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
1654*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
1655*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
1656*1b3f573fSAndroid Build Coastguard Worker}
1657*1b3f573fSAndroid Build Coastguard Worker
1658*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
1659*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
1660*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
1661*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
1662*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
1663*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
1664*1b3f573fSAndroid Build Coastguard Worker}
1665*1b3f573fSAndroid Build Coastguard Worker
1666*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
1667*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self];
1668*1b3f573fSAndroid Build Coastguard Worker}
1669*1b3f573fSAndroid Build Coastguard Worker
1670*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
1671*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
1672*1b3f573fSAndroid Build Coastguard Worker    return YES;
1673*1b3f573fSAndroid Build Coastguard Worker  }
1674*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32Int32Dictionary class]]) {
1675*1b3f573fSAndroid Build Coastguard Worker    return NO;
1676*1b3f573fSAndroid Build Coastguard Worker  }
1677*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32Int32Dictionary *otherDictionary = other;
1678*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
1679*1b3f573fSAndroid Build Coastguard Worker}
1680*1b3f573fSAndroid Build Coastguard Worker
1681*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
1682*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
1683*1b3f573fSAndroid Build Coastguard Worker}
1684*1b3f573fSAndroid Build Coastguard Worker
1685*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
1686*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
1687*1b3f573fSAndroid Build Coastguard Worker}
1688*1b3f573fSAndroid Build Coastguard Worker
1689*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
1690*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
1691*1b3f573fSAndroid Build Coastguard Worker}
1692*1b3f573fSAndroid Build Coastguard Worker
1693*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
1694*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block {
1695*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
1696*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1697*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1698*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1699*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1700*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1701*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue intValue], &stop);
1702*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
1703*1b3f573fSAndroid Build Coastguard Worker      break;
1704*1b3f573fSAndroid Build Coastguard Worker    }
1705*1b3f573fSAndroid Build Coastguard Worker  }
1706*1b3f573fSAndroid Build Coastguard Worker}
1707*1b3f573fSAndroid Build Coastguard Worker
1708*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1709*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1710*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
1711*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
1712*1b3f573fSAndroid Build Coastguard Worker    return 0;
1713*1b3f573fSAndroid Build Coastguard Worker  }
1714*1b3f573fSAndroid Build Coastguard Worker
1715*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1716*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1717*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
1718*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1719*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1720*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1721*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1722*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
1723*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
1724*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1725*1b3f573fSAndroid Build Coastguard Worker  }
1726*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1727*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
1728*1b3f573fSAndroid Build Coastguard Worker  return result;
1729*1b3f573fSAndroid Build Coastguard Worker}
1730*1b3f573fSAndroid Build Coastguard Worker
1731*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1732*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
1733*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1734*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1735*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1736*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1737*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1738*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1739*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1740*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1741*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
1742*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
1743*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
1744*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
1745*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
1746*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
1747*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
1748*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
1749*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
1750*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
1751*1b3f573fSAndroid Build Coastguard Worker  }
1752*1b3f573fSAndroid Build Coastguard Worker}
1753*1b3f573fSAndroid Build Coastguard Worker
1754*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
1755*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
1756*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt32)];
1757*1b3f573fSAndroid Build Coastguard Worker}
1758*1b3f573fSAndroid Build Coastguard Worker
1759*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
1760*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
1761*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
1762*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%d", value]);
1763*1b3f573fSAndroid Build Coastguard Worker  }];
1764*1b3f573fSAndroid Build Coastguard Worker}
1765*1b3f573fSAndroid Build Coastguard Worker
1766*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint32_t)key {
1767*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1768*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
1769*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped intValue];
1770*1b3f573fSAndroid Build Coastguard Worker  }
1771*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
1772*1b3f573fSAndroid Build Coastguard Worker}
1773*1b3f573fSAndroid Build Coastguard Worker
1774*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32Int32Dictionary *)otherDictionary {
1775*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
1776*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1777*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
1778*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
1779*1b3f573fSAndroid Build Coastguard Worker    }
1780*1b3f573fSAndroid Build Coastguard Worker  }
1781*1b3f573fSAndroid Build Coastguard Worker}
1782*1b3f573fSAndroid Build Coastguard Worker
1783*1b3f573fSAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(uint32_t)key {
1784*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
1785*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
1786*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
1787*1b3f573fSAndroid Build Coastguard Worker  }
1788*1b3f573fSAndroid Build Coastguard Worker}
1789*1b3f573fSAndroid Build Coastguard Worker
1790*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt32ForKey:(uint32_t)aKey {
1791*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
1792*1b3f573fSAndroid Build Coastguard Worker}
1793*1b3f573fSAndroid Build Coastguard Worker
1794*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
1795*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
1796*1b3f573fSAndroid Build Coastguard Worker}
1797*1b3f573fSAndroid Build Coastguard Worker
1798*1b3f573fSAndroid Build Coastguard Worker@end
1799*1b3f573fSAndroid Build Coastguard Worker
1800*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> UInt64
1801*1b3f573fSAndroid Build Coastguard Worker
1802*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32UInt64Dictionary {
1803*1b3f573fSAndroid Build Coastguard Worker @package
1804*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1805*1b3f573fSAndroid Build Coastguard Worker}
1806*1b3f573fSAndroid Build Coastguard Worker
1807*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
1808*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
1809*1b3f573fSAndroid Build Coastguard Worker}
1810*1b3f573fSAndroid Build Coastguard Worker
1811*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
1812*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
1813*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
1814*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
1815*1b3f573fSAndroid Build Coastguard Worker  if (self) {
1816*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
1817*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
1818*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
1819*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1820*1b3f573fSAndroid Build Coastguard Worker      }
1821*1b3f573fSAndroid Build Coastguard Worker    }
1822*1b3f573fSAndroid Build Coastguard Worker  }
1823*1b3f573fSAndroid Build Coastguard Worker  return self;
1824*1b3f573fSAndroid Build Coastguard Worker}
1825*1b3f573fSAndroid Build Coastguard Worker
1826*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary {
1827*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
1828*1b3f573fSAndroid Build Coastguard Worker  if (self) {
1829*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
1830*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1831*1b3f573fSAndroid Build Coastguard Worker    }
1832*1b3f573fSAndroid Build Coastguard Worker  }
1833*1b3f573fSAndroid Build Coastguard Worker  return self;
1834*1b3f573fSAndroid Build Coastguard Worker}
1835*1b3f573fSAndroid Build Coastguard Worker
1836*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
1837*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
1838*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
1839*1b3f573fSAndroid Build Coastguard Worker}
1840*1b3f573fSAndroid Build Coastguard Worker
1841*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
1842*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
1843*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
1844*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
1845*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
1846*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
1847*1b3f573fSAndroid Build Coastguard Worker}
1848*1b3f573fSAndroid Build Coastguard Worker
1849*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
1850*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
1851*1b3f573fSAndroid Build Coastguard Worker}
1852*1b3f573fSAndroid Build Coastguard Worker
1853*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
1854*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
1855*1b3f573fSAndroid Build Coastguard Worker    return YES;
1856*1b3f573fSAndroid Build Coastguard Worker  }
1857*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32UInt64Dictionary class]]) {
1858*1b3f573fSAndroid Build Coastguard Worker    return NO;
1859*1b3f573fSAndroid Build Coastguard Worker  }
1860*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32UInt64Dictionary *otherDictionary = other;
1861*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
1862*1b3f573fSAndroid Build Coastguard Worker}
1863*1b3f573fSAndroid Build Coastguard Worker
1864*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
1865*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
1866*1b3f573fSAndroid Build Coastguard Worker}
1867*1b3f573fSAndroid Build Coastguard Worker
1868*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
1869*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
1870*1b3f573fSAndroid Build Coastguard Worker}
1871*1b3f573fSAndroid Build Coastguard Worker
1872*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
1873*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
1874*1b3f573fSAndroid Build Coastguard Worker}
1875*1b3f573fSAndroid Build Coastguard Worker
1876*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
1877*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, uint64_t value, BOOL *stop))block {
1878*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
1879*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1880*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1881*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1882*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1883*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1884*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue unsignedLongLongValue], &stop);
1885*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
1886*1b3f573fSAndroid Build Coastguard Worker      break;
1887*1b3f573fSAndroid Build Coastguard Worker    }
1888*1b3f573fSAndroid Build Coastguard Worker  }
1889*1b3f573fSAndroid Build Coastguard Worker}
1890*1b3f573fSAndroid Build Coastguard Worker
1891*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1892*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1893*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
1894*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
1895*1b3f573fSAndroid Build Coastguard Worker    return 0;
1896*1b3f573fSAndroid Build Coastguard Worker  }
1897*1b3f573fSAndroid Build Coastguard Worker
1898*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1899*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1900*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
1901*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1902*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1903*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1904*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1905*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
1906*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
1907*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1908*1b3f573fSAndroid Build Coastguard Worker  }
1909*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
1910*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
1911*1b3f573fSAndroid Build Coastguard Worker  return result;
1912*1b3f573fSAndroid Build Coastguard Worker}
1913*1b3f573fSAndroid Build Coastguard Worker
1914*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1915*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
1916*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
1917*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
1918*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
1919*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
1920*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
1921*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
1922*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
1923*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
1924*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
1925*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
1926*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
1927*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
1928*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
1929*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
1930*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
1931*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
1932*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
1933*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
1934*1b3f573fSAndroid Build Coastguard Worker  }
1935*1b3f573fSAndroid Build Coastguard Worker}
1936*1b3f573fSAndroid Build Coastguard Worker
1937*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
1938*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
1939*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt32)];
1940*1b3f573fSAndroid Build Coastguard Worker}
1941*1b3f573fSAndroid Build Coastguard Worker
1942*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
1943*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(uint32_t key, uint64_t value, BOOL *stop) {
1944*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
1945*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%llu", value]);
1946*1b3f573fSAndroid Build Coastguard Worker  }];
1947*1b3f573fSAndroid Build Coastguard Worker}
1948*1b3f573fSAndroid Build Coastguard Worker
1949*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint32_t)key {
1950*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1951*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
1952*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
1953*1b3f573fSAndroid Build Coastguard Worker  }
1954*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
1955*1b3f573fSAndroid Build Coastguard Worker}
1956*1b3f573fSAndroid Build Coastguard Worker
1957*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32UInt64Dictionary *)otherDictionary {
1958*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
1959*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1960*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
1961*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
1962*1b3f573fSAndroid Build Coastguard Worker    }
1963*1b3f573fSAndroid Build Coastguard Worker  }
1964*1b3f573fSAndroid Build Coastguard Worker}
1965*1b3f573fSAndroid Build Coastguard Worker
1966*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(uint32_t)key {
1967*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
1968*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
1969*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
1970*1b3f573fSAndroid Build Coastguard Worker  }
1971*1b3f573fSAndroid Build Coastguard Worker}
1972*1b3f573fSAndroid Build Coastguard Worker
1973*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(uint32_t)aKey {
1974*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
1975*1b3f573fSAndroid Build Coastguard Worker}
1976*1b3f573fSAndroid Build Coastguard Worker
1977*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
1978*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
1979*1b3f573fSAndroid Build Coastguard Worker}
1980*1b3f573fSAndroid Build Coastguard Worker
1981*1b3f573fSAndroid Build Coastguard Worker@end
1982*1b3f573fSAndroid Build Coastguard Worker
1983*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> Int64
1984*1b3f573fSAndroid Build Coastguard Worker
1985*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32Int64Dictionary {
1986*1b3f573fSAndroid Build Coastguard Worker @package
1987*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
1988*1b3f573fSAndroid Build Coastguard Worker}
1989*1b3f573fSAndroid Build Coastguard Worker
1990*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
1991*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
1992*1b3f573fSAndroid Build Coastguard Worker}
1993*1b3f573fSAndroid Build Coastguard Worker
1994*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
1995*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const uint32_t [])keys
1996*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
1997*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
1998*1b3f573fSAndroid Build Coastguard Worker  if (self) {
1999*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2000*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
2001*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2002*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2003*1b3f573fSAndroid Build Coastguard Worker      }
2004*1b3f573fSAndroid Build Coastguard Worker    }
2005*1b3f573fSAndroid Build Coastguard Worker  }
2006*1b3f573fSAndroid Build Coastguard Worker  return self;
2007*1b3f573fSAndroid Build Coastguard Worker}
2008*1b3f573fSAndroid Build Coastguard Worker
2009*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32Int64Dictionary *)dictionary {
2010*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
2011*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2012*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
2013*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2014*1b3f573fSAndroid Build Coastguard Worker    }
2015*1b3f573fSAndroid Build Coastguard Worker  }
2016*1b3f573fSAndroid Build Coastguard Worker  return self;
2017*1b3f573fSAndroid Build Coastguard Worker}
2018*1b3f573fSAndroid Build Coastguard Worker
2019*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2020*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
2021*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
2022*1b3f573fSAndroid Build Coastguard Worker}
2023*1b3f573fSAndroid Build Coastguard Worker
2024*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
2025*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2026*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2027*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
2028*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
2029*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
2030*1b3f573fSAndroid Build Coastguard Worker}
2031*1b3f573fSAndroid Build Coastguard Worker
2032*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2033*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self];
2034*1b3f573fSAndroid Build Coastguard Worker}
2035*1b3f573fSAndroid Build Coastguard Worker
2036*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2037*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
2038*1b3f573fSAndroid Build Coastguard Worker    return YES;
2039*1b3f573fSAndroid Build Coastguard Worker  }
2040*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32Int64Dictionary class]]) {
2041*1b3f573fSAndroid Build Coastguard Worker    return NO;
2042*1b3f573fSAndroid Build Coastguard Worker  }
2043*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32Int64Dictionary *otherDictionary = other;
2044*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2045*1b3f573fSAndroid Build Coastguard Worker}
2046*1b3f573fSAndroid Build Coastguard Worker
2047*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
2048*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2049*1b3f573fSAndroid Build Coastguard Worker}
2050*1b3f573fSAndroid Build Coastguard Worker
2051*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
2052*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2053*1b3f573fSAndroid Build Coastguard Worker}
2054*1b3f573fSAndroid Build Coastguard Worker
2055*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
2056*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2057*1b3f573fSAndroid Build Coastguard Worker}
2058*1b3f573fSAndroid Build Coastguard Worker
2059*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
2060*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int64_t value, BOOL *stop))block {
2061*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
2062*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2063*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2064*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2065*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2066*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2067*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue longLongValue], &stop);
2068*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
2069*1b3f573fSAndroid Build Coastguard Worker      break;
2070*1b3f573fSAndroid Build Coastguard Worker    }
2071*1b3f573fSAndroid Build Coastguard Worker  }
2072*1b3f573fSAndroid Build Coastguard Worker}
2073*1b3f573fSAndroid Build Coastguard Worker
2074*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2075*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2076*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2077*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
2078*1b3f573fSAndroid Build Coastguard Worker    return 0;
2079*1b3f573fSAndroid Build Coastguard Worker  }
2080*1b3f573fSAndroid Build Coastguard Worker
2081*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2082*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2083*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
2084*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2085*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2086*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2087*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2088*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2089*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
2090*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2091*1b3f573fSAndroid Build Coastguard Worker  }
2092*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2093*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
2094*1b3f573fSAndroid Build Coastguard Worker  return result;
2095*1b3f573fSAndroid Build Coastguard Worker}
2096*1b3f573fSAndroid Build Coastguard Worker
2097*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2098*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2099*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2100*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2101*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2102*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2103*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2104*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2105*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2106*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2107*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2108*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
2109*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2110*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
2111*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2112*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2113*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2114*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
2115*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2116*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2117*1b3f573fSAndroid Build Coastguard Worker  }
2118*1b3f573fSAndroid Build Coastguard Worker}
2119*1b3f573fSAndroid Build Coastguard Worker
2120*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2121*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2122*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt32)];
2123*1b3f573fSAndroid Build Coastguard Worker}
2124*1b3f573fSAndroid Build Coastguard Worker
2125*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2126*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(uint32_t key, int64_t value, BOOL *stop) {
2127*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
2128*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%lld", value]);
2129*1b3f573fSAndroid Build Coastguard Worker  }];
2130*1b3f573fSAndroid Build Coastguard Worker}
2131*1b3f573fSAndroid Build Coastguard Worker
2132*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint32_t)key {
2133*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2134*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
2135*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
2136*1b3f573fSAndroid Build Coastguard Worker  }
2137*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
2138*1b3f573fSAndroid Build Coastguard Worker}
2139*1b3f573fSAndroid Build Coastguard Worker
2140*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32Int64Dictionary *)otherDictionary {
2141*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
2142*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2143*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
2144*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2145*1b3f573fSAndroid Build Coastguard Worker    }
2146*1b3f573fSAndroid Build Coastguard Worker  }
2147*1b3f573fSAndroid Build Coastguard Worker}
2148*1b3f573fSAndroid Build Coastguard Worker
2149*1b3f573fSAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(uint32_t)key {
2150*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2151*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
2152*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2153*1b3f573fSAndroid Build Coastguard Worker  }
2154*1b3f573fSAndroid Build Coastguard Worker}
2155*1b3f573fSAndroid Build Coastguard Worker
2156*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt64ForKey:(uint32_t)aKey {
2157*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2158*1b3f573fSAndroid Build Coastguard Worker}
2159*1b3f573fSAndroid Build Coastguard Worker
2160*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
2161*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2162*1b3f573fSAndroid Build Coastguard Worker}
2163*1b3f573fSAndroid Build Coastguard Worker
2164*1b3f573fSAndroid Build Coastguard Worker@end
2165*1b3f573fSAndroid Build Coastguard Worker
2166*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> Bool
2167*1b3f573fSAndroid Build Coastguard Worker
2168*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32BoolDictionary {
2169*1b3f573fSAndroid Build Coastguard Worker @package
2170*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2171*1b3f573fSAndroid Build Coastguard Worker}
2172*1b3f573fSAndroid Build Coastguard Worker
2173*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
2174*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
2175*1b3f573fSAndroid Build Coastguard Worker}
2176*1b3f573fSAndroid Build Coastguard Worker
2177*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
2178*1b3f573fSAndroid Build Coastguard Worker                      forKeys:(const uint32_t [])keys
2179*1b3f573fSAndroid Build Coastguard Worker                        count:(NSUInteger)count {
2180*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
2181*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2182*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2183*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
2184*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2185*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2186*1b3f573fSAndroid Build Coastguard Worker      }
2187*1b3f573fSAndroid Build Coastguard Worker    }
2188*1b3f573fSAndroid Build Coastguard Worker  }
2189*1b3f573fSAndroid Build Coastguard Worker  return self;
2190*1b3f573fSAndroid Build Coastguard Worker}
2191*1b3f573fSAndroid Build Coastguard Worker
2192*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32BoolDictionary *)dictionary {
2193*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
2194*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2195*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
2196*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2197*1b3f573fSAndroid Build Coastguard Worker    }
2198*1b3f573fSAndroid Build Coastguard Worker  }
2199*1b3f573fSAndroid Build Coastguard Worker  return self;
2200*1b3f573fSAndroid Build Coastguard Worker}
2201*1b3f573fSAndroid Build Coastguard Worker
2202*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2203*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
2204*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
2205*1b3f573fSAndroid Build Coastguard Worker}
2206*1b3f573fSAndroid Build Coastguard Worker
2207*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
2208*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2209*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2210*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
2211*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
2212*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
2213*1b3f573fSAndroid Build Coastguard Worker}
2214*1b3f573fSAndroid Build Coastguard Worker
2215*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2216*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
2217*1b3f573fSAndroid Build Coastguard Worker}
2218*1b3f573fSAndroid Build Coastguard Worker
2219*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2220*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
2221*1b3f573fSAndroid Build Coastguard Worker    return YES;
2222*1b3f573fSAndroid Build Coastguard Worker  }
2223*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32BoolDictionary class]]) {
2224*1b3f573fSAndroid Build Coastguard Worker    return NO;
2225*1b3f573fSAndroid Build Coastguard Worker  }
2226*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32BoolDictionary *otherDictionary = other;
2227*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2228*1b3f573fSAndroid Build Coastguard Worker}
2229*1b3f573fSAndroid Build Coastguard Worker
2230*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
2231*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2232*1b3f573fSAndroid Build Coastguard Worker}
2233*1b3f573fSAndroid Build Coastguard Worker
2234*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
2235*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2236*1b3f573fSAndroid Build Coastguard Worker}
2237*1b3f573fSAndroid Build Coastguard Worker
2238*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
2239*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2240*1b3f573fSAndroid Build Coastguard Worker}
2241*1b3f573fSAndroid Build Coastguard Worker
2242*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
2243*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, BOOL value, BOOL *stop))block {
2244*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
2245*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2246*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2247*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2248*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2249*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2250*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue boolValue], &stop);
2251*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
2252*1b3f573fSAndroid Build Coastguard Worker      break;
2253*1b3f573fSAndroid Build Coastguard Worker    }
2254*1b3f573fSAndroid Build Coastguard Worker  }
2255*1b3f573fSAndroid Build Coastguard Worker}
2256*1b3f573fSAndroid Build Coastguard Worker
2257*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2258*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2259*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2260*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
2261*1b3f573fSAndroid Build Coastguard Worker    return 0;
2262*1b3f573fSAndroid Build Coastguard Worker  }
2263*1b3f573fSAndroid Build Coastguard Worker
2264*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2265*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2266*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
2267*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2268*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2269*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2270*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2271*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2272*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
2273*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2274*1b3f573fSAndroid Build Coastguard Worker  }
2275*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2276*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
2277*1b3f573fSAndroid Build Coastguard Worker  return result;
2278*1b3f573fSAndroid Build Coastguard Worker}
2279*1b3f573fSAndroid Build Coastguard Worker
2280*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2281*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2282*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2283*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2284*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2285*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2286*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2287*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2288*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2289*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2290*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2291*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
2292*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2293*1b3f573fSAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
2294*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2295*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2296*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2297*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
2298*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2299*1b3f573fSAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2300*1b3f573fSAndroid Build Coastguard Worker  }
2301*1b3f573fSAndroid Build Coastguard Worker}
2302*1b3f573fSAndroid Build Coastguard Worker
2303*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2304*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2305*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt32)];
2306*1b3f573fSAndroid Build Coastguard Worker}
2307*1b3f573fSAndroid Build Coastguard Worker
2308*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2309*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(uint32_t key, BOOL value, BOOL *stop) {
2310*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
2311*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], (value ? @"true" : @"false"));
2312*1b3f573fSAndroid Build Coastguard Worker  }];
2313*1b3f573fSAndroid Build Coastguard Worker}
2314*1b3f573fSAndroid Build Coastguard Worker
2315*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(uint32_t)key {
2316*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2317*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
2318*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped boolValue];
2319*1b3f573fSAndroid Build Coastguard Worker  }
2320*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
2321*1b3f573fSAndroid Build Coastguard Worker}
2322*1b3f573fSAndroid Build Coastguard Worker
2323*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32BoolDictionary *)otherDictionary {
2324*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
2325*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2326*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
2327*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2328*1b3f573fSAndroid Build Coastguard Worker    }
2329*1b3f573fSAndroid Build Coastguard Worker  }
2330*1b3f573fSAndroid Build Coastguard Worker}
2331*1b3f573fSAndroid Build Coastguard Worker
2332*1b3f573fSAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(uint32_t)key {
2333*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2334*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
2335*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2336*1b3f573fSAndroid Build Coastguard Worker  }
2337*1b3f573fSAndroid Build Coastguard Worker}
2338*1b3f573fSAndroid Build Coastguard Worker
2339*1b3f573fSAndroid Build Coastguard Worker- (void)removeBoolForKey:(uint32_t)aKey {
2340*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2341*1b3f573fSAndroid Build Coastguard Worker}
2342*1b3f573fSAndroid Build Coastguard Worker
2343*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
2344*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2345*1b3f573fSAndroid Build Coastguard Worker}
2346*1b3f573fSAndroid Build Coastguard Worker
2347*1b3f573fSAndroid Build Coastguard Worker@end
2348*1b3f573fSAndroid Build Coastguard Worker
2349*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> Float
2350*1b3f573fSAndroid Build Coastguard Worker
2351*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32FloatDictionary {
2352*1b3f573fSAndroid Build Coastguard Worker @package
2353*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2354*1b3f573fSAndroid Build Coastguard Worker}
2355*1b3f573fSAndroid Build Coastguard Worker
2356*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
2357*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
2358*1b3f573fSAndroid Build Coastguard Worker}
2359*1b3f573fSAndroid Build Coastguard Worker
2360*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
2361*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const uint32_t [])keys
2362*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
2363*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
2364*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2365*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2366*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
2367*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2368*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2369*1b3f573fSAndroid Build Coastguard Worker      }
2370*1b3f573fSAndroid Build Coastguard Worker    }
2371*1b3f573fSAndroid Build Coastguard Worker  }
2372*1b3f573fSAndroid Build Coastguard Worker  return self;
2373*1b3f573fSAndroid Build Coastguard Worker}
2374*1b3f573fSAndroid Build Coastguard Worker
2375*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32FloatDictionary *)dictionary {
2376*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
2377*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2378*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
2379*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2380*1b3f573fSAndroid Build Coastguard Worker    }
2381*1b3f573fSAndroid Build Coastguard Worker  }
2382*1b3f573fSAndroid Build Coastguard Worker  return self;
2383*1b3f573fSAndroid Build Coastguard Worker}
2384*1b3f573fSAndroid Build Coastguard Worker
2385*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2386*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
2387*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
2388*1b3f573fSAndroid Build Coastguard Worker}
2389*1b3f573fSAndroid Build Coastguard Worker
2390*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
2391*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2392*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2393*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
2394*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
2395*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
2396*1b3f573fSAndroid Build Coastguard Worker}
2397*1b3f573fSAndroid Build Coastguard Worker
2398*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2399*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32FloatDictionary allocWithZone:zone] initWithDictionary:self];
2400*1b3f573fSAndroid Build Coastguard Worker}
2401*1b3f573fSAndroid Build Coastguard Worker
2402*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2403*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
2404*1b3f573fSAndroid Build Coastguard Worker    return YES;
2405*1b3f573fSAndroid Build Coastguard Worker  }
2406*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32FloatDictionary class]]) {
2407*1b3f573fSAndroid Build Coastguard Worker    return NO;
2408*1b3f573fSAndroid Build Coastguard Worker  }
2409*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32FloatDictionary *otherDictionary = other;
2410*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2411*1b3f573fSAndroid Build Coastguard Worker}
2412*1b3f573fSAndroid Build Coastguard Worker
2413*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
2414*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2415*1b3f573fSAndroid Build Coastguard Worker}
2416*1b3f573fSAndroid Build Coastguard Worker
2417*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
2418*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2419*1b3f573fSAndroid Build Coastguard Worker}
2420*1b3f573fSAndroid Build Coastguard Worker
2421*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
2422*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2423*1b3f573fSAndroid Build Coastguard Worker}
2424*1b3f573fSAndroid Build Coastguard Worker
2425*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
2426*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, float value, BOOL *stop))block {
2427*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
2428*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2429*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2430*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2431*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2432*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2433*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue floatValue], &stop);
2434*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
2435*1b3f573fSAndroid Build Coastguard Worker      break;
2436*1b3f573fSAndroid Build Coastguard Worker    }
2437*1b3f573fSAndroid Build Coastguard Worker  }
2438*1b3f573fSAndroid Build Coastguard Worker}
2439*1b3f573fSAndroid Build Coastguard Worker
2440*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2441*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2442*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2443*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
2444*1b3f573fSAndroid Build Coastguard Worker    return 0;
2445*1b3f573fSAndroid Build Coastguard Worker  }
2446*1b3f573fSAndroid Build Coastguard Worker
2447*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2448*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2449*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
2450*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2451*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2452*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2453*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2454*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2455*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
2456*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2457*1b3f573fSAndroid Build Coastguard Worker  }
2458*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2459*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
2460*1b3f573fSAndroid Build Coastguard Worker  return result;
2461*1b3f573fSAndroid Build Coastguard Worker}
2462*1b3f573fSAndroid Build Coastguard Worker
2463*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2464*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2465*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2466*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2467*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2468*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2469*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2470*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2471*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2472*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2473*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2474*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
2475*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2476*1b3f573fSAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
2477*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2478*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2479*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2480*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
2481*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2482*1b3f573fSAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2483*1b3f573fSAndroid Build Coastguard Worker  }
2484*1b3f573fSAndroid Build Coastguard Worker}
2485*1b3f573fSAndroid Build Coastguard Worker
2486*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2487*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2488*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt32)];
2489*1b3f573fSAndroid Build Coastguard Worker}
2490*1b3f573fSAndroid Build Coastguard Worker
2491*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2492*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(uint32_t key, float value, BOOL *stop) {
2493*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
2494*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
2495*1b3f573fSAndroid Build Coastguard Worker  }];
2496*1b3f573fSAndroid Build Coastguard Worker}
2497*1b3f573fSAndroid Build Coastguard Worker
2498*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(uint32_t)key {
2499*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2500*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
2501*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped floatValue];
2502*1b3f573fSAndroid Build Coastguard Worker  }
2503*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
2504*1b3f573fSAndroid Build Coastguard Worker}
2505*1b3f573fSAndroid Build Coastguard Worker
2506*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32FloatDictionary *)otherDictionary {
2507*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
2508*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2509*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
2510*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2511*1b3f573fSAndroid Build Coastguard Worker    }
2512*1b3f573fSAndroid Build Coastguard Worker  }
2513*1b3f573fSAndroid Build Coastguard Worker}
2514*1b3f573fSAndroid Build Coastguard Worker
2515*1b3f573fSAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(uint32_t)key {
2516*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2517*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
2518*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2519*1b3f573fSAndroid Build Coastguard Worker  }
2520*1b3f573fSAndroid Build Coastguard Worker}
2521*1b3f573fSAndroid Build Coastguard Worker
2522*1b3f573fSAndroid Build Coastguard Worker- (void)removeFloatForKey:(uint32_t)aKey {
2523*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2524*1b3f573fSAndroid Build Coastguard Worker}
2525*1b3f573fSAndroid Build Coastguard Worker
2526*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
2527*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2528*1b3f573fSAndroid Build Coastguard Worker}
2529*1b3f573fSAndroid Build Coastguard Worker
2530*1b3f573fSAndroid Build Coastguard Worker@end
2531*1b3f573fSAndroid Build Coastguard Worker
2532*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> Double
2533*1b3f573fSAndroid Build Coastguard Worker
2534*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32DoubleDictionary {
2535*1b3f573fSAndroid Build Coastguard Worker @package
2536*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2537*1b3f573fSAndroid Build Coastguard Worker}
2538*1b3f573fSAndroid Build Coastguard Worker
2539*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
2540*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
2541*1b3f573fSAndroid Build Coastguard Worker}
2542*1b3f573fSAndroid Build Coastguard Worker
2543*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
2544*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
2545*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
2546*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
2547*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2548*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2549*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
2550*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2551*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2552*1b3f573fSAndroid Build Coastguard Worker      }
2553*1b3f573fSAndroid Build Coastguard Worker    }
2554*1b3f573fSAndroid Build Coastguard Worker  }
2555*1b3f573fSAndroid Build Coastguard Worker  return self;
2556*1b3f573fSAndroid Build Coastguard Worker}
2557*1b3f573fSAndroid Build Coastguard Worker
2558*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32DoubleDictionary *)dictionary {
2559*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
2560*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2561*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
2562*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2563*1b3f573fSAndroid Build Coastguard Worker    }
2564*1b3f573fSAndroid Build Coastguard Worker  }
2565*1b3f573fSAndroid Build Coastguard Worker  return self;
2566*1b3f573fSAndroid Build Coastguard Worker}
2567*1b3f573fSAndroid Build Coastguard Worker
2568*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
2569*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
2570*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
2571*1b3f573fSAndroid Build Coastguard Worker}
2572*1b3f573fSAndroid Build Coastguard Worker
2573*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
2574*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2575*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2576*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
2577*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
2578*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
2579*1b3f573fSAndroid Build Coastguard Worker}
2580*1b3f573fSAndroid Build Coastguard Worker
2581*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2582*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self];
2583*1b3f573fSAndroid Build Coastguard Worker}
2584*1b3f573fSAndroid Build Coastguard Worker
2585*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2586*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
2587*1b3f573fSAndroid Build Coastguard Worker    return YES;
2588*1b3f573fSAndroid Build Coastguard Worker  }
2589*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32DoubleDictionary class]]) {
2590*1b3f573fSAndroid Build Coastguard Worker    return NO;
2591*1b3f573fSAndroid Build Coastguard Worker  }
2592*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32DoubleDictionary *otherDictionary = other;
2593*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2594*1b3f573fSAndroid Build Coastguard Worker}
2595*1b3f573fSAndroid Build Coastguard Worker
2596*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
2597*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2598*1b3f573fSAndroid Build Coastguard Worker}
2599*1b3f573fSAndroid Build Coastguard Worker
2600*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
2601*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2602*1b3f573fSAndroid Build Coastguard Worker}
2603*1b3f573fSAndroid Build Coastguard Worker
2604*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
2605*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2606*1b3f573fSAndroid Build Coastguard Worker}
2607*1b3f573fSAndroid Build Coastguard Worker
2608*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
2609*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, double value, BOOL *stop))block {
2610*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
2611*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2612*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2613*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2614*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2615*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2616*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue doubleValue], &stop);
2617*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
2618*1b3f573fSAndroid Build Coastguard Worker      break;
2619*1b3f573fSAndroid Build Coastguard Worker    }
2620*1b3f573fSAndroid Build Coastguard Worker  }
2621*1b3f573fSAndroid Build Coastguard Worker}
2622*1b3f573fSAndroid Build Coastguard Worker
2623*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2624*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2625*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2626*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
2627*1b3f573fSAndroid Build Coastguard Worker    return 0;
2628*1b3f573fSAndroid Build Coastguard Worker  }
2629*1b3f573fSAndroid Build Coastguard Worker
2630*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2631*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2632*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
2633*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2634*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2635*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2636*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2637*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2638*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
2639*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2640*1b3f573fSAndroid Build Coastguard Worker  }
2641*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2642*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
2643*1b3f573fSAndroid Build Coastguard Worker  return result;
2644*1b3f573fSAndroid Build Coastguard Worker}
2645*1b3f573fSAndroid Build Coastguard Worker
2646*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2647*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2648*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2649*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2650*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2651*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2652*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2653*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2654*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2655*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2656*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2657*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
2658*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2659*1b3f573fSAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
2660*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2661*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2662*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2663*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
2664*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2665*1b3f573fSAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2666*1b3f573fSAndroid Build Coastguard Worker  }
2667*1b3f573fSAndroid Build Coastguard Worker}
2668*1b3f573fSAndroid Build Coastguard Worker
2669*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2670*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2671*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt32)];
2672*1b3f573fSAndroid Build Coastguard Worker}
2673*1b3f573fSAndroid Build Coastguard Worker
2674*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2675*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(uint32_t key, double value, BOOL *stop) {
2676*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
2677*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
2678*1b3f573fSAndroid Build Coastguard Worker  }];
2679*1b3f573fSAndroid Build Coastguard Worker}
2680*1b3f573fSAndroid Build Coastguard Worker
2681*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(uint32_t)key {
2682*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2683*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
2684*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
2685*1b3f573fSAndroid Build Coastguard Worker  }
2686*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
2687*1b3f573fSAndroid Build Coastguard Worker}
2688*1b3f573fSAndroid Build Coastguard Worker
2689*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32DoubleDictionary *)otherDictionary {
2690*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
2691*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2692*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
2693*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2694*1b3f573fSAndroid Build Coastguard Worker    }
2695*1b3f573fSAndroid Build Coastguard Worker  }
2696*1b3f573fSAndroid Build Coastguard Worker}
2697*1b3f573fSAndroid Build Coastguard Worker
2698*1b3f573fSAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(uint32_t)key {
2699*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2700*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
2701*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2702*1b3f573fSAndroid Build Coastguard Worker  }
2703*1b3f573fSAndroid Build Coastguard Worker}
2704*1b3f573fSAndroid Build Coastguard Worker
2705*1b3f573fSAndroid Build Coastguard Worker- (void)removeDoubleForKey:(uint32_t)aKey {
2706*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2707*1b3f573fSAndroid Build Coastguard Worker}
2708*1b3f573fSAndroid Build Coastguard Worker
2709*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
2710*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2711*1b3f573fSAndroid Build Coastguard Worker}
2712*1b3f573fSAndroid Build Coastguard Worker
2713*1b3f573fSAndroid Build Coastguard Worker@end
2714*1b3f573fSAndroid Build Coastguard Worker
2715*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> Enum
2716*1b3f573fSAndroid Build Coastguard Worker
2717*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32EnumDictionary {
2718*1b3f573fSAndroid Build Coastguard Worker @package
2719*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2720*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
2721*1b3f573fSAndroid Build Coastguard Worker}
2722*1b3f573fSAndroid Build Coastguard Worker
2723*1b3f573fSAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
2724*1b3f573fSAndroid Build Coastguard Worker
2725*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
2726*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
2727*1b3f573fSAndroid Build Coastguard Worker}
2728*1b3f573fSAndroid Build Coastguard Worker
2729*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
2730*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
2731*1b3f573fSAndroid Build Coastguard Worker}
2732*1b3f573fSAndroid Build Coastguard Worker
2733*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
2734*1b3f573fSAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
2735*1b3f573fSAndroid Build Coastguard Worker                                   forKeys:(const uint32_t [])keys
2736*1b3f573fSAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
2737*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
2738*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2739*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2740*1b3f573fSAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
2741*1b3f573fSAndroid Build Coastguard Worker    if (count && rawValues && keys) {
2742*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2743*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
2744*1b3f573fSAndroid Build Coastguard Worker      }
2745*1b3f573fSAndroid Build Coastguard Worker    }
2746*1b3f573fSAndroid Build Coastguard Worker  }
2747*1b3f573fSAndroid Build Coastguard Worker  return self;
2748*1b3f573fSAndroid Build Coastguard Worker}
2749*1b3f573fSAndroid Build Coastguard Worker
2750*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32EnumDictionary *)dictionary {
2751*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
2752*1b3f573fSAndroid Build Coastguard Worker                                rawValues:NULL
2753*1b3f573fSAndroid Build Coastguard Worker                                  forKeys:NULL
2754*1b3f573fSAndroid Build Coastguard Worker                                    count:0];
2755*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2756*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
2757*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2758*1b3f573fSAndroid Build Coastguard Worker    }
2759*1b3f573fSAndroid Build Coastguard Worker  }
2760*1b3f573fSAndroid Build Coastguard Worker  return self;
2761*1b3f573fSAndroid Build Coastguard Worker}
2762*1b3f573fSAndroid Build Coastguard Worker
2763*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
2764*1b3f573fSAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
2765*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
2766*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
2767*1b3f573fSAndroid Build Coastguard Worker}
2768*1b3f573fSAndroid Build Coastguard Worker
2769*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
2770*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
2771*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
2772*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
2773*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
2774*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
2775*1b3f573fSAndroid Build Coastguard Worker}
2776*1b3f573fSAndroid Build Coastguard Worker
2777*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
2778*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
2779*1b3f573fSAndroid Build Coastguard Worker}
2780*1b3f573fSAndroid Build Coastguard Worker
2781*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
2782*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
2783*1b3f573fSAndroid Build Coastguard Worker    return YES;
2784*1b3f573fSAndroid Build Coastguard Worker  }
2785*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32EnumDictionary class]]) {
2786*1b3f573fSAndroid Build Coastguard Worker    return NO;
2787*1b3f573fSAndroid Build Coastguard Worker  }
2788*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32EnumDictionary *otherDictionary = other;
2789*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
2790*1b3f573fSAndroid Build Coastguard Worker}
2791*1b3f573fSAndroid Build Coastguard Worker
2792*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
2793*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2794*1b3f573fSAndroid Build Coastguard Worker}
2795*1b3f573fSAndroid Build Coastguard Worker
2796*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
2797*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
2798*1b3f573fSAndroid Build Coastguard Worker}
2799*1b3f573fSAndroid Build Coastguard Worker
2800*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
2801*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
2802*1b3f573fSAndroid Build Coastguard Worker}
2803*1b3f573fSAndroid Build Coastguard Worker
2804*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
2805*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block {
2806*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
2807*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2808*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2809*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2810*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2811*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2812*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], [aValue intValue], &stop);
2813*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
2814*1b3f573fSAndroid Build Coastguard Worker      break;
2815*1b3f573fSAndroid Build Coastguard Worker    }
2816*1b3f573fSAndroid Build Coastguard Worker  }
2817*1b3f573fSAndroid Build Coastguard Worker}
2818*1b3f573fSAndroid Build Coastguard Worker
2819*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2820*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2821*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
2822*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
2823*1b3f573fSAndroid Build Coastguard Worker    return 0;
2824*1b3f573fSAndroid Build Coastguard Worker  }
2825*1b3f573fSAndroid Build Coastguard Worker
2826*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2827*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2828*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
2829*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2830*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2831*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2832*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2833*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
2834*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
2835*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2836*1b3f573fSAndroid Build Coastguard Worker  }
2837*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
2838*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
2839*1b3f573fSAndroid Build Coastguard Worker  return result;
2840*1b3f573fSAndroid Build Coastguard Worker}
2841*1b3f573fSAndroid Build Coastguard Worker
2842*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2843*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
2844*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
2845*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
2846*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
2847*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
2848*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
2849*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2850*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2851*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
2852*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
2853*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
2854*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
2855*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
2856*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
2857*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
2858*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
2859*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
2860*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
2861*1b3f573fSAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
2862*1b3f573fSAndroid Build Coastguard Worker  }
2863*1b3f573fSAndroid Build Coastguard Worker}
2864*1b3f573fSAndroid Build Coastguard Worker
2865*1b3f573fSAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
2866*1b3f573fSAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
2867*1b3f573fSAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
2868*1b3f573fSAndroid Build Coastguard Worker  size_t msgSize = ComputeDictUInt32FieldSize(key->valueUInt32, kMapKeyFieldNumber, keyDataType);
2869*1b3f573fSAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
2870*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
2871*1b3f573fSAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
2872*1b3f573fSAndroid Build Coastguard Worker  WriteDictUInt32Field(outputStream, key->valueUInt32, kMapKeyFieldNumber, keyDataType);
2873*1b3f573fSAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
2874*1b3f573fSAndroid Build Coastguard Worker  [outputStream release];
2875*1b3f573fSAndroid Build Coastguard Worker  return data;
2876*1b3f573fSAndroid Build Coastguard Worker}
2877*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
2878*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
2879*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt32)];
2880*1b3f573fSAndroid Build Coastguard Worker}
2881*1b3f573fSAndroid Build Coastguard Worker
2882*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
2883*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
2884*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
2885*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], @(value));
2886*1b3f573fSAndroid Build Coastguard Worker  }];
2887*1b3f573fSAndroid Build Coastguard Worker}
2888*1b3f573fSAndroid Build Coastguard Worker
2889*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(uint32_t)key {
2890*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2891*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
2892*1b3f573fSAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
2893*1b3f573fSAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
2894*1b3f573fSAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
2895*1b3f573fSAndroid Build Coastguard Worker    }
2896*1b3f573fSAndroid Build Coastguard Worker    *value = result;
2897*1b3f573fSAndroid Build Coastguard Worker  }
2898*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
2899*1b3f573fSAndroid Build Coastguard Worker}
2900*1b3f573fSAndroid Build Coastguard Worker
2901*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint32_t)key {
2902*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2903*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && rawValue) {
2904*1b3f573fSAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
2905*1b3f573fSAndroid Build Coastguard Worker  }
2906*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
2907*1b3f573fSAndroid Build Coastguard Worker}
2908*1b3f573fSAndroid Build Coastguard Worker
2909*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
2910*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block {
2911*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
2912*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
2913*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
2914*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
2915*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
2916*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
2917*1b3f573fSAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
2918*1b3f573fSAndroid Build Coastguard Worker      if (!func(unwrapped)) {
2919*1b3f573fSAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
2920*1b3f573fSAndroid Build Coastguard Worker      }
2921*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], unwrapped, &stop);
2922*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
2923*1b3f573fSAndroid Build Coastguard Worker      break;
2924*1b3f573fSAndroid Build Coastguard Worker    }
2925*1b3f573fSAndroid Build Coastguard Worker  }
2926*1b3f573fSAndroid Build Coastguard Worker}
2927*1b3f573fSAndroid Build Coastguard Worker
2928*1b3f573fSAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBUInt32EnumDictionary *)otherDictionary {
2929*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
2930*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2931*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
2932*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
2933*1b3f573fSAndroid Build Coastguard Worker    }
2934*1b3f573fSAndroid Build Coastguard Worker  }
2935*1b3f573fSAndroid Build Coastguard Worker}
2936*1b3f573fSAndroid Build Coastguard Worker
2937*1b3f573fSAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(uint32_t)key {
2938*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2939*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
2940*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2941*1b3f573fSAndroid Build Coastguard Worker  }
2942*1b3f573fSAndroid Build Coastguard Worker}
2943*1b3f573fSAndroid Build Coastguard Worker
2944*1b3f573fSAndroid Build Coastguard Worker- (void)removeEnumForKey:(uint32_t)aKey {
2945*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
2946*1b3f573fSAndroid Build Coastguard Worker}
2947*1b3f573fSAndroid Build Coastguard Worker
2948*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
2949*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
2950*1b3f573fSAndroid Build Coastguard Worker}
2951*1b3f573fSAndroid Build Coastguard Worker
2952*1b3f573fSAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(uint32_t)key {
2953*1b3f573fSAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
2954*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
2955*1b3f573fSAndroid Build Coastguard Worker                format:@"GPBUInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
2956*1b3f573fSAndroid Build Coastguard Worker                       value];
2957*1b3f573fSAndroid Build Coastguard Worker  }
2958*1b3f573fSAndroid Build Coastguard Worker
2959*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
2960*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
2961*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
2962*1b3f573fSAndroid Build Coastguard Worker  }
2963*1b3f573fSAndroid Build Coastguard Worker}
2964*1b3f573fSAndroid Build Coastguard Worker
2965*1b3f573fSAndroid Build Coastguard Worker@end
2966*1b3f573fSAndroid Build Coastguard Worker
2967*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 -> Object
2968*1b3f573fSAndroid Build Coastguard Worker
2969*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32ObjectDictionary {
2970*1b3f573fSAndroid Build Coastguard Worker @package
2971*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
2972*1b3f573fSAndroid Build Coastguard Worker}
2973*1b3f573fSAndroid Build Coastguard Worker
2974*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
2975*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
2976*1b3f573fSAndroid Build Coastguard Worker}
2977*1b3f573fSAndroid Build Coastguard Worker
2978*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
2979*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint32_t [])keys
2980*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
2981*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
2982*1b3f573fSAndroid Build Coastguard Worker  if (self) {
2983*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
2984*1b3f573fSAndroid Build Coastguard Worker    if (count && objects && keys) {
2985*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
2986*1b3f573fSAndroid Build Coastguard Worker        if (!objects[i]) {
2987*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
2988*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
2989*1b3f573fSAndroid Build Coastguard Worker        }
2990*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
2991*1b3f573fSAndroid Build Coastguard Worker      }
2992*1b3f573fSAndroid Build Coastguard Worker    }
2993*1b3f573fSAndroid Build Coastguard Worker  }
2994*1b3f573fSAndroid Build Coastguard Worker  return self;
2995*1b3f573fSAndroid Build Coastguard Worker}
2996*1b3f573fSAndroid Build Coastguard Worker
2997*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32ObjectDictionary *)dictionary {
2998*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
2999*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3000*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
3001*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3002*1b3f573fSAndroid Build Coastguard Worker    }
3003*1b3f573fSAndroid Build Coastguard Worker  }
3004*1b3f573fSAndroid Build Coastguard Worker  return self;
3005*1b3f573fSAndroid Build Coastguard Worker}
3006*1b3f573fSAndroid Build Coastguard Worker
3007*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3008*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
3009*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
3010*1b3f573fSAndroid Build Coastguard Worker}
3011*1b3f573fSAndroid Build Coastguard Worker
3012*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
3013*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3014*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3015*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
3016*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
3017*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
3018*1b3f573fSAndroid Build Coastguard Worker}
3019*1b3f573fSAndroid Build Coastguard Worker
3020*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3021*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self];
3022*1b3f573fSAndroid Build Coastguard Worker}
3023*1b3f573fSAndroid Build Coastguard Worker
3024*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3025*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
3026*1b3f573fSAndroid Build Coastguard Worker    return YES;
3027*1b3f573fSAndroid Build Coastguard Worker  }
3028*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt32ObjectDictionary class]]) {
3029*1b3f573fSAndroid Build Coastguard Worker    return NO;
3030*1b3f573fSAndroid Build Coastguard Worker  }
3031*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32ObjectDictionary *otherDictionary = other;
3032*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3033*1b3f573fSAndroid Build Coastguard Worker}
3034*1b3f573fSAndroid Build Coastguard Worker
3035*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
3036*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3037*1b3f573fSAndroid Build Coastguard Worker}
3038*1b3f573fSAndroid Build Coastguard Worker
3039*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
3040*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3041*1b3f573fSAndroid Build Coastguard Worker}
3042*1b3f573fSAndroid Build Coastguard Worker
3043*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
3044*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3045*1b3f573fSAndroid Build Coastguard Worker}
3046*1b3f573fSAndroid Build Coastguard Worker
3047*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
3048*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint32_t key, id object, BOOL *stop))block {
3049*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
3050*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3051*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3052*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3053*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3054*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
3055*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedIntValue], aObject, &stop);
3056*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
3057*1b3f573fSAndroid Build Coastguard Worker      break;
3058*1b3f573fSAndroid Build Coastguard Worker    }
3059*1b3f573fSAndroid Build Coastguard Worker  }
3060*1b3f573fSAndroid Build Coastguard Worker}
3061*1b3f573fSAndroid Build Coastguard Worker
3062*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isInitialized {
3063*1b3f573fSAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
3064*1b3f573fSAndroid Build Coastguard Worker    if (!msg.initialized) {
3065*1b3f573fSAndroid Build Coastguard Worker      return NO;
3066*1b3f573fSAndroid Build Coastguard Worker    }
3067*1b3f573fSAndroid Build Coastguard Worker  }
3068*1b3f573fSAndroid Build Coastguard Worker  return YES;
3069*1b3f573fSAndroid Build Coastguard Worker}
3070*1b3f573fSAndroid Build Coastguard Worker
3071*1b3f573fSAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
3072*1b3f573fSAndroid Build Coastguard Worker  GPBUInt32ObjectDictionary *newDict =
3073*1b3f573fSAndroid Build Coastguard Worker      [[GPBUInt32ObjectDictionary alloc] init];
3074*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
3075*1b3f573fSAndroid Build Coastguard Worker  id aKey;
3076*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
3077*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3078*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
3079*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
3080*1b3f573fSAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
3081*1b3f573fSAndroid Build Coastguard Worker    [copiedMsg release];
3082*1b3f573fSAndroid Build Coastguard Worker  }
3083*1b3f573fSAndroid Build Coastguard Worker  return newDict;
3084*1b3f573fSAndroid Build Coastguard Worker}
3085*1b3f573fSAndroid Build Coastguard Worker
3086*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3087*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3088*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3089*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
3090*1b3f573fSAndroid Build Coastguard Worker    return 0;
3091*1b3f573fSAndroid Build Coastguard Worker  }
3092*1b3f573fSAndroid Build Coastguard Worker
3093*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3094*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3095*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
3096*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3097*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3098*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3099*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
3100*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
3101*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
3102*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3103*1b3f573fSAndroid Build Coastguard Worker  }
3104*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3105*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
3106*1b3f573fSAndroid Build Coastguard Worker  return result;
3107*1b3f573fSAndroid Build Coastguard Worker}
3108*1b3f573fSAndroid Build Coastguard Worker
3109*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3110*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3111*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3112*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3113*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3114*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3115*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3116*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3117*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3118*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
3119*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3120*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
3121*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedKey = [aKey unsignedIntValue];
3122*1b3f573fSAndroid Build Coastguard Worker    id unwrappedValue = aObject;
3123*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3124*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3125*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3126*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
3127*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3128*1b3f573fSAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3129*1b3f573fSAndroid Build Coastguard Worker  }
3130*1b3f573fSAndroid Build Coastguard Worker}
3131*1b3f573fSAndroid Build Coastguard Worker
3132*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3133*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3134*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueUInt32)];
3135*1b3f573fSAndroid Build Coastguard Worker}
3136*1b3f573fSAndroid Build Coastguard Worker
3137*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3138*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(uint32_t key, id object, BOOL *stop) {
3139*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
3140*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%u", key], object);
3141*1b3f573fSAndroid Build Coastguard Worker  }];
3142*1b3f573fSAndroid Build Coastguard Worker}
3143*1b3f573fSAndroid Build Coastguard Worker
3144*1b3f573fSAndroid Build Coastguard Worker- (id)objectForKey:(uint32_t)key {
3145*1b3f573fSAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
3146*1b3f573fSAndroid Build Coastguard Worker  return result;
3147*1b3f573fSAndroid Build Coastguard Worker}
3148*1b3f573fSAndroid Build Coastguard Worker
3149*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32ObjectDictionary *)otherDictionary {
3150*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
3151*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3152*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
3153*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3154*1b3f573fSAndroid Build Coastguard Worker    }
3155*1b3f573fSAndroid Build Coastguard Worker  }
3156*1b3f573fSAndroid Build Coastguard Worker}
3157*1b3f573fSAndroid Build Coastguard Worker
3158*1b3f573fSAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(uint32_t)key {
3159*1b3f573fSAndroid Build Coastguard Worker  if (!object) {
3160*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
3161*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
3162*1b3f573fSAndroid Build Coastguard Worker  }
3163*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
3164*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
3165*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3166*1b3f573fSAndroid Build Coastguard Worker  }
3167*1b3f573fSAndroid Build Coastguard Worker}
3168*1b3f573fSAndroid Build Coastguard Worker
3169*1b3f573fSAndroid Build Coastguard Worker- (void)removeObjectForKey:(uint32_t)aKey {
3170*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3171*1b3f573fSAndroid Build Coastguard Worker}
3172*1b3f573fSAndroid Build Coastguard Worker
3173*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
3174*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3175*1b3f573fSAndroid Build Coastguard Worker}
3176*1b3f573fSAndroid Build Coastguard Worker
3177*1b3f573fSAndroid Build Coastguard Worker@end
3178*1b3f573fSAndroid Build Coastguard Worker
3179*1b3f573fSAndroid Build Coastguard Worker// clang-format on
3180*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int32, int32_t)
3181*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
3182*1b3f573fSAndroid Build Coastguard Worker// clang-format off
3183*1b3f573fSAndroid Build Coastguard Worker
3184*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> UInt32
3185*1b3f573fSAndroid Build Coastguard Worker
3186*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32UInt32Dictionary {
3187*1b3f573fSAndroid Build Coastguard Worker @package
3188*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3189*1b3f573fSAndroid Build Coastguard Worker}
3190*1b3f573fSAndroid Build Coastguard Worker
3191*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
3192*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
3193*1b3f573fSAndroid Build Coastguard Worker}
3194*1b3f573fSAndroid Build Coastguard Worker
3195*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
3196*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
3197*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
3198*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
3199*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3200*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3201*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
3202*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3203*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3204*1b3f573fSAndroid Build Coastguard Worker      }
3205*1b3f573fSAndroid Build Coastguard Worker    }
3206*1b3f573fSAndroid Build Coastguard Worker  }
3207*1b3f573fSAndroid Build Coastguard Worker  return self;
3208*1b3f573fSAndroid Build Coastguard Worker}
3209*1b3f573fSAndroid Build Coastguard Worker
3210*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32UInt32Dictionary *)dictionary {
3211*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
3212*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3213*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
3214*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3215*1b3f573fSAndroid Build Coastguard Worker    }
3216*1b3f573fSAndroid Build Coastguard Worker  }
3217*1b3f573fSAndroid Build Coastguard Worker  return self;
3218*1b3f573fSAndroid Build Coastguard Worker}
3219*1b3f573fSAndroid Build Coastguard Worker
3220*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3221*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
3222*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
3223*1b3f573fSAndroid Build Coastguard Worker}
3224*1b3f573fSAndroid Build Coastguard Worker
3225*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
3226*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3227*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3228*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
3229*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
3230*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
3231*1b3f573fSAndroid Build Coastguard Worker}
3232*1b3f573fSAndroid Build Coastguard Worker
3233*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3234*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
3235*1b3f573fSAndroid Build Coastguard Worker}
3236*1b3f573fSAndroid Build Coastguard Worker
3237*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3238*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
3239*1b3f573fSAndroid Build Coastguard Worker    return YES;
3240*1b3f573fSAndroid Build Coastguard Worker  }
3241*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32UInt32Dictionary class]]) {
3242*1b3f573fSAndroid Build Coastguard Worker    return NO;
3243*1b3f573fSAndroid Build Coastguard Worker  }
3244*1b3f573fSAndroid Build Coastguard Worker  GPBInt32UInt32Dictionary *otherDictionary = other;
3245*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3246*1b3f573fSAndroid Build Coastguard Worker}
3247*1b3f573fSAndroid Build Coastguard Worker
3248*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
3249*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3250*1b3f573fSAndroid Build Coastguard Worker}
3251*1b3f573fSAndroid Build Coastguard Worker
3252*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
3253*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3254*1b3f573fSAndroid Build Coastguard Worker}
3255*1b3f573fSAndroid Build Coastguard Worker
3256*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
3257*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3258*1b3f573fSAndroid Build Coastguard Worker}
3259*1b3f573fSAndroid Build Coastguard Worker
3260*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
3261*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, uint32_t value, BOOL *stop))block {
3262*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
3263*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3264*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3265*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3266*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3267*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3268*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue unsignedIntValue], &stop);
3269*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
3270*1b3f573fSAndroid Build Coastguard Worker      break;
3271*1b3f573fSAndroid Build Coastguard Worker    }
3272*1b3f573fSAndroid Build Coastguard Worker  }
3273*1b3f573fSAndroid Build Coastguard Worker}
3274*1b3f573fSAndroid Build Coastguard Worker
3275*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3276*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3277*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3278*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
3279*1b3f573fSAndroid Build Coastguard Worker    return 0;
3280*1b3f573fSAndroid Build Coastguard Worker  }
3281*1b3f573fSAndroid Build Coastguard Worker
3282*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3283*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3284*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
3285*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3286*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3287*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3288*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3289*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3290*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
3291*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3292*1b3f573fSAndroid Build Coastguard Worker  }
3293*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3294*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
3295*1b3f573fSAndroid Build Coastguard Worker  return result;
3296*1b3f573fSAndroid Build Coastguard Worker}
3297*1b3f573fSAndroid Build Coastguard Worker
3298*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3299*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3300*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3301*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3302*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3303*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3304*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3305*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3306*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3307*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3308*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3309*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
3310*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3311*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
3312*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3313*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3314*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3315*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
3316*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3317*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3318*1b3f573fSAndroid Build Coastguard Worker  }
3319*1b3f573fSAndroid Build Coastguard Worker}
3320*1b3f573fSAndroid Build Coastguard Worker
3321*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3322*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3323*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt32)];
3324*1b3f573fSAndroid Build Coastguard Worker}
3325*1b3f573fSAndroid Build Coastguard Worker
3326*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3327*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(int32_t key, uint32_t value, BOOL *stop) {
3328*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
3329*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%u", value]);
3330*1b3f573fSAndroid Build Coastguard Worker  }];
3331*1b3f573fSAndroid Build Coastguard Worker}
3332*1b3f573fSAndroid Build Coastguard Worker
3333*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int32_t)key {
3334*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3335*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
3336*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
3337*1b3f573fSAndroid Build Coastguard Worker  }
3338*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
3339*1b3f573fSAndroid Build Coastguard Worker}
3340*1b3f573fSAndroid Build Coastguard Worker
3341*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32UInt32Dictionary *)otherDictionary {
3342*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
3343*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3344*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
3345*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3346*1b3f573fSAndroid Build Coastguard Worker    }
3347*1b3f573fSAndroid Build Coastguard Worker  }
3348*1b3f573fSAndroid Build Coastguard Worker}
3349*1b3f573fSAndroid Build Coastguard Worker
3350*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(int32_t)key {
3351*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3352*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
3353*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3354*1b3f573fSAndroid Build Coastguard Worker  }
3355*1b3f573fSAndroid Build Coastguard Worker}
3356*1b3f573fSAndroid Build Coastguard Worker
3357*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(int32_t)aKey {
3358*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3359*1b3f573fSAndroid Build Coastguard Worker}
3360*1b3f573fSAndroid Build Coastguard Worker
3361*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
3362*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3363*1b3f573fSAndroid Build Coastguard Worker}
3364*1b3f573fSAndroid Build Coastguard Worker
3365*1b3f573fSAndroid Build Coastguard Worker@end
3366*1b3f573fSAndroid Build Coastguard Worker
3367*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> Int32
3368*1b3f573fSAndroid Build Coastguard Worker
3369*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32Int32Dictionary {
3370*1b3f573fSAndroid Build Coastguard Worker @package
3371*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3372*1b3f573fSAndroid Build Coastguard Worker}
3373*1b3f573fSAndroid Build Coastguard Worker
3374*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
3375*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
3376*1b3f573fSAndroid Build Coastguard Worker}
3377*1b3f573fSAndroid Build Coastguard Worker
3378*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
3379*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const int32_t [])keys
3380*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
3381*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
3382*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3383*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3384*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
3385*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3386*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3387*1b3f573fSAndroid Build Coastguard Worker      }
3388*1b3f573fSAndroid Build Coastguard Worker    }
3389*1b3f573fSAndroid Build Coastguard Worker  }
3390*1b3f573fSAndroid Build Coastguard Worker  return self;
3391*1b3f573fSAndroid Build Coastguard Worker}
3392*1b3f573fSAndroid Build Coastguard Worker
3393*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32Int32Dictionary *)dictionary {
3394*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
3395*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3396*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
3397*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3398*1b3f573fSAndroid Build Coastguard Worker    }
3399*1b3f573fSAndroid Build Coastguard Worker  }
3400*1b3f573fSAndroid Build Coastguard Worker  return self;
3401*1b3f573fSAndroid Build Coastguard Worker}
3402*1b3f573fSAndroid Build Coastguard Worker
3403*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3404*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
3405*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
3406*1b3f573fSAndroid Build Coastguard Worker}
3407*1b3f573fSAndroid Build Coastguard Worker
3408*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
3409*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3410*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3411*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
3412*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
3413*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
3414*1b3f573fSAndroid Build Coastguard Worker}
3415*1b3f573fSAndroid Build Coastguard Worker
3416*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3417*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self];
3418*1b3f573fSAndroid Build Coastguard Worker}
3419*1b3f573fSAndroid Build Coastguard Worker
3420*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3421*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
3422*1b3f573fSAndroid Build Coastguard Worker    return YES;
3423*1b3f573fSAndroid Build Coastguard Worker  }
3424*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32Int32Dictionary class]]) {
3425*1b3f573fSAndroid Build Coastguard Worker    return NO;
3426*1b3f573fSAndroid Build Coastguard Worker  }
3427*1b3f573fSAndroid Build Coastguard Worker  GPBInt32Int32Dictionary *otherDictionary = other;
3428*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3429*1b3f573fSAndroid Build Coastguard Worker}
3430*1b3f573fSAndroid Build Coastguard Worker
3431*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
3432*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3433*1b3f573fSAndroid Build Coastguard Worker}
3434*1b3f573fSAndroid Build Coastguard Worker
3435*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
3436*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3437*1b3f573fSAndroid Build Coastguard Worker}
3438*1b3f573fSAndroid Build Coastguard Worker
3439*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
3440*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3441*1b3f573fSAndroid Build Coastguard Worker}
3442*1b3f573fSAndroid Build Coastguard Worker
3443*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
3444*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block {
3445*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
3446*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3447*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3448*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3449*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3450*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3451*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue intValue], &stop);
3452*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
3453*1b3f573fSAndroid Build Coastguard Worker      break;
3454*1b3f573fSAndroid Build Coastguard Worker    }
3455*1b3f573fSAndroid Build Coastguard Worker  }
3456*1b3f573fSAndroid Build Coastguard Worker}
3457*1b3f573fSAndroid Build Coastguard Worker
3458*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3459*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3460*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3461*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
3462*1b3f573fSAndroid Build Coastguard Worker    return 0;
3463*1b3f573fSAndroid Build Coastguard Worker  }
3464*1b3f573fSAndroid Build Coastguard Worker
3465*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3466*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3467*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
3468*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3469*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3470*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3471*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3472*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3473*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
3474*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3475*1b3f573fSAndroid Build Coastguard Worker  }
3476*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3477*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
3478*1b3f573fSAndroid Build Coastguard Worker  return result;
3479*1b3f573fSAndroid Build Coastguard Worker}
3480*1b3f573fSAndroid Build Coastguard Worker
3481*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3482*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3483*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3484*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3485*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3486*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3487*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3488*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3489*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3490*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3491*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3492*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
3493*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3494*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
3495*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3496*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3497*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3498*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
3499*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3500*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3501*1b3f573fSAndroid Build Coastguard Worker  }
3502*1b3f573fSAndroid Build Coastguard Worker}
3503*1b3f573fSAndroid Build Coastguard Worker
3504*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3505*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3506*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt32)];
3507*1b3f573fSAndroid Build Coastguard Worker}
3508*1b3f573fSAndroid Build Coastguard Worker
3509*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3510*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
3511*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
3512*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%d", value]);
3513*1b3f573fSAndroid Build Coastguard Worker  }];
3514*1b3f573fSAndroid Build Coastguard Worker}
3515*1b3f573fSAndroid Build Coastguard Worker
3516*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(int32_t)key {
3517*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3518*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
3519*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped intValue];
3520*1b3f573fSAndroid Build Coastguard Worker  }
3521*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
3522*1b3f573fSAndroid Build Coastguard Worker}
3523*1b3f573fSAndroid Build Coastguard Worker
3524*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32Int32Dictionary *)otherDictionary {
3525*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
3526*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3527*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
3528*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3529*1b3f573fSAndroid Build Coastguard Worker    }
3530*1b3f573fSAndroid Build Coastguard Worker  }
3531*1b3f573fSAndroid Build Coastguard Worker}
3532*1b3f573fSAndroid Build Coastguard Worker
3533*1b3f573fSAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(int32_t)key {
3534*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3535*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
3536*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3537*1b3f573fSAndroid Build Coastguard Worker  }
3538*1b3f573fSAndroid Build Coastguard Worker}
3539*1b3f573fSAndroid Build Coastguard Worker
3540*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt32ForKey:(int32_t)aKey {
3541*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3542*1b3f573fSAndroid Build Coastguard Worker}
3543*1b3f573fSAndroid Build Coastguard Worker
3544*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
3545*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3546*1b3f573fSAndroid Build Coastguard Worker}
3547*1b3f573fSAndroid Build Coastguard Worker
3548*1b3f573fSAndroid Build Coastguard Worker@end
3549*1b3f573fSAndroid Build Coastguard Worker
3550*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> UInt64
3551*1b3f573fSAndroid Build Coastguard Worker
3552*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32UInt64Dictionary {
3553*1b3f573fSAndroid Build Coastguard Worker @package
3554*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3555*1b3f573fSAndroid Build Coastguard Worker}
3556*1b3f573fSAndroid Build Coastguard Worker
3557*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
3558*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
3559*1b3f573fSAndroid Build Coastguard Worker}
3560*1b3f573fSAndroid Build Coastguard Worker
3561*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
3562*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
3563*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
3564*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
3565*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3566*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3567*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
3568*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3569*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3570*1b3f573fSAndroid Build Coastguard Worker      }
3571*1b3f573fSAndroid Build Coastguard Worker    }
3572*1b3f573fSAndroid Build Coastguard Worker  }
3573*1b3f573fSAndroid Build Coastguard Worker  return self;
3574*1b3f573fSAndroid Build Coastguard Worker}
3575*1b3f573fSAndroid Build Coastguard Worker
3576*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32UInt64Dictionary *)dictionary {
3577*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
3578*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3579*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
3580*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3581*1b3f573fSAndroid Build Coastguard Worker    }
3582*1b3f573fSAndroid Build Coastguard Worker  }
3583*1b3f573fSAndroid Build Coastguard Worker  return self;
3584*1b3f573fSAndroid Build Coastguard Worker}
3585*1b3f573fSAndroid Build Coastguard Worker
3586*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3587*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
3588*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
3589*1b3f573fSAndroid Build Coastguard Worker}
3590*1b3f573fSAndroid Build Coastguard Worker
3591*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
3592*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3593*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3594*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
3595*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
3596*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
3597*1b3f573fSAndroid Build Coastguard Worker}
3598*1b3f573fSAndroid Build Coastguard Worker
3599*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3600*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
3601*1b3f573fSAndroid Build Coastguard Worker}
3602*1b3f573fSAndroid Build Coastguard Worker
3603*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3604*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
3605*1b3f573fSAndroid Build Coastguard Worker    return YES;
3606*1b3f573fSAndroid Build Coastguard Worker  }
3607*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32UInt64Dictionary class]]) {
3608*1b3f573fSAndroid Build Coastguard Worker    return NO;
3609*1b3f573fSAndroid Build Coastguard Worker  }
3610*1b3f573fSAndroid Build Coastguard Worker  GPBInt32UInt64Dictionary *otherDictionary = other;
3611*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3612*1b3f573fSAndroid Build Coastguard Worker}
3613*1b3f573fSAndroid Build Coastguard Worker
3614*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
3615*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3616*1b3f573fSAndroid Build Coastguard Worker}
3617*1b3f573fSAndroid Build Coastguard Worker
3618*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
3619*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3620*1b3f573fSAndroid Build Coastguard Worker}
3621*1b3f573fSAndroid Build Coastguard Worker
3622*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
3623*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3624*1b3f573fSAndroid Build Coastguard Worker}
3625*1b3f573fSAndroid Build Coastguard Worker
3626*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
3627*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, uint64_t value, BOOL *stop))block {
3628*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
3629*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3630*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3631*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3632*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3633*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3634*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue unsignedLongLongValue], &stop);
3635*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
3636*1b3f573fSAndroid Build Coastguard Worker      break;
3637*1b3f573fSAndroid Build Coastguard Worker    }
3638*1b3f573fSAndroid Build Coastguard Worker  }
3639*1b3f573fSAndroid Build Coastguard Worker}
3640*1b3f573fSAndroid Build Coastguard Worker
3641*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3642*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3643*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3644*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
3645*1b3f573fSAndroid Build Coastguard Worker    return 0;
3646*1b3f573fSAndroid Build Coastguard Worker  }
3647*1b3f573fSAndroid Build Coastguard Worker
3648*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3649*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3650*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
3651*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3652*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3653*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3654*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3655*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3656*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
3657*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3658*1b3f573fSAndroid Build Coastguard Worker  }
3659*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3660*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
3661*1b3f573fSAndroid Build Coastguard Worker  return result;
3662*1b3f573fSAndroid Build Coastguard Worker}
3663*1b3f573fSAndroid Build Coastguard Worker
3664*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3665*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3666*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3667*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3668*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3669*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3670*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3671*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3672*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3673*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3674*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3675*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
3676*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3677*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
3678*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3679*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3680*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3681*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
3682*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3683*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3684*1b3f573fSAndroid Build Coastguard Worker  }
3685*1b3f573fSAndroid Build Coastguard Worker}
3686*1b3f573fSAndroid Build Coastguard Worker
3687*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3688*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3689*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt32)];
3690*1b3f573fSAndroid Build Coastguard Worker}
3691*1b3f573fSAndroid Build Coastguard Worker
3692*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3693*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(int32_t key, uint64_t value, BOOL *stop) {
3694*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
3695*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%llu", value]);
3696*1b3f573fSAndroid Build Coastguard Worker  }];
3697*1b3f573fSAndroid Build Coastguard Worker}
3698*1b3f573fSAndroid Build Coastguard Worker
3699*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int32_t)key {
3700*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3701*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
3702*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
3703*1b3f573fSAndroid Build Coastguard Worker  }
3704*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
3705*1b3f573fSAndroid Build Coastguard Worker}
3706*1b3f573fSAndroid Build Coastguard Worker
3707*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32UInt64Dictionary *)otherDictionary {
3708*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
3709*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3710*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
3711*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3712*1b3f573fSAndroid Build Coastguard Worker    }
3713*1b3f573fSAndroid Build Coastguard Worker  }
3714*1b3f573fSAndroid Build Coastguard Worker}
3715*1b3f573fSAndroid Build Coastguard Worker
3716*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(int32_t)key {
3717*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3718*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
3719*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3720*1b3f573fSAndroid Build Coastguard Worker  }
3721*1b3f573fSAndroid Build Coastguard Worker}
3722*1b3f573fSAndroid Build Coastguard Worker
3723*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(int32_t)aKey {
3724*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3725*1b3f573fSAndroid Build Coastguard Worker}
3726*1b3f573fSAndroid Build Coastguard Worker
3727*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
3728*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3729*1b3f573fSAndroid Build Coastguard Worker}
3730*1b3f573fSAndroid Build Coastguard Worker
3731*1b3f573fSAndroid Build Coastguard Worker@end
3732*1b3f573fSAndroid Build Coastguard Worker
3733*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> Int64
3734*1b3f573fSAndroid Build Coastguard Worker
3735*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32Int64Dictionary {
3736*1b3f573fSAndroid Build Coastguard Worker @package
3737*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3738*1b3f573fSAndroid Build Coastguard Worker}
3739*1b3f573fSAndroid Build Coastguard Worker
3740*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
3741*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
3742*1b3f573fSAndroid Build Coastguard Worker}
3743*1b3f573fSAndroid Build Coastguard Worker
3744*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
3745*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const int32_t [])keys
3746*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
3747*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
3748*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3749*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3750*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
3751*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3752*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3753*1b3f573fSAndroid Build Coastguard Worker      }
3754*1b3f573fSAndroid Build Coastguard Worker    }
3755*1b3f573fSAndroid Build Coastguard Worker  }
3756*1b3f573fSAndroid Build Coastguard Worker  return self;
3757*1b3f573fSAndroid Build Coastguard Worker}
3758*1b3f573fSAndroid Build Coastguard Worker
3759*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32Int64Dictionary *)dictionary {
3760*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
3761*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3762*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
3763*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3764*1b3f573fSAndroid Build Coastguard Worker    }
3765*1b3f573fSAndroid Build Coastguard Worker  }
3766*1b3f573fSAndroid Build Coastguard Worker  return self;
3767*1b3f573fSAndroid Build Coastguard Worker}
3768*1b3f573fSAndroid Build Coastguard Worker
3769*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3770*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
3771*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
3772*1b3f573fSAndroid Build Coastguard Worker}
3773*1b3f573fSAndroid Build Coastguard Worker
3774*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
3775*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3776*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3777*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
3778*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
3779*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
3780*1b3f573fSAndroid Build Coastguard Worker}
3781*1b3f573fSAndroid Build Coastguard Worker
3782*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3783*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self];
3784*1b3f573fSAndroid Build Coastguard Worker}
3785*1b3f573fSAndroid Build Coastguard Worker
3786*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3787*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
3788*1b3f573fSAndroid Build Coastguard Worker    return YES;
3789*1b3f573fSAndroid Build Coastguard Worker  }
3790*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32Int64Dictionary class]]) {
3791*1b3f573fSAndroid Build Coastguard Worker    return NO;
3792*1b3f573fSAndroid Build Coastguard Worker  }
3793*1b3f573fSAndroid Build Coastguard Worker  GPBInt32Int64Dictionary *otherDictionary = other;
3794*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3795*1b3f573fSAndroid Build Coastguard Worker}
3796*1b3f573fSAndroid Build Coastguard Worker
3797*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
3798*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3799*1b3f573fSAndroid Build Coastguard Worker}
3800*1b3f573fSAndroid Build Coastguard Worker
3801*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
3802*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3803*1b3f573fSAndroid Build Coastguard Worker}
3804*1b3f573fSAndroid Build Coastguard Worker
3805*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
3806*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3807*1b3f573fSAndroid Build Coastguard Worker}
3808*1b3f573fSAndroid Build Coastguard Worker
3809*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
3810*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int64_t value, BOOL *stop))block {
3811*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
3812*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3813*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3814*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3815*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3816*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3817*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue longLongValue], &stop);
3818*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
3819*1b3f573fSAndroid Build Coastguard Worker      break;
3820*1b3f573fSAndroid Build Coastguard Worker    }
3821*1b3f573fSAndroid Build Coastguard Worker  }
3822*1b3f573fSAndroid Build Coastguard Worker}
3823*1b3f573fSAndroid Build Coastguard Worker
3824*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3825*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3826*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
3827*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
3828*1b3f573fSAndroid Build Coastguard Worker    return 0;
3829*1b3f573fSAndroid Build Coastguard Worker  }
3830*1b3f573fSAndroid Build Coastguard Worker
3831*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3832*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3833*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
3834*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3835*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3836*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3837*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3838*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
3839*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
3840*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3841*1b3f573fSAndroid Build Coastguard Worker  }
3842*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
3843*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
3844*1b3f573fSAndroid Build Coastguard Worker  return result;
3845*1b3f573fSAndroid Build Coastguard Worker}
3846*1b3f573fSAndroid Build Coastguard Worker
3847*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3848*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
3849*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
3850*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
3851*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
3852*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3853*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3854*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3855*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3856*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
3857*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
3858*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
3859*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
3860*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
3861*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
3862*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
3863*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
3864*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
3865*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
3866*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
3867*1b3f573fSAndroid Build Coastguard Worker  }
3868*1b3f573fSAndroid Build Coastguard Worker}
3869*1b3f573fSAndroid Build Coastguard Worker
3870*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
3871*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
3872*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt32)];
3873*1b3f573fSAndroid Build Coastguard Worker}
3874*1b3f573fSAndroid Build Coastguard Worker
3875*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
3876*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(int32_t key, int64_t value, BOOL *stop) {
3877*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
3878*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%lld", value]);
3879*1b3f573fSAndroid Build Coastguard Worker  }];
3880*1b3f573fSAndroid Build Coastguard Worker}
3881*1b3f573fSAndroid Build Coastguard Worker
3882*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(int32_t)key {
3883*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3884*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
3885*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
3886*1b3f573fSAndroid Build Coastguard Worker  }
3887*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
3888*1b3f573fSAndroid Build Coastguard Worker}
3889*1b3f573fSAndroid Build Coastguard Worker
3890*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32Int64Dictionary *)otherDictionary {
3891*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
3892*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3893*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
3894*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
3895*1b3f573fSAndroid Build Coastguard Worker    }
3896*1b3f573fSAndroid Build Coastguard Worker  }
3897*1b3f573fSAndroid Build Coastguard Worker}
3898*1b3f573fSAndroid Build Coastguard Worker
3899*1b3f573fSAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(int32_t)key {
3900*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
3901*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
3902*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
3903*1b3f573fSAndroid Build Coastguard Worker  }
3904*1b3f573fSAndroid Build Coastguard Worker}
3905*1b3f573fSAndroid Build Coastguard Worker
3906*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt64ForKey:(int32_t)aKey {
3907*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
3908*1b3f573fSAndroid Build Coastguard Worker}
3909*1b3f573fSAndroid Build Coastguard Worker
3910*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
3911*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
3912*1b3f573fSAndroid Build Coastguard Worker}
3913*1b3f573fSAndroid Build Coastguard Worker
3914*1b3f573fSAndroid Build Coastguard Worker@end
3915*1b3f573fSAndroid Build Coastguard Worker
3916*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> Bool
3917*1b3f573fSAndroid Build Coastguard Worker
3918*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32BoolDictionary {
3919*1b3f573fSAndroid Build Coastguard Worker @package
3920*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
3921*1b3f573fSAndroid Build Coastguard Worker}
3922*1b3f573fSAndroid Build Coastguard Worker
3923*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
3924*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
3925*1b3f573fSAndroid Build Coastguard Worker}
3926*1b3f573fSAndroid Build Coastguard Worker
3927*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
3928*1b3f573fSAndroid Build Coastguard Worker                      forKeys:(const int32_t [])keys
3929*1b3f573fSAndroid Build Coastguard Worker                        count:(NSUInteger)count {
3930*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
3931*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3932*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
3933*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
3934*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
3935*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3936*1b3f573fSAndroid Build Coastguard Worker      }
3937*1b3f573fSAndroid Build Coastguard Worker    }
3938*1b3f573fSAndroid Build Coastguard Worker  }
3939*1b3f573fSAndroid Build Coastguard Worker  return self;
3940*1b3f573fSAndroid Build Coastguard Worker}
3941*1b3f573fSAndroid Build Coastguard Worker
3942*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32BoolDictionary *)dictionary {
3943*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
3944*1b3f573fSAndroid Build Coastguard Worker  if (self) {
3945*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
3946*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3947*1b3f573fSAndroid Build Coastguard Worker    }
3948*1b3f573fSAndroid Build Coastguard Worker  }
3949*1b3f573fSAndroid Build Coastguard Worker  return self;
3950*1b3f573fSAndroid Build Coastguard Worker}
3951*1b3f573fSAndroid Build Coastguard Worker
3952*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
3953*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
3954*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
3955*1b3f573fSAndroid Build Coastguard Worker}
3956*1b3f573fSAndroid Build Coastguard Worker
3957*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
3958*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
3959*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
3960*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
3961*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
3962*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
3963*1b3f573fSAndroid Build Coastguard Worker}
3964*1b3f573fSAndroid Build Coastguard Worker
3965*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
3966*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
3967*1b3f573fSAndroid Build Coastguard Worker}
3968*1b3f573fSAndroid Build Coastguard Worker
3969*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
3970*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
3971*1b3f573fSAndroid Build Coastguard Worker    return YES;
3972*1b3f573fSAndroid Build Coastguard Worker  }
3973*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32BoolDictionary class]]) {
3974*1b3f573fSAndroid Build Coastguard Worker    return NO;
3975*1b3f573fSAndroid Build Coastguard Worker  }
3976*1b3f573fSAndroid Build Coastguard Worker  GPBInt32BoolDictionary *otherDictionary = other;
3977*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
3978*1b3f573fSAndroid Build Coastguard Worker}
3979*1b3f573fSAndroid Build Coastguard Worker
3980*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
3981*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3982*1b3f573fSAndroid Build Coastguard Worker}
3983*1b3f573fSAndroid Build Coastguard Worker
3984*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
3985*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
3986*1b3f573fSAndroid Build Coastguard Worker}
3987*1b3f573fSAndroid Build Coastguard Worker
3988*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
3989*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
3990*1b3f573fSAndroid Build Coastguard Worker}
3991*1b3f573fSAndroid Build Coastguard Worker
3992*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
3993*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, BOOL value, BOOL *stop))block {
3994*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
3995*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
3996*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
3997*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
3998*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
3999*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4000*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue boolValue], &stop);
4001*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
4002*1b3f573fSAndroid Build Coastguard Worker      break;
4003*1b3f573fSAndroid Build Coastguard Worker    }
4004*1b3f573fSAndroid Build Coastguard Worker  }
4005*1b3f573fSAndroid Build Coastguard Worker}
4006*1b3f573fSAndroid Build Coastguard Worker
4007*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4008*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4009*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4010*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
4011*1b3f573fSAndroid Build Coastguard Worker    return 0;
4012*1b3f573fSAndroid Build Coastguard Worker  }
4013*1b3f573fSAndroid Build Coastguard Worker
4014*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4015*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4016*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
4017*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4018*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4019*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4020*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4021*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4022*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
4023*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4024*1b3f573fSAndroid Build Coastguard Worker  }
4025*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4026*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
4027*1b3f573fSAndroid Build Coastguard Worker  return result;
4028*1b3f573fSAndroid Build Coastguard Worker}
4029*1b3f573fSAndroid Build Coastguard Worker
4030*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4031*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4032*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4033*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4034*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4035*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4036*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4037*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4038*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4039*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4040*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4041*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
4042*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4043*1b3f573fSAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
4044*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4045*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4046*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4047*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
4048*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4049*1b3f573fSAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4050*1b3f573fSAndroid Build Coastguard Worker  }
4051*1b3f573fSAndroid Build Coastguard Worker}
4052*1b3f573fSAndroid Build Coastguard Worker
4053*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4054*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4055*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt32)];
4056*1b3f573fSAndroid Build Coastguard Worker}
4057*1b3f573fSAndroid Build Coastguard Worker
4058*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4059*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(int32_t key, BOOL value, BOOL *stop) {
4060*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
4061*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], (value ? @"true" : @"false"));
4062*1b3f573fSAndroid Build Coastguard Worker  }];
4063*1b3f573fSAndroid Build Coastguard Worker}
4064*1b3f573fSAndroid Build Coastguard Worker
4065*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(int32_t)key {
4066*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4067*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
4068*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped boolValue];
4069*1b3f573fSAndroid Build Coastguard Worker  }
4070*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
4071*1b3f573fSAndroid Build Coastguard Worker}
4072*1b3f573fSAndroid Build Coastguard Worker
4073*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32BoolDictionary *)otherDictionary {
4074*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
4075*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4076*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
4077*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4078*1b3f573fSAndroid Build Coastguard Worker    }
4079*1b3f573fSAndroid Build Coastguard Worker  }
4080*1b3f573fSAndroid Build Coastguard Worker}
4081*1b3f573fSAndroid Build Coastguard Worker
4082*1b3f573fSAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(int32_t)key {
4083*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4084*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
4085*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4086*1b3f573fSAndroid Build Coastguard Worker  }
4087*1b3f573fSAndroid Build Coastguard Worker}
4088*1b3f573fSAndroid Build Coastguard Worker
4089*1b3f573fSAndroid Build Coastguard Worker- (void)removeBoolForKey:(int32_t)aKey {
4090*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4091*1b3f573fSAndroid Build Coastguard Worker}
4092*1b3f573fSAndroid Build Coastguard Worker
4093*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
4094*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4095*1b3f573fSAndroid Build Coastguard Worker}
4096*1b3f573fSAndroid Build Coastguard Worker
4097*1b3f573fSAndroid Build Coastguard Worker@end
4098*1b3f573fSAndroid Build Coastguard Worker
4099*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> Float
4100*1b3f573fSAndroid Build Coastguard Worker
4101*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32FloatDictionary {
4102*1b3f573fSAndroid Build Coastguard Worker @package
4103*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4104*1b3f573fSAndroid Build Coastguard Worker}
4105*1b3f573fSAndroid Build Coastguard Worker
4106*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
4107*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
4108*1b3f573fSAndroid Build Coastguard Worker}
4109*1b3f573fSAndroid Build Coastguard Worker
4110*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
4111*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const int32_t [])keys
4112*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
4113*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
4114*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4115*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4116*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
4117*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4118*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4119*1b3f573fSAndroid Build Coastguard Worker      }
4120*1b3f573fSAndroid Build Coastguard Worker    }
4121*1b3f573fSAndroid Build Coastguard Worker  }
4122*1b3f573fSAndroid Build Coastguard Worker  return self;
4123*1b3f573fSAndroid Build Coastguard Worker}
4124*1b3f573fSAndroid Build Coastguard Worker
4125*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32FloatDictionary *)dictionary {
4126*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
4127*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4128*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
4129*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4130*1b3f573fSAndroid Build Coastguard Worker    }
4131*1b3f573fSAndroid Build Coastguard Worker  }
4132*1b3f573fSAndroid Build Coastguard Worker  return self;
4133*1b3f573fSAndroid Build Coastguard Worker}
4134*1b3f573fSAndroid Build Coastguard Worker
4135*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4136*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
4137*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
4138*1b3f573fSAndroid Build Coastguard Worker}
4139*1b3f573fSAndroid Build Coastguard Worker
4140*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
4141*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4142*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4143*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
4144*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
4145*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
4146*1b3f573fSAndroid Build Coastguard Worker}
4147*1b3f573fSAndroid Build Coastguard Worker
4148*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4149*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32FloatDictionary allocWithZone:zone] initWithDictionary:self];
4150*1b3f573fSAndroid Build Coastguard Worker}
4151*1b3f573fSAndroid Build Coastguard Worker
4152*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4153*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
4154*1b3f573fSAndroid Build Coastguard Worker    return YES;
4155*1b3f573fSAndroid Build Coastguard Worker  }
4156*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32FloatDictionary class]]) {
4157*1b3f573fSAndroid Build Coastguard Worker    return NO;
4158*1b3f573fSAndroid Build Coastguard Worker  }
4159*1b3f573fSAndroid Build Coastguard Worker  GPBInt32FloatDictionary *otherDictionary = other;
4160*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4161*1b3f573fSAndroid Build Coastguard Worker}
4162*1b3f573fSAndroid Build Coastguard Worker
4163*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
4164*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4165*1b3f573fSAndroid Build Coastguard Worker}
4166*1b3f573fSAndroid Build Coastguard Worker
4167*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
4168*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4169*1b3f573fSAndroid Build Coastguard Worker}
4170*1b3f573fSAndroid Build Coastguard Worker
4171*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
4172*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4173*1b3f573fSAndroid Build Coastguard Worker}
4174*1b3f573fSAndroid Build Coastguard Worker
4175*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
4176*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, float value, BOOL *stop))block {
4177*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
4178*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4179*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4180*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4181*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4182*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4183*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue floatValue], &stop);
4184*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
4185*1b3f573fSAndroid Build Coastguard Worker      break;
4186*1b3f573fSAndroid Build Coastguard Worker    }
4187*1b3f573fSAndroid Build Coastguard Worker  }
4188*1b3f573fSAndroid Build Coastguard Worker}
4189*1b3f573fSAndroid Build Coastguard Worker
4190*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4191*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4192*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4193*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
4194*1b3f573fSAndroid Build Coastguard Worker    return 0;
4195*1b3f573fSAndroid Build Coastguard Worker  }
4196*1b3f573fSAndroid Build Coastguard Worker
4197*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4198*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4199*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
4200*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4201*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4202*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4203*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4204*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4205*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
4206*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4207*1b3f573fSAndroid Build Coastguard Worker  }
4208*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4209*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
4210*1b3f573fSAndroid Build Coastguard Worker  return result;
4211*1b3f573fSAndroid Build Coastguard Worker}
4212*1b3f573fSAndroid Build Coastguard Worker
4213*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4214*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4215*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4216*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4217*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4218*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4219*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4220*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4221*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4222*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4223*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4224*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
4225*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4226*1b3f573fSAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
4227*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4228*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4229*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4230*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
4231*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4232*1b3f573fSAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4233*1b3f573fSAndroid Build Coastguard Worker  }
4234*1b3f573fSAndroid Build Coastguard Worker}
4235*1b3f573fSAndroid Build Coastguard Worker
4236*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4237*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4238*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt32)];
4239*1b3f573fSAndroid Build Coastguard Worker}
4240*1b3f573fSAndroid Build Coastguard Worker
4241*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4242*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(int32_t key, float value, BOOL *stop) {
4243*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
4244*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
4245*1b3f573fSAndroid Build Coastguard Worker  }];
4246*1b3f573fSAndroid Build Coastguard Worker}
4247*1b3f573fSAndroid Build Coastguard Worker
4248*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(int32_t)key {
4249*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4250*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
4251*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped floatValue];
4252*1b3f573fSAndroid Build Coastguard Worker  }
4253*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
4254*1b3f573fSAndroid Build Coastguard Worker}
4255*1b3f573fSAndroid Build Coastguard Worker
4256*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32FloatDictionary *)otherDictionary {
4257*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
4258*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4259*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
4260*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4261*1b3f573fSAndroid Build Coastguard Worker    }
4262*1b3f573fSAndroid Build Coastguard Worker  }
4263*1b3f573fSAndroid Build Coastguard Worker}
4264*1b3f573fSAndroid Build Coastguard Worker
4265*1b3f573fSAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(int32_t)key {
4266*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4267*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
4268*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4269*1b3f573fSAndroid Build Coastguard Worker  }
4270*1b3f573fSAndroid Build Coastguard Worker}
4271*1b3f573fSAndroid Build Coastguard Worker
4272*1b3f573fSAndroid Build Coastguard Worker- (void)removeFloatForKey:(int32_t)aKey {
4273*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4274*1b3f573fSAndroid Build Coastguard Worker}
4275*1b3f573fSAndroid Build Coastguard Worker
4276*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
4277*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4278*1b3f573fSAndroid Build Coastguard Worker}
4279*1b3f573fSAndroid Build Coastguard Worker
4280*1b3f573fSAndroid Build Coastguard Worker@end
4281*1b3f573fSAndroid Build Coastguard Worker
4282*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> Double
4283*1b3f573fSAndroid Build Coastguard Worker
4284*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32DoubleDictionary {
4285*1b3f573fSAndroid Build Coastguard Worker @package
4286*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4287*1b3f573fSAndroid Build Coastguard Worker}
4288*1b3f573fSAndroid Build Coastguard Worker
4289*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
4290*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
4291*1b3f573fSAndroid Build Coastguard Worker}
4292*1b3f573fSAndroid Build Coastguard Worker
4293*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
4294*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
4295*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
4296*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
4297*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4298*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4299*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
4300*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4301*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4302*1b3f573fSAndroid Build Coastguard Worker      }
4303*1b3f573fSAndroid Build Coastguard Worker    }
4304*1b3f573fSAndroid Build Coastguard Worker  }
4305*1b3f573fSAndroid Build Coastguard Worker  return self;
4306*1b3f573fSAndroid Build Coastguard Worker}
4307*1b3f573fSAndroid Build Coastguard Worker
4308*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32DoubleDictionary *)dictionary {
4309*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
4310*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4311*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
4312*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4313*1b3f573fSAndroid Build Coastguard Worker    }
4314*1b3f573fSAndroid Build Coastguard Worker  }
4315*1b3f573fSAndroid Build Coastguard Worker  return self;
4316*1b3f573fSAndroid Build Coastguard Worker}
4317*1b3f573fSAndroid Build Coastguard Worker
4318*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4319*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
4320*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
4321*1b3f573fSAndroid Build Coastguard Worker}
4322*1b3f573fSAndroid Build Coastguard Worker
4323*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
4324*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4325*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4326*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
4327*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
4328*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
4329*1b3f573fSAndroid Build Coastguard Worker}
4330*1b3f573fSAndroid Build Coastguard Worker
4331*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4332*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self];
4333*1b3f573fSAndroid Build Coastguard Worker}
4334*1b3f573fSAndroid Build Coastguard Worker
4335*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4336*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
4337*1b3f573fSAndroid Build Coastguard Worker    return YES;
4338*1b3f573fSAndroid Build Coastguard Worker  }
4339*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32DoubleDictionary class]]) {
4340*1b3f573fSAndroid Build Coastguard Worker    return NO;
4341*1b3f573fSAndroid Build Coastguard Worker  }
4342*1b3f573fSAndroid Build Coastguard Worker  GPBInt32DoubleDictionary *otherDictionary = other;
4343*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4344*1b3f573fSAndroid Build Coastguard Worker}
4345*1b3f573fSAndroid Build Coastguard Worker
4346*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
4347*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4348*1b3f573fSAndroid Build Coastguard Worker}
4349*1b3f573fSAndroid Build Coastguard Worker
4350*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
4351*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4352*1b3f573fSAndroid Build Coastguard Worker}
4353*1b3f573fSAndroid Build Coastguard Worker
4354*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
4355*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4356*1b3f573fSAndroid Build Coastguard Worker}
4357*1b3f573fSAndroid Build Coastguard Worker
4358*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
4359*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, double value, BOOL *stop))block {
4360*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
4361*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4362*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4363*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4364*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4365*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4366*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue doubleValue], &stop);
4367*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
4368*1b3f573fSAndroid Build Coastguard Worker      break;
4369*1b3f573fSAndroid Build Coastguard Worker    }
4370*1b3f573fSAndroid Build Coastguard Worker  }
4371*1b3f573fSAndroid Build Coastguard Worker}
4372*1b3f573fSAndroid Build Coastguard Worker
4373*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4374*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4375*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4376*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
4377*1b3f573fSAndroid Build Coastguard Worker    return 0;
4378*1b3f573fSAndroid Build Coastguard Worker  }
4379*1b3f573fSAndroid Build Coastguard Worker
4380*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4381*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4382*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
4383*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4384*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4385*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4386*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4387*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4388*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
4389*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4390*1b3f573fSAndroid Build Coastguard Worker  }
4391*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4392*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
4393*1b3f573fSAndroid Build Coastguard Worker  return result;
4394*1b3f573fSAndroid Build Coastguard Worker}
4395*1b3f573fSAndroid Build Coastguard Worker
4396*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4397*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4398*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4399*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4400*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4401*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4402*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4403*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4404*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4405*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4406*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4407*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
4408*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4409*1b3f573fSAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
4410*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4411*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4412*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4413*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
4414*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4415*1b3f573fSAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4416*1b3f573fSAndroid Build Coastguard Worker  }
4417*1b3f573fSAndroid Build Coastguard Worker}
4418*1b3f573fSAndroid Build Coastguard Worker
4419*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4420*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4421*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt32)];
4422*1b3f573fSAndroid Build Coastguard Worker}
4423*1b3f573fSAndroid Build Coastguard Worker
4424*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4425*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(int32_t key, double value, BOOL *stop) {
4426*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
4427*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
4428*1b3f573fSAndroid Build Coastguard Worker  }];
4429*1b3f573fSAndroid Build Coastguard Worker}
4430*1b3f573fSAndroid Build Coastguard Worker
4431*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(int32_t)key {
4432*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4433*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
4434*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
4435*1b3f573fSAndroid Build Coastguard Worker  }
4436*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
4437*1b3f573fSAndroid Build Coastguard Worker}
4438*1b3f573fSAndroid Build Coastguard Worker
4439*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32DoubleDictionary *)otherDictionary {
4440*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
4441*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4442*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
4443*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4444*1b3f573fSAndroid Build Coastguard Worker    }
4445*1b3f573fSAndroid Build Coastguard Worker  }
4446*1b3f573fSAndroid Build Coastguard Worker}
4447*1b3f573fSAndroid Build Coastguard Worker
4448*1b3f573fSAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(int32_t)key {
4449*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4450*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
4451*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4452*1b3f573fSAndroid Build Coastguard Worker  }
4453*1b3f573fSAndroid Build Coastguard Worker}
4454*1b3f573fSAndroid Build Coastguard Worker
4455*1b3f573fSAndroid Build Coastguard Worker- (void)removeDoubleForKey:(int32_t)aKey {
4456*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4457*1b3f573fSAndroid Build Coastguard Worker}
4458*1b3f573fSAndroid Build Coastguard Worker
4459*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
4460*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4461*1b3f573fSAndroid Build Coastguard Worker}
4462*1b3f573fSAndroid Build Coastguard Worker
4463*1b3f573fSAndroid Build Coastguard Worker@end
4464*1b3f573fSAndroid Build Coastguard Worker
4465*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> Enum
4466*1b3f573fSAndroid Build Coastguard Worker
4467*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32EnumDictionary {
4468*1b3f573fSAndroid Build Coastguard Worker @package
4469*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4470*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
4471*1b3f573fSAndroid Build Coastguard Worker}
4472*1b3f573fSAndroid Build Coastguard Worker
4473*1b3f573fSAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
4474*1b3f573fSAndroid Build Coastguard Worker
4475*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
4476*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
4477*1b3f573fSAndroid Build Coastguard Worker}
4478*1b3f573fSAndroid Build Coastguard Worker
4479*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
4480*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
4481*1b3f573fSAndroid Build Coastguard Worker}
4482*1b3f573fSAndroid Build Coastguard Worker
4483*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
4484*1b3f573fSAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
4485*1b3f573fSAndroid Build Coastguard Worker                                   forKeys:(const int32_t [])keys
4486*1b3f573fSAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
4487*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
4488*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4489*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4490*1b3f573fSAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
4491*1b3f573fSAndroid Build Coastguard Worker    if (count && rawValues && keys) {
4492*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4493*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
4494*1b3f573fSAndroid Build Coastguard Worker      }
4495*1b3f573fSAndroid Build Coastguard Worker    }
4496*1b3f573fSAndroid Build Coastguard Worker  }
4497*1b3f573fSAndroid Build Coastguard Worker  return self;
4498*1b3f573fSAndroid Build Coastguard Worker}
4499*1b3f573fSAndroid Build Coastguard Worker
4500*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32EnumDictionary *)dictionary {
4501*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
4502*1b3f573fSAndroid Build Coastguard Worker                                rawValues:NULL
4503*1b3f573fSAndroid Build Coastguard Worker                                  forKeys:NULL
4504*1b3f573fSAndroid Build Coastguard Worker                                    count:0];
4505*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4506*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
4507*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4508*1b3f573fSAndroid Build Coastguard Worker    }
4509*1b3f573fSAndroid Build Coastguard Worker  }
4510*1b3f573fSAndroid Build Coastguard Worker  return self;
4511*1b3f573fSAndroid Build Coastguard Worker}
4512*1b3f573fSAndroid Build Coastguard Worker
4513*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
4514*1b3f573fSAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
4515*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
4516*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
4517*1b3f573fSAndroid Build Coastguard Worker}
4518*1b3f573fSAndroid Build Coastguard Worker
4519*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
4520*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4521*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4522*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
4523*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
4524*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
4525*1b3f573fSAndroid Build Coastguard Worker}
4526*1b3f573fSAndroid Build Coastguard Worker
4527*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4528*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
4529*1b3f573fSAndroid Build Coastguard Worker}
4530*1b3f573fSAndroid Build Coastguard Worker
4531*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4532*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
4533*1b3f573fSAndroid Build Coastguard Worker    return YES;
4534*1b3f573fSAndroid Build Coastguard Worker  }
4535*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32EnumDictionary class]]) {
4536*1b3f573fSAndroid Build Coastguard Worker    return NO;
4537*1b3f573fSAndroid Build Coastguard Worker  }
4538*1b3f573fSAndroid Build Coastguard Worker  GPBInt32EnumDictionary *otherDictionary = other;
4539*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4540*1b3f573fSAndroid Build Coastguard Worker}
4541*1b3f573fSAndroid Build Coastguard Worker
4542*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
4543*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4544*1b3f573fSAndroid Build Coastguard Worker}
4545*1b3f573fSAndroid Build Coastguard Worker
4546*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
4547*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4548*1b3f573fSAndroid Build Coastguard Worker}
4549*1b3f573fSAndroid Build Coastguard Worker
4550*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
4551*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4552*1b3f573fSAndroid Build Coastguard Worker}
4553*1b3f573fSAndroid Build Coastguard Worker
4554*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
4555*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block {
4556*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
4557*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4558*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4559*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4560*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4561*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4562*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], [aValue intValue], &stop);
4563*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
4564*1b3f573fSAndroid Build Coastguard Worker      break;
4565*1b3f573fSAndroid Build Coastguard Worker    }
4566*1b3f573fSAndroid Build Coastguard Worker  }
4567*1b3f573fSAndroid Build Coastguard Worker}
4568*1b3f573fSAndroid Build Coastguard Worker
4569*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4570*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4571*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4572*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
4573*1b3f573fSAndroid Build Coastguard Worker    return 0;
4574*1b3f573fSAndroid Build Coastguard Worker  }
4575*1b3f573fSAndroid Build Coastguard Worker
4576*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4577*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4578*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
4579*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4580*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4581*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4582*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4583*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4584*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
4585*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4586*1b3f573fSAndroid Build Coastguard Worker  }
4587*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4588*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
4589*1b3f573fSAndroid Build Coastguard Worker  return result;
4590*1b3f573fSAndroid Build Coastguard Worker}
4591*1b3f573fSAndroid Build Coastguard Worker
4592*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4593*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4594*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4595*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4596*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4597*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4598*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4599*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4600*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4601*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
4602*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4603*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
4604*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4605*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
4606*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4607*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4608*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4609*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
4610*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4611*1b3f573fSAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4612*1b3f573fSAndroid Build Coastguard Worker  }
4613*1b3f573fSAndroid Build Coastguard Worker}
4614*1b3f573fSAndroid Build Coastguard Worker
4615*1b3f573fSAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
4616*1b3f573fSAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
4617*1b3f573fSAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
4618*1b3f573fSAndroid Build Coastguard Worker  size_t msgSize = ComputeDictInt32FieldSize(key->valueInt32, kMapKeyFieldNumber, keyDataType);
4619*1b3f573fSAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
4620*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
4621*1b3f573fSAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
4622*1b3f573fSAndroid Build Coastguard Worker  WriteDictInt32Field(outputStream, key->valueInt32, kMapKeyFieldNumber, keyDataType);
4623*1b3f573fSAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
4624*1b3f573fSAndroid Build Coastguard Worker  [outputStream release];
4625*1b3f573fSAndroid Build Coastguard Worker  return data;
4626*1b3f573fSAndroid Build Coastguard Worker}
4627*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4628*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4629*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt32)];
4630*1b3f573fSAndroid Build Coastguard Worker}
4631*1b3f573fSAndroid Build Coastguard Worker
4632*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4633*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
4634*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
4635*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], @(value));
4636*1b3f573fSAndroid Build Coastguard Worker  }];
4637*1b3f573fSAndroid Build Coastguard Worker}
4638*1b3f573fSAndroid Build Coastguard Worker
4639*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(int32_t)key {
4640*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4641*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
4642*1b3f573fSAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
4643*1b3f573fSAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
4644*1b3f573fSAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
4645*1b3f573fSAndroid Build Coastguard Worker    }
4646*1b3f573fSAndroid Build Coastguard Worker    *value = result;
4647*1b3f573fSAndroid Build Coastguard Worker  }
4648*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
4649*1b3f573fSAndroid Build Coastguard Worker}
4650*1b3f573fSAndroid Build Coastguard Worker
4651*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int32_t)key {
4652*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4653*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && rawValue) {
4654*1b3f573fSAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
4655*1b3f573fSAndroid Build Coastguard Worker  }
4656*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
4657*1b3f573fSAndroid Build Coastguard Worker}
4658*1b3f573fSAndroid Build Coastguard Worker
4659*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
4660*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block {
4661*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
4662*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
4663*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
4664*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4665*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4666*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
4667*1b3f573fSAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
4668*1b3f573fSAndroid Build Coastguard Worker      if (!func(unwrapped)) {
4669*1b3f573fSAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
4670*1b3f573fSAndroid Build Coastguard Worker      }
4671*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], unwrapped, &stop);
4672*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
4673*1b3f573fSAndroid Build Coastguard Worker      break;
4674*1b3f573fSAndroid Build Coastguard Worker    }
4675*1b3f573fSAndroid Build Coastguard Worker  }
4676*1b3f573fSAndroid Build Coastguard Worker}
4677*1b3f573fSAndroid Build Coastguard Worker
4678*1b3f573fSAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBInt32EnumDictionary *)otherDictionary {
4679*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
4680*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4681*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
4682*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4683*1b3f573fSAndroid Build Coastguard Worker    }
4684*1b3f573fSAndroid Build Coastguard Worker  }
4685*1b3f573fSAndroid Build Coastguard Worker}
4686*1b3f573fSAndroid Build Coastguard Worker
4687*1b3f573fSAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(int32_t)key {
4688*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4689*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
4690*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4691*1b3f573fSAndroid Build Coastguard Worker  }
4692*1b3f573fSAndroid Build Coastguard Worker}
4693*1b3f573fSAndroid Build Coastguard Worker
4694*1b3f573fSAndroid Build Coastguard Worker- (void)removeEnumForKey:(int32_t)aKey {
4695*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4696*1b3f573fSAndroid Build Coastguard Worker}
4697*1b3f573fSAndroid Build Coastguard Worker
4698*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
4699*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4700*1b3f573fSAndroid Build Coastguard Worker}
4701*1b3f573fSAndroid Build Coastguard Worker
4702*1b3f573fSAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(int32_t)key {
4703*1b3f573fSAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
4704*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
4705*1b3f573fSAndroid Build Coastguard Worker                format:@"GPBInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
4706*1b3f573fSAndroid Build Coastguard Worker                       value];
4707*1b3f573fSAndroid Build Coastguard Worker  }
4708*1b3f573fSAndroid Build Coastguard Worker
4709*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
4710*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
4711*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4712*1b3f573fSAndroid Build Coastguard Worker  }
4713*1b3f573fSAndroid Build Coastguard Worker}
4714*1b3f573fSAndroid Build Coastguard Worker
4715*1b3f573fSAndroid Build Coastguard Worker@end
4716*1b3f573fSAndroid Build Coastguard Worker
4717*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 -> Object
4718*1b3f573fSAndroid Build Coastguard Worker
4719*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32ObjectDictionary {
4720*1b3f573fSAndroid Build Coastguard Worker @package
4721*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4722*1b3f573fSAndroid Build Coastguard Worker}
4723*1b3f573fSAndroid Build Coastguard Worker
4724*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
4725*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
4726*1b3f573fSAndroid Build Coastguard Worker}
4727*1b3f573fSAndroid Build Coastguard Worker
4728*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
4729*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int32_t [])keys
4730*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
4731*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
4732*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4733*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4734*1b3f573fSAndroid Build Coastguard Worker    if (count && objects && keys) {
4735*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4736*1b3f573fSAndroid Build Coastguard Worker        if (!objects[i]) {
4737*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
4738*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
4739*1b3f573fSAndroid Build Coastguard Worker        }
4740*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
4741*1b3f573fSAndroid Build Coastguard Worker      }
4742*1b3f573fSAndroid Build Coastguard Worker    }
4743*1b3f573fSAndroid Build Coastguard Worker  }
4744*1b3f573fSAndroid Build Coastguard Worker  return self;
4745*1b3f573fSAndroid Build Coastguard Worker}
4746*1b3f573fSAndroid Build Coastguard Worker
4747*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32ObjectDictionary *)dictionary {
4748*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
4749*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4750*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
4751*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4752*1b3f573fSAndroid Build Coastguard Worker    }
4753*1b3f573fSAndroid Build Coastguard Worker  }
4754*1b3f573fSAndroid Build Coastguard Worker  return self;
4755*1b3f573fSAndroid Build Coastguard Worker}
4756*1b3f573fSAndroid Build Coastguard Worker
4757*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4758*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
4759*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
4760*1b3f573fSAndroid Build Coastguard Worker}
4761*1b3f573fSAndroid Build Coastguard Worker
4762*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
4763*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4764*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4765*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
4766*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
4767*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
4768*1b3f573fSAndroid Build Coastguard Worker}
4769*1b3f573fSAndroid Build Coastguard Worker
4770*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4771*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self];
4772*1b3f573fSAndroid Build Coastguard Worker}
4773*1b3f573fSAndroid Build Coastguard Worker
4774*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4775*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
4776*1b3f573fSAndroid Build Coastguard Worker    return YES;
4777*1b3f573fSAndroid Build Coastguard Worker  }
4778*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt32ObjectDictionary class]]) {
4779*1b3f573fSAndroid Build Coastguard Worker    return NO;
4780*1b3f573fSAndroid Build Coastguard Worker  }
4781*1b3f573fSAndroid Build Coastguard Worker  GPBInt32ObjectDictionary *otherDictionary = other;
4782*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4783*1b3f573fSAndroid Build Coastguard Worker}
4784*1b3f573fSAndroid Build Coastguard Worker
4785*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
4786*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4787*1b3f573fSAndroid Build Coastguard Worker}
4788*1b3f573fSAndroid Build Coastguard Worker
4789*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
4790*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
4791*1b3f573fSAndroid Build Coastguard Worker}
4792*1b3f573fSAndroid Build Coastguard Worker
4793*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
4794*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
4795*1b3f573fSAndroid Build Coastguard Worker}
4796*1b3f573fSAndroid Build Coastguard Worker
4797*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
4798*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int32_t key, id object, BOOL *stop))block {
4799*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
4800*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4801*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4802*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4803*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4804*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
4805*1b3f573fSAndroid Build Coastguard Worker    block([aKey intValue], aObject, &stop);
4806*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
4807*1b3f573fSAndroid Build Coastguard Worker      break;
4808*1b3f573fSAndroid Build Coastguard Worker    }
4809*1b3f573fSAndroid Build Coastguard Worker  }
4810*1b3f573fSAndroid Build Coastguard Worker}
4811*1b3f573fSAndroid Build Coastguard Worker
4812*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isInitialized {
4813*1b3f573fSAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
4814*1b3f573fSAndroid Build Coastguard Worker    if (!msg.initialized) {
4815*1b3f573fSAndroid Build Coastguard Worker      return NO;
4816*1b3f573fSAndroid Build Coastguard Worker    }
4817*1b3f573fSAndroid Build Coastguard Worker  }
4818*1b3f573fSAndroid Build Coastguard Worker  return YES;
4819*1b3f573fSAndroid Build Coastguard Worker}
4820*1b3f573fSAndroid Build Coastguard Worker
4821*1b3f573fSAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
4822*1b3f573fSAndroid Build Coastguard Worker  GPBInt32ObjectDictionary *newDict =
4823*1b3f573fSAndroid Build Coastguard Worker      [[GPBInt32ObjectDictionary alloc] init];
4824*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
4825*1b3f573fSAndroid Build Coastguard Worker  id aKey;
4826*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
4827*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4828*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
4829*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
4830*1b3f573fSAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
4831*1b3f573fSAndroid Build Coastguard Worker    [copiedMsg release];
4832*1b3f573fSAndroid Build Coastguard Worker  }
4833*1b3f573fSAndroid Build Coastguard Worker  return newDict;
4834*1b3f573fSAndroid Build Coastguard Worker}
4835*1b3f573fSAndroid Build Coastguard Worker
4836*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4837*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4838*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
4839*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
4840*1b3f573fSAndroid Build Coastguard Worker    return 0;
4841*1b3f573fSAndroid Build Coastguard Worker  }
4842*1b3f573fSAndroid Build Coastguard Worker
4843*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4844*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4845*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
4846*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4847*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4848*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4849*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
4850*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
4851*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
4852*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4853*1b3f573fSAndroid Build Coastguard Worker  }
4854*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
4855*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
4856*1b3f573fSAndroid Build Coastguard Worker  return result;
4857*1b3f573fSAndroid Build Coastguard Worker}
4858*1b3f573fSAndroid Build Coastguard Worker
4859*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4860*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
4861*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
4862*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
4863*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
4864*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
4865*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
4866*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
4867*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
4868*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
4869*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
4870*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
4871*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedKey = [aKey intValue];
4872*1b3f573fSAndroid Build Coastguard Worker    id unwrappedValue = aObject;
4873*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
4874*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
4875*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
4876*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
4877*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
4878*1b3f573fSAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
4879*1b3f573fSAndroid Build Coastguard Worker  }
4880*1b3f573fSAndroid Build Coastguard Worker}
4881*1b3f573fSAndroid Build Coastguard Worker
4882*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
4883*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
4884*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueInt32)];
4885*1b3f573fSAndroid Build Coastguard Worker}
4886*1b3f573fSAndroid Build Coastguard Worker
4887*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
4888*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(int32_t key, id object, BOOL *stop) {
4889*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
4890*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%d", key], object);
4891*1b3f573fSAndroid Build Coastguard Worker  }];
4892*1b3f573fSAndroid Build Coastguard Worker}
4893*1b3f573fSAndroid Build Coastguard Worker
4894*1b3f573fSAndroid Build Coastguard Worker- (id)objectForKey:(int32_t)key {
4895*1b3f573fSAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
4896*1b3f573fSAndroid Build Coastguard Worker  return result;
4897*1b3f573fSAndroid Build Coastguard Worker}
4898*1b3f573fSAndroid Build Coastguard Worker
4899*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32ObjectDictionary *)otherDictionary {
4900*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
4901*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4902*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
4903*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
4904*1b3f573fSAndroid Build Coastguard Worker    }
4905*1b3f573fSAndroid Build Coastguard Worker  }
4906*1b3f573fSAndroid Build Coastguard Worker}
4907*1b3f573fSAndroid Build Coastguard Worker
4908*1b3f573fSAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(int32_t)key {
4909*1b3f573fSAndroid Build Coastguard Worker  if (!object) {
4910*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
4911*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
4912*1b3f573fSAndroid Build Coastguard Worker  }
4913*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
4914*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
4915*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
4916*1b3f573fSAndroid Build Coastguard Worker  }
4917*1b3f573fSAndroid Build Coastguard Worker}
4918*1b3f573fSAndroid Build Coastguard Worker
4919*1b3f573fSAndroid Build Coastguard Worker- (void)removeObjectForKey:(int32_t)aKey {
4920*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
4921*1b3f573fSAndroid Build Coastguard Worker}
4922*1b3f573fSAndroid Build Coastguard Worker
4923*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
4924*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
4925*1b3f573fSAndroid Build Coastguard Worker}
4926*1b3f573fSAndroid Build Coastguard Worker
4927*1b3f573fSAndroid Build Coastguard Worker@end
4928*1b3f573fSAndroid Build Coastguard Worker
4929*1b3f573fSAndroid Build Coastguard Worker// clang-format on
4930*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt64, uint64_t)
4931*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
4932*1b3f573fSAndroid Build Coastguard Worker// clang-format off
4933*1b3f573fSAndroid Build Coastguard Worker
4934*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> UInt32
4935*1b3f573fSAndroid Build Coastguard Worker
4936*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64UInt32Dictionary {
4937*1b3f573fSAndroid Build Coastguard Worker @package
4938*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
4939*1b3f573fSAndroid Build Coastguard Worker}
4940*1b3f573fSAndroid Build Coastguard Worker
4941*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
4942*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
4943*1b3f573fSAndroid Build Coastguard Worker}
4944*1b3f573fSAndroid Build Coastguard Worker
4945*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
4946*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
4947*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
4948*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
4949*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4950*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
4951*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
4952*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
4953*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4954*1b3f573fSAndroid Build Coastguard Worker      }
4955*1b3f573fSAndroid Build Coastguard Worker    }
4956*1b3f573fSAndroid Build Coastguard Worker  }
4957*1b3f573fSAndroid Build Coastguard Worker  return self;
4958*1b3f573fSAndroid Build Coastguard Worker}
4959*1b3f573fSAndroid Build Coastguard Worker
4960*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary {
4961*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
4962*1b3f573fSAndroid Build Coastguard Worker  if (self) {
4963*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
4964*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4965*1b3f573fSAndroid Build Coastguard Worker    }
4966*1b3f573fSAndroid Build Coastguard Worker  }
4967*1b3f573fSAndroid Build Coastguard Worker  return self;
4968*1b3f573fSAndroid Build Coastguard Worker}
4969*1b3f573fSAndroid Build Coastguard Worker
4970*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
4971*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
4972*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
4973*1b3f573fSAndroid Build Coastguard Worker}
4974*1b3f573fSAndroid Build Coastguard Worker
4975*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
4976*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
4977*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
4978*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
4979*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
4980*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
4981*1b3f573fSAndroid Build Coastguard Worker}
4982*1b3f573fSAndroid Build Coastguard Worker
4983*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
4984*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
4985*1b3f573fSAndroid Build Coastguard Worker}
4986*1b3f573fSAndroid Build Coastguard Worker
4987*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
4988*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
4989*1b3f573fSAndroid Build Coastguard Worker    return YES;
4990*1b3f573fSAndroid Build Coastguard Worker  }
4991*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64UInt32Dictionary class]]) {
4992*1b3f573fSAndroid Build Coastguard Worker    return NO;
4993*1b3f573fSAndroid Build Coastguard Worker  }
4994*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64UInt32Dictionary *otherDictionary = other;
4995*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
4996*1b3f573fSAndroid Build Coastguard Worker}
4997*1b3f573fSAndroid Build Coastguard Worker
4998*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
4999*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5000*1b3f573fSAndroid Build Coastguard Worker}
5001*1b3f573fSAndroid Build Coastguard Worker
5002*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
5003*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5004*1b3f573fSAndroid Build Coastguard Worker}
5005*1b3f573fSAndroid Build Coastguard Worker
5006*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
5007*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5008*1b3f573fSAndroid Build Coastguard Worker}
5009*1b3f573fSAndroid Build Coastguard Worker
5010*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
5011*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, uint32_t value, BOOL *stop))block {
5012*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
5013*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5014*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5015*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5016*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5017*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5018*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue unsignedIntValue], &stop);
5019*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
5020*1b3f573fSAndroid Build Coastguard Worker      break;
5021*1b3f573fSAndroid Build Coastguard Worker    }
5022*1b3f573fSAndroid Build Coastguard Worker  }
5023*1b3f573fSAndroid Build Coastguard Worker}
5024*1b3f573fSAndroid Build Coastguard Worker
5025*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5026*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5027*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5028*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
5029*1b3f573fSAndroid Build Coastguard Worker    return 0;
5030*1b3f573fSAndroid Build Coastguard Worker  }
5031*1b3f573fSAndroid Build Coastguard Worker
5032*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5033*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5034*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
5035*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5036*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5037*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5038*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5039*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5040*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
5041*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5042*1b3f573fSAndroid Build Coastguard Worker  }
5043*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5044*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
5045*1b3f573fSAndroid Build Coastguard Worker  return result;
5046*1b3f573fSAndroid Build Coastguard Worker}
5047*1b3f573fSAndroid Build Coastguard Worker
5048*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5049*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5050*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5051*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5052*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5053*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5054*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5055*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5056*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5057*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5058*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5059*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
5060*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5061*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
5062*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5063*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5064*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5065*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
5066*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5067*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5068*1b3f573fSAndroid Build Coastguard Worker  }
5069*1b3f573fSAndroid Build Coastguard Worker}
5070*1b3f573fSAndroid Build Coastguard Worker
5071*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5072*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5073*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt64)];
5074*1b3f573fSAndroid Build Coastguard Worker}
5075*1b3f573fSAndroid Build Coastguard Worker
5076*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5077*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(uint64_t key, uint32_t value, BOOL *stop) {
5078*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
5079*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%u", value]);
5080*1b3f573fSAndroid Build Coastguard Worker  }];
5081*1b3f573fSAndroid Build Coastguard Worker}
5082*1b3f573fSAndroid Build Coastguard Worker
5083*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint64_t)key {
5084*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5085*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
5086*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
5087*1b3f573fSAndroid Build Coastguard Worker  }
5088*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
5089*1b3f573fSAndroid Build Coastguard Worker}
5090*1b3f573fSAndroid Build Coastguard Worker
5091*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64UInt32Dictionary *)otherDictionary {
5092*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
5093*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5094*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
5095*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5096*1b3f573fSAndroid Build Coastguard Worker    }
5097*1b3f573fSAndroid Build Coastguard Worker  }
5098*1b3f573fSAndroid Build Coastguard Worker}
5099*1b3f573fSAndroid Build Coastguard Worker
5100*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(uint64_t)key {
5101*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5102*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
5103*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5104*1b3f573fSAndroid Build Coastguard Worker  }
5105*1b3f573fSAndroid Build Coastguard Worker}
5106*1b3f573fSAndroid Build Coastguard Worker
5107*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(uint64_t)aKey {
5108*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5109*1b3f573fSAndroid Build Coastguard Worker}
5110*1b3f573fSAndroid Build Coastguard Worker
5111*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
5112*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5113*1b3f573fSAndroid Build Coastguard Worker}
5114*1b3f573fSAndroid Build Coastguard Worker
5115*1b3f573fSAndroid Build Coastguard Worker@end
5116*1b3f573fSAndroid Build Coastguard Worker
5117*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> Int32
5118*1b3f573fSAndroid Build Coastguard Worker
5119*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64Int32Dictionary {
5120*1b3f573fSAndroid Build Coastguard Worker @package
5121*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5122*1b3f573fSAndroid Build Coastguard Worker}
5123*1b3f573fSAndroid Build Coastguard Worker
5124*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
5125*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
5126*1b3f573fSAndroid Build Coastguard Worker}
5127*1b3f573fSAndroid Build Coastguard Worker
5128*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
5129*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const uint64_t [])keys
5130*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
5131*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
5132*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5133*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5134*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
5135*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5136*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5137*1b3f573fSAndroid Build Coastguard Worker      }
5138*1b3f573fSAndroid Build Coastguard Worker    }
5139*1b3f573fSAndroid Build Coastguard Worker  }
5140*1b3f573fSAndroid Build Coastguard Worker  return self;
5141*1b3f573fSAndroid Build Coastguard Worker}
5142*1b3f573fSAndroid Build Coastguard Worker
5143*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64Int32Dictionary *)dictionary {
5144*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
5145*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5146*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
5147*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5148*1b3f573fSAndroid Build Coastguard Worker    }
5149*1b3f573fSAndroid Build Coastguard Worker  }
5150*1b3f573fSAndroid Build Coastguard Worker  return self;
5151*1b3f573fSAndroid Build Coastguard Worker}
5152*1b3f573fSAndroid Build Coastguard Worker
5153*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5154*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
5155*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
5156*1b3f573fSAndroid Build Coastguard Worker}
5157*1b3f573fSAndroid Build Coastguard Worker
5158*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
5159*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5160*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5161*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
5162*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
5163*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
5164*1b3f573fSAndroid Build Coastguard Worker}
5165*1b3f573fSAndroid Build Coastguard Worker
5166*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5167*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self];
5168*1b3f573fSAndroid Build Coastguard Worker}
5169*1b3f573fSAndroid Build Coastguard Worker
5170*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5171*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
5172*1b3f573fSAndroid Build Coastguard Worker    return YES;
5173*1b3f573fSAndroid Build Coastguard Worker  }
5174*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64Int32Dictionary class]]) {
5175*1b3f573fSAndroid Build Coastguard Worker    return NO;
5176*1b3f573fSAndroid Build Coastguard Worker  }
5177*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64Int32Dictionary *otherDictionary = other;
5178*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5179*1b3f573fSAndroid Build Coastguard Worker}
5180*1b3f573fSAndroid Build Coastguard Worker
5181*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
5182*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5183*1b3f573fSAndroid Build Coastguard Worker}
5184*1b3f573fSAndroid Build Coastguard Worker
5185*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
5186*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5187*1b3f573fSAndroid Build Coastguard Worker}
5188*1b3f573fSAndroid Build Coastguard Worker
5189*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
5190*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5191*1b3f573fSAndroid Build Coastguard Worker}
5192*1b3f573fSAndroid Build Coastguard Worker
5193*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
5194*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block {
5195*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
5196*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5197*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5198*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5199*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5200*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5201*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue intValue], &stop);
5202*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
5203*1b3f573fSAndroid Build Coastguard Worker      break;
5204*1b3f573fSAndroid Build Coastguard Worker    }
5205*1b3f573fSAndroid Build Coastguard Worker  }
5206*1b3f573fSAndroid Build Coastguard Worker}
5207*1b3f573fSAndroid Build Coastguard Worker
5208*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5209*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5210*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5211*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
5212*1b3f573fSAndroid Build Coastguard Worker    return 0;
5213*1b3f573fSAndroid Build Coastguard Worker  }
5214*1b3f573fSAndroid Build Coastguard Worker
5215*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5216*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5217*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
5218*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5219*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5220*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5221*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5222*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5223*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
5224*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5225*1b3f573fSAndroid Build Coastguard Worker  }
5226*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5227*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
5228*1b3f573fSAndroid Build Coastguard Worker  return result;
5229*1b3f573fSAndroid Build Coastguard Worker}
5230*1b3f573fSAndroid Build Coastguard Worker
5231*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5232*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5233*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5234*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5235*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5236*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5237*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5238*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5239*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5240*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5241*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5242*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
5243*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5244*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
5245*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5246*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5247*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5248*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
5249*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5250*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5251*1b3f573fSAndroid Build Coastguard Worker  }
5252*1b3f573fSAndroid Build Coastguard Worker}
5253*1b3f573fSAndroid Build Coastguard Worker
5254*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5255*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5256*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt64)];
5257*1b3f573fSAndroid Build Coastguard Worker}
5258*1b3f573fSAndroid Build Coastguard Worker
5259*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5260*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
5261*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
5262*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%d", value]);
5263*1b3f573fSAndroid Build Coastguard Worker  }];
5264*1b3f573fSAndroid Build Coastguard Worker}
5265*1b3f573fSAndroid Build Coastguard Worker
5266*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint64_t)key {
5267*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5268*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
5269*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped intValue];
5270*1b3f573fSAndroid Build Coastguard Worker  }
5271*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
5272*1b3f573fSAndroid Build Coastguard Worker}
5273*1b3f573fSAndroid Build Coastguard Worker
5274*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64Int32Dictionary *)otherDictionary {
5275*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
5276*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5277*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
5278*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5279*1b3f573fSAndroid Build Coastguard Worker    }
5280*1b3f573fSAndroid Build Coastguard Worker  }
5281*1b3f573fSAndroid Build Coastguard Worker}
5282*1b3f573fSAndroid Build Coastguard Worker
5283*1b3f573fSAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(uint64_t)key {
5284*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5285*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
5286*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5287*1b3f573fSAndroid Build Coastguard Worker  }
5288*1b3f573fSAndroid Build Coastguard Worker}
5289*1b3f573fSAndroid Build Coastguard Worker
5290*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt32ForKey:(uint64_t)aKey {
5291*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5292*1b3f573fSAndroid Build Coastguard Worker}
5293*1b3f573fSAndroid Build Coastguard Worker
5294*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
5295*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5296*1b3f573fSAndroid Build Coastguard Worker}
5297*1b3f573fSAndroid Build Coastguard Worker
5298*1b3f573fSAndroid Build Coastguard Worker@end
5299*1b3f573fSAndroid Build Coastguard Worker
5300*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> UInt64
5301*1b3f573fSAndroid Build Coastguard Worker
5302*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64UInt64Dictionary {
5303*1b3f573fSAndroid Build Coastguard Worker @package
5304*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5305*1b3f573fSAndroid Build Coastguard Worker}
5306*1b3f573fSAndroid Build Coastguard Worker
5307*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
5308*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
5309*1b3f573fSAndroid Build Coastguard Worker}
5310*1b3f573fSAndroid Build Coastguard Worker
5311*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
5312*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
5313*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
5314*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
5315*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5316*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5317*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
5318*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5319*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5320*1b3f573fSAndroid Build Coastguard Worker      }
5321*1b3f573fSAndroid Build Coastguard Worker    }
5322*1b3f573fSAndroid Build Coastguard Worker  }
5323*1b3f573fSAndroid Build Coastguard Worker  return self;
5324*1b3f573fSAndroid Build Coastguard Worker}
5325*1b3f573fSAndroid Build Coastguard Worker
5326*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary {
5327*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
5328*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5329*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
5330*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5331*1b3f573fSAndroid Build Coastguard Worker    }
5332*1b3f573fSAndroid Build Coastguard Worker  }
5333*1b3f573fSAndroid Build Coastguard Worker  return self;
5334*1b3f573fSAndroid Build Coastguard Worker}
5335*1b3f573fSAndroid Build Coastguard Worker
5336*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5337*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
5338*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
5339*1b3f573fSAndroid Build Coastguard Worker}
5340*1b3f573fSAndroid Build Coastguard Worker
5341*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
5342*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5343*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5344*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
5345*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
5346*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
5347*1b3f573fSAndroid Build Coastguard Worker}
5348*1b3f573fSAndroid Build Coastguard Worker
5349*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5350*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
5351*1b3f573fSAndroid Build Coastguard Worker}
5352*1b3f573fSAndroid Build Coastguard Worker
5353*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5354*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
5355*1b3f573fSAndroid Build Coastguard Worker    return YES;
5356*1b3f573fSAndroid Build Coastguard Worker  }
5357*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64UInt64Dictionary class]]) {
5358*1b3f573fSAndroid Build Coastguard Worker    return NO;
5359*1b3f573fSAndroid Build Coastguard Worker  }
5360*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64UInt64Dictionary *otherDictionary = other;
5361*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5362*1b3f573fSAndroid Build Coastguard Worker}
5363*1b3f573fSAndroid Build Coastguard Worker
5364*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
5365*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5366*1b3f573fSAndroid Build Coastguard Worker}
5367*1b3f573fSAndroid Build Coastguard Worker
5368*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
5369*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5370*1b3f573fSAndroid Build Coastguard Worker}
5371*1b3f573fSAndroid Build Coastguard Worker
5372*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
5373*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5374*1b3f573fSAndroid Build Coastguard Worker}
5375*1b3f573fSAndroid Build Coastguard Worker
5376*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
5377*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, uint64_t value, BOOL *stop))block {
5378*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
5379*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5380*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5381*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5382*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5383*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5384*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue unsignedLongLongValue], &stop);
5385*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
5386*1b3f573fSAndroid Build Coastguard Worker      break;
5387*1b3f573fSAndroid Build Coastguard Worker    }
5388*1b3f573fSAndroid Build Coastguard Worker  }
5389*1b3f573fSAndroid Build Coastguard Worker}
5390*1b3f573fSAndroid Build Coastguard Worker
5391*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5392*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5393*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5394*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
5395*1b3f573fSAndroid Build Coastguard Worker    return 0;
5396*1b3f573fSAndroid Build Coastguard Worker  }
5397*1b3f573fSAndroid Build Coastguard Worker
5398*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5399*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5400*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
5401*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5402*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5403*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5404*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5405*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5406*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
5407*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5408*1b3f573fSAndroid Build Coastguard Worker  }
5409*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5410*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
5411*1b3f573fSAndroid Build Coastguard Worker  return result;
5412*1b3f573fSAndroid Build Coastguard Worker}
5413*1b3f573fSAndroid Build Coastguard Worker
5414*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5415*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5416*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5417*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5418*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5419*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5420*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5421*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5422*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5423*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5424*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5425*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
5426*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5427*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
5428*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5429*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5430*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5431*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
5432*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5433*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5434*1b3f573fSAndroid Build Coastguard Worker  }
5435*1b3f573fSAndroid Build Coastguard Worker}
5436*1b3f573fSAndroid Build Coastguard Worker
5437*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5438*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5439*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt64)];
5440*1b3f573fSAndroid Build Coastguard Worker}
5441*1b3f573fSAndroid Build Coastguard Worker
5442*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5443*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(uint64_t key, uint64_t value, BOOL *stop) {
5444*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
5445*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%llu", value]);
5446*1b3f573fSAndroid Build Coastguard Worker  }];
5447*1b3f573fSAndroid Build Coastguard Worker}
5448*1b3f573fSAndroid Build Coastguard Worker
5449*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint64_t)key {
5450*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5451*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
5452*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
5453*1b3f573fSAndroid Build Coastguard Worker  }
5454*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
5455*1b3f573fSAndroid Build Coastguard Worker}
5456*1b3f573fSAndroid Build Coastguard Worker
5457*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64UInt64Dictionary *)otherDictionary {
5458*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
5459*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5460*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
5461*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5462*1b3f573fSAndroid Build Coastguard Worker    }
5463*1b3f573fSAndroid Build Coastguard Worker  }
5464*1b3f573fSAndroid Build Coastguard Worker}
5465*1b3f573fSAndroid Build Coastguard Worker
5466*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(uint64_t)key {
5467*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5468*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
5469*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5470*1b3f573fSAndroid Build Coastguard Worker  }
5471*1b3f573fSAndroid Build Coastguard Worker}
5472*1b3f573fSAndroid Build Coastguard Worker
5473*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(uint64_t)aKey {
5474*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5475*1b3f573fSAndroid Build Coastguard Worker}
5476*1b3f573fSAndroid Build Coastguard Worker
5477*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
5478*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5479*1b3f573fSAndroid Build Coastguard Worker}
5480*1b3f573fSAndroid Build Coastguard Worker
5481*1b3f573fSAndroid Build Coastguard Worker@end
5482*1b3f573fSAndroid Build Coastguard Worker
5483*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> Int64
5484*1b3f573fSAndroid Build Coastguard Worker
5485*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64Int64Dictionary {
5486*1b3f573fSAndroid Build Coastguard Worker @package
5487*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5488*1b3f573fSAndroid Build Coastguard Worker}
5489*1b3f573fSAndroid Build Coastguard Worker
5490*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
5491*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
5492*1b3f573fSAndroid Build Coastguard Worker}
5493*1b3f573fSAndroid Build Coastguard Worker
5494*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
5495*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const uint64_t [])keys
5496*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
5497*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
5498*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5499*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5500*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
5501*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5502*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5503*1b3f573fSAndroid Build Coastguard Worker      }
5504*1b3f573fSAndroid Build Coastguard Worker    }
5505*1b3f573fSAndroid Build Coastguard Worker  }
5506*1b3f573fSAndroid Build Coastguard Worker  return self;
5507*1b3f573fSAndroid Build Coastguard Worker}
5508*1b3f573fSAndroid Build Coastguard Worker
5509*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64Int64Dictionary *)dictionary {
5510*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
5511*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5512*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
5513*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5514*1b3f573fSAndroid Build Coastguard Worker    }
5515*1b3f573fSAndroid Build Coastguard Worker  }
5516*1b3f573fSAndroid Build Coastguard Worker  return self;
5517*1b3f573fSAndroid Build Coastguard Worker}
5518*1b3f573fSAndroid Build Coastguard Worker
5519*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5520*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
5521*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
5522*1b3f573fSAndroid Build Coastguard Worker}
5523*1b3f573fSAndroid Build Coastguard Worker
5524*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
5525*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5526*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5527*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
5528*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
5529*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
5530*1b3f573fSAndroid Build Coastguard Worker}
5531*1b3f573fSAndroid Build Coastguard Worker
5532*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5533*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self];
5534*1b3f573fSAndroid Build Coastguard Worker}
5535*1b3f573fSAndroid Build Coastguard Worker
5536*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5537*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
5538*1b3f573fSAndroid Build Coastguard Worker    return YES;
5539*1b3f573fSAndroid Build Coastguard Worker  }
5540*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64Int64Dictionary class]]) {
5541*1b3f573fSAndroid Build Coastguard Worker    return NO;
5542*1b3f573fSAndroid Build Coastguard Worker  }
5543*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64Int64Dictionary *otherDictionary = other;
5544*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5545*1b3f573fSAndroid Build Coastguard Worker}
5546*1b3f573fSAndroid Build Coastguard Worker
5547*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
5548*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5549*1b3f573fSAndroid Build Coastguard Worker}
5550*1b3f573fSAndroid Build Coastguard Worker
5551*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
5552*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5553*1b3f573fSAndroid Build Coastguard Worker}
5554*1b3f573fSAndroid Build Coastguard Worker
5555*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
5556*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5557*1b3f573fSAndroid Build Coastguard Worker}
5558*1b3f573fSAndroid Build Coastguard Worker
5559*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
5560*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int64_t value, BOOL *stop))block {
5561*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
5562*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5563*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5564*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5565*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5566*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5567*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue longLongValue], &stop);
5568*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
5569*1b3f573fSAndroid Build Coastguard Worker      break;
5570*1b3f573fSAndroid Build Coastguard Worker    }
5571*1b3f573fSAndroid Build Coastguard Worker  }
5572*1b3f573fSAndroid Build Coastguard Worker}
5573*1b3f573fSAndroid Build Coastguard Worker
5574*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5575*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5576*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5577*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
5578*1b3f573fSAndroid Build Coastguard Worker    return 0;
5579*1b3f573fSAndroid Build Coastguard Worker  }
5580*1b3f573fSAndroid Build Coastguard Worker
5581*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5582*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5583*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
5584*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5585*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5586*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5587*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5588*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5589*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
5590*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5591*1b3f573fSAndroid Build Coastguard Worker  }
5592*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5593*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
5594*1b3f573fSAndroid Build Coastguard Worker  return result;
5595*1b3f573fSAndroid Build Coastguard Worker}
5596*1b3f573fSAndroid Build Coastguard Worker
5597*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5598*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5599*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5600*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5601*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5602*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5603*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5604*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5605*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5606*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5607*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5608*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
5609*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5610*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
5611*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5612*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5613*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5614*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
5615*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5616*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5617*1b3f573fSAndroid Build Coastguard Worker  }
5618*1b3f573fSAndroid Build Coastguard Worker}
5619*1b3f573fSAndroid Build Coastguard Worker
5620*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5621*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5622*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt64)];
5623*1b3f573fSAndroid Build Coastguard Worker}
5624*1b3f573fSAndroid Build Coastguard Worker
5625*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5626*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(uint64_t key, int64_t value, BOOL *stop) {
5627*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
5628*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%lld", value]);
5629*1b3f573fSAndroid Build Coastguard Worker  }];
5630*1b3f573fSAndroid Build Coastguard Worker}
5631*1b3f573fSAndroid Build Coastguard Worker
5632*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint64_t)key {
5633*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5634*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
5635*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
5636*1b3f573fSAndroid Build Coastguard Worker  }
5637*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
5638*1b3f573fSAndroid Build Coastguard Worker}
5639*1b3f573fSAndroid Build Coastguard Worker
5640*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64Int64Dictionary *)otherDictionary {
5641*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
5642*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5643*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
5644*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5645*1b3f573fSAndroid Build Coastguard Worker    }
5646*1b3f573fSAndroid Build Coastguard Worker  }
5647*1b3f573fSAndroid Build Coastguard Worker}
5648*1b3f573fSAndroid Build Coastguard Worker
5649*1b3f573fSAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(uint64_t)key {
5650*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5651*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
5652*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5653*1b3f573fSAndroid Build Coastguard Worker  }
5654*1b3f573fSAndroid Build Coastguard Worker}
5655*1b3f573fSAndroid Build Coastguard Worker
5656*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt64ForKey:(uint64_t)aKey {
5657*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5658*1b3f573fSAndroid Build Coastguard Worker}
5659*1b3f573fSAndroid Build Coastguard Worker
5660*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
5661*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5662*1b3f573fSAndroid Build Coastguard Worker}
5663*1b3f573fSAndroid Build Coastguard Worker
5664*1b3f573fSAndroid Build Coastguard Worker@end
5665*1b3f573fSAndroid Build Coastguard Worker
5666*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> Bool
5667*1b3f573fSAndroid Build Coastguard Worker
5668*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64BoolDictionary {
5669*1b3f573fSAndroid Build Coastguard Worker @package
5670*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5671*1b3f573fSAndroid Build Coastguard Worker}
5672*1b3f573fSAndroid Build Coastguard Worker
5673*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
5674*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
5675*1b3f573fSAndroid Build Coastguard Worker}
5676*1b3f573fSAndroid Build Coastguard Worker
5677*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
5678*1b3f573fSAndroid Build Coastguard Worker                      forKeys:(const uint64_t [])keys
5679*1b3f573fSAndroid Build Coastguard Worker                        count:(NSUInteger)count {
5680*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
5681*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5682*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5683*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
5684*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5685*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5686*1b3f573fSAndroid Build Coastguard Worker      }
5687*1b3f573fSAndroid Build Coastguard Worker    }
5688*1b3f573fSAndroid Build Coastguard Worker  }
5689*1b3f573fSAndroid Build Coastguard Worker  return self;
5690*1b3f573fSAndroid Build Coastguard Worker}
5691*1b3f573fSAndroid Build Coastguard Worker
5692*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64BoolDictionary *)dictionary {
5693*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
5694*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5695*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
5696*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5697*1b3f573fSAndroid Build Coastguard Worker    }
5698*1b3f573fSAndroid Build Coastguard Worker  }
5699*1b3f573fSAndroid Build Coastguard Worker  return self;
5700*1b3f573fSAndroid Build Coastguard Worker}
5701*1b3f573fSAndroid Build Coastguard Worker
5702*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5703*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
5704*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
5705*1b3f573fSAndroid Build Coastguard Worker}
5706*1b3f573fSAndroid Build Coastguard Worker
5707*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
5708*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5709*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5710*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
5711*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
5712*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
5713*1b3f573fSAndroid Build Coastguard Worker}
5714*1b3f573fSAndroid Build Coastguard Worker
5715*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5716*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
5717*1b3f573fSAndroid Build Coastguard Worker}
5718*1b3f573fSAndroid Build Coastguard Worker
5719*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5720*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
5721*1b3f573fSAndroid Build Coastguard Worker    return YES;
5722*1b3f573fSAndroid Build Coastguard Worker  }
5723*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64BoolDictionary class]]) {
5724*1b3f573fSAndroid Build Coastguard Worker    return NO;
5725*1b3f573fSAndroid Build Coastguard Worker  }
5726*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64BoolDictionary *otherDictionary = other;
5727*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5728*1b3f573fSAndroid Build Coastguard Worker}
5729*1b3f573fSAndroid Build Coastguard Worker
5730*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
5731*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5732*1b3f573fSAndroid Build Coastguard Worker}
5733*1b3f573fSAndroid Build Coastguard Worker
5734*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
5735*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5736*1b3f573fSAndroid Build Coastguard Worker}
5737*1b3f573fSAndroid Build Coastguard Worker
5738*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
5739*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5740*1b3f573fSAndroid Build Coastguard Worker}
5741*1b3f573fSAndroid Build Coastguard Worker
5742*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
5743*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, BOOL value, BOOL *stop))block {
5744*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
5745*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5746*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5747*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5748*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5749*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5750*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue boolValue], &stop);
5751*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
5752*1b3f573fSAndroid Build Coastguard Worker      break;
5753*1b3f573fSAndroid Build Coastguard Worker    }
5754*1b3f573fSAndroid Build Coastguard Worker  }
5755*1b3f573fSAndroid Build Coastguard Worker}
5756*1b3f573fSAndroid Build Coastguard Worker
5757*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5758*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5759*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5760*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
5761*1b3f573fSAndroid Build Coastguard Worker    return 0;
5762*1b3f573fSAndroid Build Coastguard Worker  }
5763*1b3f573fSAndroid Build Coastguard Worker
5764*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5765*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5766*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
5767*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5768*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5769*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5770*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5771*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5772*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
5773*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5774*1b3f573fSAndroid Build Coastguard Worker  }
5775*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5776*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
5777*1b3f573fSAndroid Build Coastguard Worker  return result;
5778*1b3f573fSAndroid Build Coastguard Worker}
5779*1b3f573fSAndroid Build Coastguard Worker
5780*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5781*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5782*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5783*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5784*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5785*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5786*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5787*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5788*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5789*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5790*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5791*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
5792*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5793*1b3f573fSAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
5794*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5795*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5796*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5797*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
5798*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5799*1b3f573fSAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5800*1b3f573fSAndroid Build Coastguard Worker  }
5801*1b3f573fSAndroid Build Coastguard Worker}
5802*1b3f573fSAndroid Build Coastguard Worker
5803*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5804*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5805*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt64)];
5806*1b3f573fSAndroid Build Coastguard Worker}
5807*1b3f573fSAndroid Build Coastguard Worker
5808*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5809*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(uint64_t key, BOOL value, BOOL *stop) {
5810*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
5811*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], (value ? @"true" : @"false"));
5812*1b3f573fSAndroid Build Coastguard Worker  }];
5813*1b3f573fSAndroid Build Coastguard Worker}
5814*1b3f573fSAndroid Build Coastguard Worker
5815*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(uint64_t)key {
5816*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5817*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
5818*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped boolValue];
5819*1b3f573fSAndroid Build Coastguard Worker  }
5820*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
5821*1b3f573fSAndroid Build Coastguard Worker}
5822*1b3f573fSAndroid Build Coastguard Worker
5823*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64BoolDictionary *)otherDictionary {
5824*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
5825*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5826*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
5827*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
5828*1b3f573fSAndroid Build Coastguard Worker    }
5829*1b3f573fSAndroid Build Coastguard Worker  }
5830*1b3f573fSAndroid Build Coastguard Worker}
5831*1b3f573fSAndroid Build Coastguard Worker
5832*1b3f573fSAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(uint64_t)key {
5833*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
5834*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
5835*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
5836*1b3f573fSAndroid Build Coastguard Worker  }
5837*1b3f573fSAndroid Build Coastguard Worker}
5838*1b3f573fSAndroid Build Coastguard Worker
5839*1b3f573fSAndroid Build Coastguard Worker- (void)removeBoolForKey:(uint64_t)aKey {
5840*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
5841*1b3f573fSAndroid Build Coastguard Worker}
5842*1b3f573fSAndroid Build Coastguard Worker
5843*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
5844*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
5845*1b3f573fSAndroid Build Coastguard Worker}
5846*1b3f573fSAndroid Build Coastguard Worker
5847*1b3f573fSAndroid Build Coastguard Worker@end
5848*1b3f573fSAndroid Build Coastguard Worker
5849*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> Float
5850*1b3f573fSAndroid Build Coastguard Worker
5851*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64FloatDictionary {
5852*1b3f573fSAndroid Build Coastguard Worker @package
5853*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
5854*1b3f573fSAndroid Build Coastguard Worker}
5855*1b3f573fSAndroid Build Coastguard Worker
5856*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
5857*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
5858*1b3f573fSAndroid Build Coastguard Worker}
5859*1b3f573fSAndroid Build Coastguard Worker
5860*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
5861*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const uint64_t [])keys
5862*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
5863*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
5864*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5865*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
5866*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
5867*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
5868*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5869*1b3f573fSAndroid Build Coastguard Worker      }
5870*1b3f573fSAndroid Build Coastguard Worker    }
5871*1b3f573fSAndroid Build Coastguard Worker  }
5872*1b3f573fSAndroid Build Coastguard Worker  return self;
5873*1b3f573fSAndroid Build Coastguard Worker}
5874*1b3f573fSAndroid Build Coastguard Worker
5875*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64FloatDictionary *)dictionary {
5876*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
5877*1b3f573fSAndroid Build Coastguard Worker  if (self) {
5878*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
5879*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5880*1b3f573fSAndroid Build Coastguard Worker    }
5881*1b3f573fSAndroid Build Coastguard Worker  }
5882*1b3f573fSAndroid Build Coastguard Worker  return self;
5883*1b3f573fSAndroid Build Coastguard Worker}
5884*1b3f573fSAndroid Build Coastguard Worker
5885*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
5886*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
5887*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
5888*1b3f573fSAndroid Build Coastguard Worker}
5889*1b3f573fSAndroid Build Coastguard Worker
5890*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
5891*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
5892*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
5893*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
5894*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
5895*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
5896*1b3f573fSAndroid Build Coastguard Worker}
5897*1b3f573fSAndroid Build Coastguard Worker
5898*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
5899*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64FloatDictionary allocWithZone:zone] initWithDictionary:self];
5900*1b3f573fSAndroid Build Coastguard Worker}
5901*1b3f573fSAndroid Build Coastguard Worker
5902*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
5903*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
5904*1b3f573fSAndroid Build Coastguard Worker    return YES;
5905*1b3f573fSAndroid Build Coastguard Worker  }
5906*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64FloatDictionary class]]) {
5907*1b3f573fSAndroid Build Coastguard Worker    return NO;
5908*1b3f573fSAndroid Build Coastguard Worker  }
5909*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64FloatDictionary *otherDictionary = other;
5910*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
5911*1b3f573fSAndroid Build Coastguard Worker}
5912*1b3f573fSAndroid Build Coastguard Worker
5913*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
5914*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5915*1b3f573fSAndroid Build Coastguard Worker}
5916*1b3f573fSAndroid Build Coastguard Worker
5917*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
5918*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
5919*1b3f573fSAndroid Build Coastguard Worker}
5920*1b3f573fSAndroid Build Coastguard Worker
5921*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
5922*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
5923*1b3f573fSAndroid Build Coastguard Worker}
5924*1b3f573fSAndroid Build Coastguard Worker
5925*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
5926*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, float value, BOOL *stop))block {
5927*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
5928*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5929*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5930*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5931*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5932*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5933*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue floatValue], &stop);
5934*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
5935*1b3f573fSAndroid Build Coastguard Worker      break;
5936*1b3f573fSAndroid Build Coastguard Worker    }
5937*1b3f573fSAndroid Build Coastguard Worker  }
5938*1b3f573fSAndroid Build Coastguard Worker}
5939*1b3f573fSAndroid Build Coastguard Worker
5940*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5941*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5942*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
5943*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
5944*1b3f573fSAndroid Build Coastguard Worker    return 0;
5945*1b3f573fSAndroid Build Coastguard Worker  }
5946*1b3f573fSAndroid Build Coastguard Worker
5947*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5948*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5949*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
5950*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5951*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5952*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5953*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5954*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
5955*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
5956*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5957*1b3f573fSAndroid Build Coastguard Worker  }
5958*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
5959*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
5960*1b3f573fSAndroid Build Coastguard Worker  return result;
5961*1b3f573fSAndroid Build Coastguard Worker}
5962*1b3f573fSAndroid Build Coastguard Worker
5963*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5964*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
5965*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
5966*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
5967*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
5968*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
5969*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
5970*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
5971*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
5972*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
5973*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
5974*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
5975*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
5976*1b3f573fSAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
5977*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
5978*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
5979*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
5980*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
5981*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
5982*1b3f573fSAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
5983*1b3f573fSAndroid Build Coastguard Worker  }
5984*1b3f573fSAndroid Build Coastguard Worker}
5985*1b3f573fSAndroid Build Coastguard Worker
5986*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
5987*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
5988*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt64)];
5989*1b3f573fSAndroid Build Coastguard Worker}
5990*1b3f573fSAndroid Build Coastguard Worker
5991*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
5992*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(uint64_t key, float value, BOOL *stop) {
5993*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
5994*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
5995*1b3f573fSAndroid Build Coastguard Worker  }];
5996*1b3f573fSAndroid Build Coastguard Worker}
5997*1b3f573fSAndroid Build Coastguard Worker
5998*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(uint64_t)key {
5999*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6000*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
6001*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped floatValue];
6002*1b3f573fSAndroid Build Coastguard Worker  }
6003*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
6004*1b3f573fSAndroid Build Coastguard Worker}
6005*1b3f573fSAndroid Build Coastguard Worker
6006*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64FloatDictionary *)otherDictionary {
6007*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
6008*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6009*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
6010*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6011*1b3f573fSAndroid Build Coastguard Worker    }
6012*1b3f573fSAndroid Build Coastguard Worker  }
6013*1b3f573fSAndroid Build Coastguard Worker}
6014*1b3f573fSAndroid Build Coastguard Worker
6015*1b3f573fSAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(uint64_t)key {
6016*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6017*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
6018*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6019*1b3f573fSAndroid Build Coastguard Worker  }
6020*1b3f573fSAndroid Build Coastguard Worker}
6021*1b3f573fSAndroid Build Coastguard Worker
6022*1b3f573fSAndroid Build Coastguard Worker- (void)removeFloatForKey:(uint64_t)aKey {
6023*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6024*1b3f573fSAndroid Build Coastguard Worker}
6025*1b3f573fSAndroid Build Coastguard Worker
6026*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
6027*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6028*1b3f573fSAndroid Build Coastguard Worker}
6029*1b3f573fSAndroid Build Coastguard Worker
6030*1b3f573fSAndroid Build Coastguard Worker@end
6031*1b3f573fSAndroid Build Coastguard Worker
6032*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> Double
6033*1b3f573fSAndroid Build Coastguard Worker
6034*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64DoubleDictionary {
6035*1b3f573fSAndroid Build Coastguard Worker @package
6036*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6037*1b3f573fSAndroid Build Coastguard Worker}
6038*1b3f573fSAndroid Build Coastguard Worker
6039*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
6040*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
6041*1b3f573fSAndroid Build Coastguard Worker}
6042*1b3f573fSAndroid Build Coastguard Worker
6043*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
6044*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
6045*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
6046*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
6047*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6048*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6049*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
6050*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6051*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6052*1b3f573fSAndroid Build Coastguard Worker      }
6053*1b3f573fSAndroid Build Coastguard Worker    }
6054*1b3f573fSAndroid Build Coastguard Worker  }
6055*1b3f573fSAndroid Build Coastguard Worker  return self;
6056*1b3f573fSAndroid Build Coastguard Worker}
6057*1b3f573fSAndroid Build Coastguard Worker
6058*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64DoubleDictionary *)dictionary {
6059*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
6060*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6061*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
6062*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6063*1b3f573fSAndroid Build Coastguard Worker    }
6064*1b3f573fSAndroid Build Coastguard Worker  }
6065*1b3f573fSAndroid Build Coastguard Worker  return self;
6066*1b3f573fSAndroid Build Coastguard Worker}
6067*1b3f573fSAndroid Build Coastguard Worker
6068*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6069*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
6070*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
6071*1b3f573fSAndroid Build Coastguard Worker}
6072*1b3f573fSAndroid Build Coastguard Worker
6073*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
6074*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6075*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6076*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
6077*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
6078*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
6079*1b3f573fSAndroid Build Coastguard Worker}
6080*1b3f573fSAndroid Build Coastguard Worker
6081*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6082*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self];
6083*1b3f573fSAndroid Build Coastguard Worker}
6084*1b3f573fSAndroid Build Coastguard Worker
6085*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6086*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
6087*1b3f573fSAndroid Build Coastguard Worker    return YES;
6088*1b3f573fSAndroid Build Coastguard Worker  }
6089*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64DoubleDictionary class]]) {
6090*1b3f573fSAndroid Build Coastguard Worker    return NO;
6091*1b3f573fSAndroid Build Coastguard Worker  }
6092*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64DoubleDictionary *otherDictionary = other;
6093*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6094*1b3f573fSAndroid Build Coastguard Worker}
6095*1b3f573fSAndroid Build Coastguard Worker
6096*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
6097*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6098*1b3f573fSAndroid Build Coastguard Worker}
6099*1b3f573fSAndroid Build Coastguard Worker
6100*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
6101*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6102*1b3f573fSAndroid Build Coastguard Worker}
6103*1b3f573fSAndroid Build Coastguard Worker
6104*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
6105*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6106*1b3f573fSAndroid Build Coastguard Worker}
6107*1b3f573fSAndroid Build Coastguard Worker
6108*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
6109*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, double value, BOOL *stop))block {
6110*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
6111*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6112*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6113*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6114*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6115*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6116*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue doubleValue], &stop);
6117*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
6118*1b3f573fSAndroid Build Coastguard Worker      break;
6119*1b3f573fSAndroid Build Coastguard Worker    }
6120*1b3f573fSAndroid Build Coastguard Worker  }
6121*1b3f573fSAndroid Build Coastguard Worker}
6122*1b3f573fSAndroid Build Coastguard Worker
6123*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6124*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6125*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6126*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
6127*1b3f573fSAndroid Build Coastguard Worker    return 0;
6128*1b3f573fSAndroid Build Coastguard Worker  }
6129*1b3f573fSAndroid Build Coastguard Worker
6130*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6131*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6132*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
6133*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6134*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6135*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6136*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6137*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
6138*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
6139*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6140*1b3f573fSAndroid Build Coastguard Worker  }
6141*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6142*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
6143*1b3f573fSAndroid Build Coastguard Worker  return result;
6144*1b3f573fSAndroid Build Coastguard Worker}
6145*1b3f573fSAndroid Build Coastguard Worker
6146*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6147*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6148*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6149*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6150*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6151*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6152*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6153*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6154*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6155*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6156*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6157*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
6158*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
6159*1b3f573fSAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
6160*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6161*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6162*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6163*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
6164*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6165*1b3f573fSAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6166*1b3f573fSAndroid Build Coastguard Worker  }
6167*1b3f573fSAndroid Build Coastguard Worker}
6168*1b3f573fSAndroid Build Coastguard Worker
6169*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6170*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6171*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt64)];
6172*1b3f573fSAndroid Build Coastguard Worker}
6173*1b3f573fSAndroid Build Coastguard Worker
6174*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6175*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(uint64_t key, double value, BOOL *stop) {
6176*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
6177*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
6178*1b3f573fSAndroid Build Coastguard Worker  }];
6179*1b3f573fSAndroid Build Coastguard Worker}
6180*1b3f573fSAndroid Build Coastguard Worker
6181*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(uint64_t)key {
6182*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6183*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
6184*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
6185*1b3f573fSAndroid Build Coastguard Worker  }
6186*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
6187*1b3f573fSAndroid Build Coastguard Worker}
6188*1b3f573fSAndroid Build Coastguard Worker
6189*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64DoubleDictionary *)otherDictionary {
6190*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
6191*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6192*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
6193*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6194*1b3f573fSAndroid Build Coastguard Worker    }
6195*1b3f573fSAndroid Build Coastguard Worker  }
6196*1b3f573fSAndroid Build Coastguard Worker}
6197*1b3f573fSAndroid Build Coastguard Worker
6198*1b3f573fSAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(uint64_t)key {
6199*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6200*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
6201*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6202*1b3f573fSAndroid Build Coastguard Worker  }
6203*1b3f573fSAndroid Build Coastguard Worker}
6204*1b3f573fSAndroid Build Coastguard Worker
6205*1b3f573fSAndroid Build Coastguard Worker- (void)removeDoubleForKey:(uint64_t)aKey {
6206*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6207*1b3f573fSAndroid Build Coastguard Worker}
6208*1b3f573fSAndroid Build Coastguard Worker
6209*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
6210*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6211*1b3f573fSAndroid Build Coastguard Worker}
6212*1b3f573fSAndroid Build Coastguard Worker
6213*1b3f573fSAndroid Build Coastguard Worker@end
6214*1b3f573fSAndroid Build Coastguard Worker
6215*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> Enum
6216*1b3f573fSAndroid Build Coastguard Worker
6217*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64EnumDictionary {
6218*1b3f573fSAndroid Build Coastguard Worker @package
6219*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6220*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
6221*1b3f573fSAndroid Build Coastguard Worker}
6222*1b3f573fSAndroid Build Coastguard Worker
6223*1b3f573fSAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
6224*1b3f573fSAndroid Build Coastguard Worker
6225*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
6226*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
6227*1b3f573fSAndroid Build Coastguard Worker}
6228*1b3f573fSAndroid Build Coastguard Worker
6229*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
6230*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
6231*1b3f573fSAndroid Build Coastguard Worker}
6232*1b3f573fSAndroid Build Coastguard Worker
6233*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
6234*1b3f573fSAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
6235*1b3f573fSAndroid Build Coastguard Worker                                   forKeys:(const uint64_t [])keys
6236*1b3f573fSAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
6237*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
6238*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6239*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6240*1b3f573fSAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
6241*1b3f573fSAndroid Build Coastguard Worker    if (count && rawValues && keys) {
6242*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6243*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
6244*1b3f573fSAndroid Build Coastguard Worker      }
6245*1b3f573fSAndroid Build Coastguard Worker    }
6246*1b3f573fSAndroid Build Coastguard Worker  }
6247*1b3f573fSAndroid Build Coastguard Worker  return self;
6248*1b3f573fSAndroid Build Coastguard Worker}
6249*1b3f573fSAndroid Build Coastguard Worker
6250*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64EnumDictionary *)dictionary {
6251*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
6252*1b3f573fSAndroid Build Coastguard Worker                                rawValues:NULL
6253*1b3f573fSAndroid Build Coastguard Worker                                  forKeys:NULL
6254*1b3f573fSAndroid Build Coastguard Worker                                    count:0];
6255*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6256*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
6257*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6258*1b3f573fSAndroid Build Coastguard Worker    }
6259*1b3f573fSAndroid Build Coastguard Worker  }
6260*1b3f573fSAndroid Build Coastguard Worker  return self;
6261*1b3f573fSAndroid Build Coastguard Worker}
6262*1b3f573fSAndroid Build Coastguard Worker
6263*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
6264*1b3f573fSAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
6265*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
6266*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
6267*1b3f573fSAndroid Build Coastguard Worker}
6268*1b3f573fSAndroid Build Coastguard Worker
6269*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
6270*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6271*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6272*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
6273*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
6274*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
6275*1b3f573fSAndroid Build Coastguard Worker}
6276*1b3f573fSAndroid Build Coastguard Worker
6277*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6278*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
6279*1b3f573fSAndroid Build Coastguard Worker}
6280*1b3f573fSAndroid Build Coastguard Worker
6281*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6282*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
6283*1b3f573fSAndroid Build Coastguard Worker    return YES;
6284*1b3f573fSAndroid Build Coastguard Worker  }
6285*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64EnumDictionary class]]) {
6286*1b3f573fSAndroid Build Coastguard Worker    return NO;
6287*1b3f573fSAndroid Build Coastguard Worker  }
6288*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64EnumDictionary *otherDictionary = other;
6289*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6290*1b3f573fSAndroid Build Coastguard Worker}
6291*1b3f573fSAndroid Build Coastguard Worker
6292*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
6293*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6294*1b3f573fSAndroid Build Coastguard Worker}
6295*1b3f573fSAndroid Build Coastguard Worker
6296*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
6297*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6298*1b3f573fSAndroid Build Coastguard Worker}
6299*1b3f573fSAndroid Build Coastguard Worker
6300*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
6301*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6302*1b3f573fSAndroid Build Coastguard Worker}
6303*1b3f573fSAndroid Build Coastguard Worker
6304*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
6305*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block {
6306*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
6307*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6308*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6309*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6310*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6311*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6312*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], [aValue intValue], &stop);
6313*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
6314*1b3f573fSAndroid Build Coastguard Worker      break;
6315*1b3f573fSAndroid Build Coastguard Worker    }
6316*1b3f573fSAndroid Build Coastguard Worker  }
6317*1b3f573fSAndroid Build Coastguard Worker}
6318*1b3f573fSAndroid Build Coastguard Worker
6319*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6320*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6321*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6322*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
6323*1b3f573fSAndroid Build Coastguard Worker    return 0;
6324*1b3f573fSAndroid Build Coastguard Worker  }
6325*1b3f573fSAndroid Build Coastguard Worker
6326*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6327*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6328*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
6329*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6330*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6331*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6332*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6333*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
6334*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
6335*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6336*1b3f573fSAndroid Build Coastguard Worker  }
6337*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6338*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
6339*1b3f573fSAndroid Build Coastguard Worker  return result;
6340*1b3f573fSAndroid Build Coastguard Worker}
6341*1b3f573fSAndroid Build Coastguard Worker
6342*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6343*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6344*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6345*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6346*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6347*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6348*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6349*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6350*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6351*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6352*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6353*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
6354*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
6355*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
6356*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6357*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6358*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6359*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
6360*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6361*1b3f573fSAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6362*1b3f573fSAndroid Build Coastguard Worker  }
6363*1b3f573fSAndroid Build Coastguard Worker}
6364*1b3f573fSAndroid Build Coastguard Worker
6365*1b3f573fSAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
6366*1b3f573fSAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
6367*1b3f573fSAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
6368*1b3f573fSAndroid Build Coastguard Worker  size_t msgSize = ComputeDictUInt64FieldSize(key->valueUInt64, kMapKeyFieldNumber, keyDataType);
6369*1b3f573fSAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
6370*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
6371*1b3f573fSAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
6372*1b3f573fSAndroid Build Coastguard Worker  WriteDictUInt64Field(outputStream, key->valueUInt64, kMapKeyFieldNumber, keyDataType);
6373*1b3f573fSAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
6374*1b3f573fSAndroid Build Coastguard Worker  [outputStream release];
6375*1b3f573fSAndroid Build Coastguard Worker  return data;
6376*1b3f573fSAndroid Build Coastguard Worker}
6377*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6378*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6379*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt64)];
6380*1b3f573fSAndroid Build Coastguard Worker}
6381*1b3f573fSAndroid Build Coastguard Worker
6382*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6383*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
6384*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
6385*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], @(value));
6386*1b3f573fSAndroid Build Coastguard Worker  }];
6387*1b3f573fSAndroid Build Coastguard Worker}
6388*1b3f573fSAndroid Build Coastguard Worker
6389*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(uint64_t)key {
6390*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6391*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
6392*1b3f573fSAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
6393*1b3f573fSAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
6394*1b3f573fSAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
6395*1b3f573fSAndroid Build Coastguard Worker    }
6396*1b3f573fSAndroid Build Coastguard Worker    *value = result;
6397*1b3f573fSAndroid Build Coastguard Worker  }
6398*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
6399*1b3f573fSAndroid Build Coastguard Worker}
6400*1b3f573fSAndroid Build Coastguard Worker
6401*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint64_t)key {
6402*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6403*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && rawValue) {
6404*1b3f573fSAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
6405*1b3f573fSAndroid Build Coastguard Worker  }
6406*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
6407*1b3f573fSAndroid Build Coastguard Worker}
6408*1b3f573fSAndroid Build Coastguard Worker
6409*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
6410*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block {
6411*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
6412*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
6413*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
6414*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6415*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6416*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
6417*1b3f573fSAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
6418*1b3f573fSAndroid Build Coastguard Worker      if (!func(unwrapped)) {
6419*1b3f573fSAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
6420*1b3f573fSAndroid Build Coastguard Worker      }
6421*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], unwrapped, &stop);
6422*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
6423*1b3f573fSAndroid Build Coastguard Worker      break;
6424*1b3f573fSAndroid Build Coastguard Worker    }
6425*1b3f573fSAndroid Build Coastguard Worker  }
6426*1b3f573fSAndroid Build Coastguard Worker}
6427*1b3f573fSAndroid Build Coastguard Worker
6428*1b3f573fSAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBUInt64EnumDictionary *)otherDictionary {
6429*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
6430*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6431*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
6432*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6433*1b3f573fSAndroid Build Coastguard Worker    }
6434*1b3f573fSAndroid Build Coastguard Worker  }
6435*1b3f573fSAndroid Build Coastguard Worker}
6436*1b3f573fSAndroid Build Coastguard Worker
6437*1b3f573fSAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(uint64_t)key {
6438*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6439*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
6440*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6441*1b3f573fSAndroid Build Coastguard Worker  }
6442*1b3f573fSAndroid Build Coastguard Worker}
6443*1b3f573fSAndroid Build Coastguard Worker
6444*1b3f573fSAndroid Build Coastguard Worker- (void)removeEnumForKey:(uint64_t)aKey {
6445*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6446*1b3f573fSAndroid Build Coastguard Worker}
6447*1b3f573fSAndroid Build Coastguard Worker
6448*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
6449*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6450*1b3f573fSAndroid Build Coastguard Worker}
6451*1b3f573fSAndroid Build Coastguard Worker
6452*1b3f573fSAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(uint64_t)key {
6453*1b3f573fSAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
6454*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
6455*1b3f573fSAndroid Build Coastguard Worker                format:@"GPBUInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
6456*1b3f573fSAndroid Build Coastguard Worker                       value];
6457*1b3f573fSAndroid Build Coastguard Worker  }
6458*1b3f573fSAndroid Build Coastguard Worker
6459*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6460*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
6461*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6462*1b3f573fSAndroid Build Coastguard Worker  }
6463*1b3f573fSAndroid Build Coastguard Worker}
6464*1b3f573fSAndroid Build Coastguard Worker
6465*1b3f573fSAndroid Build Coastguard Worker@end
6466*1b3f573fSAndroid Build Coastguard Worker
6467*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 -> Object
6468*1b3f573fSAndroid Build Coastguard Worker
6469*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64ObjectDictionary {
6470*1b3f573fSAndroid Build Coastguard Worker @package
6471*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6472*1b3f573fSAndroid Build Coastguard Worker}
6473*1b3f573fSAndroid Build Coastguard Worker
6474*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
6475*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
6476*1b3f573fSAndroid Build Coastguard Worker}
6477*1b3f573fSAndroid Build Coastguard Worker
6478*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
6479*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const uint64_t [])keys
6480*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
6481*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
6482*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6483*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6484*1b3f573fSAndroid Build Coastguard Worker    if (count && objects && keys) {
6485*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6486*1b3f573fSAndroid Build Coastguard Worker        if (!objects[i]) {
6487*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
6488*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
6489*1b3f573fSAndroid Build Coastguard Worker        }
6490*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
6491*1b3f573fSAndroid Build Coastguard Worker      }
6492*1b3f573fSAndroid Build Coastguard Worker    }
6493*1b3f573fSAndroid Build Coastguard Worker  }
6494*1b3f573fSAndroid Build Coastguard Worker  return self;
6495*1b3f573fSAndroid Build Coastguard Worker}
6496*1b3f573fSAndroid Build Coastguard Worker
6497*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64ObjectDictionary *)dictionary {
6498*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
6499*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6500*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
6501*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6502*1b3f573fSAndroid Build Coastguard Worker    }
6503*1b3f573fSAndroid Build Coastguard Worker  }
6504*1b3f573fSAndroid Build Coastguard Worker  return self;
6505*1b3f573fSAndroid Build Coastguard Worker}
6506*1b3f573fSAndroid Build Coastguard Worker
6507*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6508*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
6509*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
6510*1b3f573fSAndroid Build Coastguard Worker}
6511*1b3f573fSAndroid Build Coastguard Worker
6512*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
6513*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6514*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6515*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
6516*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
6517*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
6518*1b3f573fSAndroid Build Coastguard Worker}
6519*1b3f573fSAndroid Build Coastguard Worker
6520*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6521*1b3f573fSAndroid Build Coastguard Worker  return [[GPBUInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self];
6522*1b3f573fSAndroid Build Coastguard Worker}
6523*1b3f573fSAndroid Build Coastguard Worker
6524*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6525*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
6526*1b3f573fSAndroid Build Coastguard Worker    return YES;
6527*1b3f573fSAndroid Build Coastguard Worker  }
6528*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBUInt64ObjectDictionary class]]) {
6529*1b3f573fSAndroid Build Coastguard Worker    return NO;
6530*1b3f573fSAndroid Build Coastguard Worker  }
6531*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64ObjectDictionary *otherDictionary = other;
6532*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6533*1b3f573fSAndroid Build Coastguard Worker}
6534*1b3f573fSAndroid Build Coastguard Worker
6535*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
6536*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6537*1b3f573fSAndroid Build Coastguard Worker}
6538*1b3f573fSAndroid Build Coastguard Worker
6539*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
6540*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6541*1b3f573fSAndroid Build Coastguard Worker}
6542*1b3f573fSAndroid Build Coastguard Worker
6543*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
6544*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6545*1b3f573fSAndroid Build Coastguard Worker}
6546*1b3f573fSAndroid Build Coastguard Worker
6547*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
6548*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(uint64_t key, id object, BOOL *stop))block {
6549*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
6550*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6551*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6552*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6553*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6554*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
6555*1b3f573fSAndroid Build Coastguard Worker    block([aKey unsignedLongLongValue], aObject, &stop);
6556*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
6557*1b3f573fSAndroid Build Coastguard Worker      break;
6558*1b3f573fSAndroid Build Coastguard Worker    }
6559*1b3f573fSAndroid Build Coastguard Worker  }
6560*1b3f573fSAndroid Build Coastguard Worker}
6561*1b3f573fSAndroid Build Coastguard Worker
6562*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isInitialized {
6563*1b3f573fSAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
6564*1b3f573fSAndroid Build Coastguard Worker    if (!msg.initialized) {
6565*1b3f573fSAndroid Build Coastguard Worker      return NO;
6566*1b3f573fSAndroid Build Coastguard Worker    }
6567*1b3f573fSAndroid Build Coastguard Worker  }
6568*1b3f573fSAndroid Build Coastguard Worker  return YES;
6569*1b3f573fSAndroid Build Coastguard Worker}
6570*1b3f573fSAndroid Build Coastguard Worker
6571*1b3f573fSAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
6572*1b3f573fSAndroid Build Coastguard Worker  GPBUInt64ObjectDictionary *newDict =
6573*1b3f573fSAndroid Build Coastguard Worker      [[GPBUInt64ObjectDictionary alloc] init];
6574*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
6575*1b3f573fSAndroid Build Coastguard Worker  id aKey;
6576*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
6577*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6578*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
6579*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
6580*1b3f573fSAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
6581*1b3f573fSAndroid Build Coastguard Worker    [copiedMsg release];
6582*1b3f573fSAndroid Build Coastguard Worker  }
6583*1b3f573fSAndroid Build Coastguard Worker  return newDict;
6584*1b3f573fSAndroid Build Coastguard Worker}
6585*1b3f573fSAndroid Build Coastguard Worker
6586*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6587*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6588*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6589*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
6590*1b3f573fSAndroid Build Coastguard Worker    return 0;
6591*1b3f573fSAndroid Build Coastguard Worker  }
6592*1b3f573fSAndroid Build Coastguard Worker
6593*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6594*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6595*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
6596*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6597*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6598*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6599*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
6600*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
6601*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
6602*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6603*1b3f573fSAndroid Build Coastguard Worker  }
6604*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6605*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
6606*1b3f573fSAndroid Build Coastguard Worker  return result;
6607*1b3f573fSAndroid Build Coastguard Worker}
6608*1b3f573fSAndroid Build Coastguard Worker
6609*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6610*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6611*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6612*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6613*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6614*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6615*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6616*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6617*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6618*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
6619*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6620*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
6621*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
6622*1b3f573fSAndroid Build Coastguard Worker    id unwrappedValue = aObject;
6623*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6624*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6625*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6626*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
6627*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6628*1b3f573fSAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6629*1b3f573fSAndroid Build Coastguard Worker  }
6630*1b3f573fSAndroid Build Coastguard Worker}
6631*1b3f573fSAndroid Build Coastguard Worker
6632*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6633*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6634*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueUInt64)];
6635*1b3f573fSAndroid Build Coastguard Worker}
6636*1b3f573fSAndroid Build Coastguard Worker
6637*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6638*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(uint64_t key, id object, BOOL *stop) {
6639*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
6640*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%llu", key], object);
6641*1b3f573fSAndroid Build Coastguard Worker  }];
6642*1b3f573fSAndroid Build Coastguard Worker}
6643*1b3f573fSAndroid Build Coastguard Worker
6644*1b3f573fSAndroid Build Coastguard Worker- (id)objectForKey:(uint64_t)key {
6645*1b3f573fSAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
6646*1b3f573fSAndroid Build Coastguard Worker  return result;
6647*1b3f573fSAndroid Build Coastguard Worker}
6648*1b3f573fSAndroid Build Coastguard Worker
6649*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64ObjectDictionary *)otherDictionary {
6650*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
6651*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6652*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
6653*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6654*1b3f573fSAndroid Build Coastguard Worker    }
6655*1b3f573fSAndroid Build Coastguard Worker  }
6656*1b3f573fSAndroid Build Coastguard Worker}
6657*1b3f573fSAndroid Build Coastguard Worker
6658*1b3f573fSAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(uint64_t)key {
6659*1b3f573fSAndroid Build Coastguard Worker  if (!object) {
6660*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
6661*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
6662*1b3f573fSAndroid Build Coastguard Worker  }
6663*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
6664*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
6665*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6666*1b3f573fSAndroid Build Coastguard Worker  }
6667*1b3f573fSAndroid Build Coastguard Worker}
6668*1b3f573fSAndroid Build Coastguard Worker
6669*1b3f573fSAndroid Build Coastguard Worker- (void)removeObjectForKey:(uint64_t)aKey {
6670*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6671*1b3f573fSAndroid Build Coastguard Worker}
6672*1b3f573fSAndroid Build Coastguard Worker
6673*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
6674*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6675*1b3f573fSAndroid Build Coastguard Worker}
6676*1b3f573fSAndroid Build Coastguard Worker
6677*1b3f573fSAndroid Build Coastguard Worker@end
6678*1b3f573fSAndroid Build Coastguard Worker
6679*1b3f573fSAndroid Build Coastguard Worker// clang-format on
6680*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int64, int64_t)
6681*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
6682*1b3f573fSAndroid Build Coastguard Worker// clang-format off
6683*1b3f573fSAndroid Build Coastguard Worker
6684*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> UInt32
6685*1b3f573fSAndroid Build Coastguard Worker
6686*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64UInt32Dictionary {
6687*1b3f573fSAndroid Build Coastguard Worker @package
6688*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6689*1b3f573fSAndroid Build Coastguard Worker}
6690*1b3f573fSAndroid Build Coastguard Worker
6691*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
6692*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
6693*1b3f573fSAndroid Build Coastguard Worker}
6694*1b3f573fSAndroid Build Coastguard Worker
6695*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
6696*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
6697*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
6698*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
6699*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6700*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6701*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
6702*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6703*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6704*1b3f573fSAndroid Build Coastguard Worker      }
6705*1b3f573fSAndroid Build Coastguard Worker    }
6706*1b3f573fSAndroid Build Coastguard Worker  }
6707*1b3f573fSAndroid Build Coastguard Worker  return self;
6708*1b3f573fSAndroid Build Coastguard Worker}
6709*1b3f573fSAndroid Build Coastguard Worker
6710*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64UInt32Dictionary *)dictionary {
6711*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
6712*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6713*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
6714*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6715*1b3f573fSAndroid Build Coastguard Worker    }
6716*1b3f573fSAndroid Build Coastguard Worker  }
6717*1b3f573fSAndroid Build Coastguard Worker  return self;
6718*1b3f573fSAndroid Build Coastguard Worker}
6719*1b3f573fSAndroid Build Coastguard Worker
6720*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6721*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
6722*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
6723*1b3f573fSAndroid Build Coastguard Worker}
6724*1b3f573fSAndroid Build Coastguard Worker
6725*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
6726*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6727*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6728*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
6729*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
6730*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
6731*1b3f573fSAndroid Build Coastguard Worker}
6732*1b3f573fSAndroid Build Coastguard Worker
6733*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6734*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
6735*1b3f573fSAndroid Build Coastguard Worker}
6736*1b3f573fSAndroid Build Coastguard Worker
6737*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6738*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
6739*1b3f573fSAndroid Build Coastguard Worker    return YES;
6740*1b3f573fSAndroid Build Coastguard Worker  }
6741*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64UInt32Dictionary class]]) {
6742*1b3f573fSAndroid Build Coastguard Worker    return NO;
6743*1b3f573fSAndroid Build Coastguard Worker  }
6744*1b3f573fSAndroid Build Coastguard Worker  GPBInt64UInt32Dictionary *otherDictionary = other;
6745*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6746*1b3f573fSAndroid Build Coastguard Worker}
6747*1b3f573fSAndroid Build Coastguard Worker
6748*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
6749*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6750*1b3f573fSAndroid Build Coastguard Worker}
6751*1b3f573fSAndroid Build Coastguard Worker
6752*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
6753*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6754*1b3f573fSAndroid Build Coastguard Worker}
6755*1b3f573fSAndroid Build Coastguard Worker
6756*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
6757*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6758*1b3f573fSAndroid Build Coastguard Worker}
6759*1b3f573fSAndroid Build Coastguard Worker
6760*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
6761*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, uint32_t value, BOOL *stop))block {
6762*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
6763*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6764*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6765*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6766*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6767*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6768*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue unsignedIntValue], &stop);
6769*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
6770*1b3f573fSAndroid Build Coastguard Worker      break;
6771*1b3f573fSAndroid Build Coastguard Worker    }
6772*1b3f573fSAndroid Build Coastguard Worker  }
6773*1b3f573fSAndroid Build Coastguard Worker}
6774*1b3f573fSAndroid Build Coastguard Worker
6775*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6776*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6777*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6778*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
6779*1b3f573fSAndroid Build Coastguard Worker    return 0;
6780*1b3f573fSAndroid Build Coastguard Worker  }
6781*1b3f573fSAndroid Build Coastguard Worker
6782*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6783*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6784*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
6785*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6786*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6787*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6788*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6789*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
6790*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
6791*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6792*1b3f573fSAndroid Build Coastguard Worker  }
6793*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6794*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
6795*1b3f573fSAndroid Build Coastguard Worker  return result;
6796*1b3f573fSAndroid Build Coastguard Worker}
6797*1b3f573fSAndroid Build Coastguard Worker
6798*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6799*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6800*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6801*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6802*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6803*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6804*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6805*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6806*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6807*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6808*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6809*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
6810*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
6811*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
6812*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6813*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6814*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6815*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
6816*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
6817*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
6818*1b3f573fSAndroid Build Coastguard Worker  }
6819*1b3f573fSAndroid Build Coastguard Worker}
6820*1b3f573fSAndroid Build Coastguard Worker
6821*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
6822*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
6823*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt64)];
6824*1b3f573fSAndroid Build Coastguard Worker}
6825*1b3f573fSAndroid Build Coastguard Worker
6826*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
6827*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(int64_t key, uint32_t value, BOOL *stop) {
6828*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
6829*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%u", value]);
6830*1b3f573fSAndroid Build Coastguard Worker  }];
6831*1b3f573fSAndroid Build Coastguard Worker}
6832*1b3f573fSAndroid Build Coastguard Worker
6833*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int64_t)key {
6834*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6835*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
6836*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
6837*1b3f573fSAndroid Build Coastguard Worker  }
6838*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
6839*1b3f573fSAndroid Build Coastguard Worker}
6840*1b3f573fSAndroid Build Coastguard Worker
6841*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64UInt32Dictionary *)otherDictionary {
6842*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
6843*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6844*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
6845*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
6846*1b3f573fSAndroid Build Coastguard Worker    }
6847*1b3f573fSAndroid Build Coastguard Worker  }
6848*1b3f573fSAndroid Build Coastguard Worker}
6849*1b3f573fSAndroid Build Coastguard Worker
6850*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(int64_t)key {
6851*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
6852*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
6853*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
6854*1b3f573fSAndroid Build Coastguard Worker  }
6855*1b3f573fSAndroid Build Coastguard Worker}
6856*1b3f573fSAndroid Build Coastguard Worker
6857*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(int64_t)aKey {
6858*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
6859*1b3f573fSAndroid Build Coastguard Worker}
6860*1b3f573fSAndroid Build Coastguard Worker
6861*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
6862*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
6863*1b3f573fSAndroid Build Coastguard Worker}
6864*1b3f573fSAndroid Build Coastguard Worker
6865*1b3f573fSAndroid Build Coastguard Worker@end
6866*1b3f573fSAndroid Build Coastguard Worker
6867*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> Int32
6868*1b3f573fSAndroid Build Coastguard Worker
6869*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64Int32Dictionary {
6870*1b3f573fSAndroid Build Coastguard Worker @package
6871*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
6872*1b3f573fSAndroid Build Coastguard Worker}
6873*1b3f573fSAndroid Build Coastguard Worker
6874*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
6875*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
6876*1b3f573fSAndroid Build Coastguard Worker}
6877*1b3f573fSAndroid Build Coastguard Worker
6878*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
6879*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const int64_t [])keys
6880*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
6881*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
6882*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6883*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
6884*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
6885*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
6886*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6887*1b3f573fSAndroid Build Coastguard Worker      }
6888*1b3f573fSAndroid Build Coastguard Worker    }
6889*1b3f573fSAndroid Build Coastguard Worker  }
6890*1b3f573fSAndroid Build Coastguard Worker  return self;
6891*1b3f573fSAndroid Build Coastguard Worker}
6892*1b3f573fSAndroid Build Coastguard Worker
6893*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64Int32Dictionary *)dictionary {
6894*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
6895*1b3f573fSAndroid Build Coastguard Worker  if (self) {
6896*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
6897*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6898*1b3f573fSAndroid Build Coastguard Worker    }
6899*1b3f573fSAndroid Build Coastguard Worker  }
6900*1b3f573fSAndroid Build Coastguard Worker  return self;
6901*1b3f573fSAndroid Build Coastguard Worker}
6902*1b3f573fSAndroid Build Coastguard Worker
6903*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
6904*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
6905*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
6906*1b3f573fSAndroid Build Coastguard Worker}
6907*1b3f573fSAndroid Build Coastguard Worker
6908*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
6909*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
6910*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
6911*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
6912*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
6913*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
6914*1b3f573fSAndroid Build Coastguard Worker}
6915*1b3f573fSAndroid Build Coastguard Worker
6916*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
6917*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self];
6918*1b3f573fSAndroid Build Coastguard Worker}
6919*1b3f573fSAndroid Build Coastguard Worker
6920*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
6921*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
6922*1b3f573fSAndroid Build Coastguard Worker    return YES;
6923*1b3f573fSAndroid Build Coastguard Worker  }
6924*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64Int32Dictionary class]]) {
6925*1b3f573fSAndroid Build Coastguard Worker    return NO;
6926*1b3f573fSAndroid Build Coastguard Worker  }
6927*1b3f573fSAndroid Build Coastguard Worker  GPBInt64Int32Dictionary *otherDictionary = other;
6928*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
6929*1b3f573fSAndroid Build Coastguard Worker}
6930*1b3f573fSAndroid Build Coastguard Worker
6931*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
6932*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6933*1b3f573fSAndroid Build Coastguard Worker}
6934*1b3f573fSAndroid Build Coastguard Worker
6935*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
6936*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
6937*1b3f573fSAndroid Build Coastguard Worker}
6938*1b3f573fSAndroid Build Coastguard Worker
6939*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
6940*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
6941*1b3f573fSAndroid Build Coastguard Worker}
6942*1b3f573fSAndroid Build Coastguard Worker
6943*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
6944*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block {
6945*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
6946*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6947*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6948*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6949*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6950*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6951*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue intValue], &stop);
6952*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
6953*1b3f573fSAndroid Build Coastguard Worker      break;
6954*1b3f573fSAndroid Build Coastguard Worker    }
6955*1b3f573fSAndroid Build Coastguard Worker  }
6956*1b3f573fSAndroid Build Coastguard Worker}
6957*1b3f573fSAndroid Build Coastguard Worker
6958*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6959*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6960*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
6961*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
6962*1b3f573fSAndroid Build Coastguard Worker    return 0;
6963*1b3f573fSAndroid Build Coastguard Worker  }
6964*1b3f573fSAndroid Build Coastguard Worker
6965*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6966*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6967*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
6968*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6969*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6970*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6971*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6972*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
6973*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
6974*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6975*1b3f573fSAndroid Build Coastguard Worker  }
6976*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
6977*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
6978*1b3f573fSAndroid Build Coastguard Worker  return result;
6979*1b3f573fSAndroid Build Coastguard Worker}
6980*1b3f573fSAndroid Build Coastguard Worker
6981*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6982*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
6983*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
6984*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
6985*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
6986*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
6987*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
6988*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
6989*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
6990*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
6991*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
6992*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
6993*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
6994*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
6995*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
6996*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
6997*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
6998*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
6999*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7000*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7001*1b3f573fSAndroid Build Coastguard Worker  }
7002*1b3f573fSAndroid Build Coastguard Worker}
7003*1b3f573fSAndroid Build Coastguard Worker
7004*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7005*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7006*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt64)];
7007*1b3f573fSAndroid Build Coastguard Worker}
7008*1b3f573fSAndroid Build Coastguard Worker
7009*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7010*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
7011*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
7012*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%d", value]);
7013*1b3f573fSAndroid Build Coastguard Worker  }];
7014*1b3f573fSAndroid Build Coastguard Worker}
7015*1b3f573fSAndroid Build Coastguard Worker
7016*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(int64_t)key {
7017*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7018*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
7019*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped intValue];
7020*1b3f573fSAndroid Build Coastguard Worker  }
7021*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
7022*1b3f573fSAndroid Build Coastguard Worker}
7023*1b3f573fSAndroid Build Coastguard Worker
7024*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64Int32Dictionary *)otherDictionary {
7025*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
7026*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7027*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
7028*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7029*1b3f573fSAndroid Build Coastguard Worker    }
7030*1b3f573fSAndroid Build Coastguard Worker  }
7031*1b3f573fSAndroid Build Coastguard Worker}
7032*1b3f573fSAndroid Build Coastguard Worker
7033*1b3f573fSAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(int64_t)key {
7034*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7035*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
7036*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7037*1b3f573fSAndroid Build Coastguard Worker  }
7038*1b3f573fSAndroid Build Coastguard Worker}
7039*1b3f573fSAndroid Build Coastguard Worker
7040*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt32ForKey:(int64_t)aKey {
7041*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7042*1b3f573fSAndroid Build Coastguard Worker}
7043*1b3f573fSAndroid Build Coastguard Worker
7044*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
7045*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7046*1b3f573fSAndroid Build Coastguard Worker}
7047*1b3f573fSAndroid Build Coastguard Worker
7048*1b3f573fSAndroid Build Coastguard Worker@end
7049*1b3f573fSAndroid Build Coastguard Worker
7050*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> UInt64
7051*1b3f573fSAndroid Build Coastguard Worker
7052*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64UInt64Dictionary {
7053*1b3f573fSAndroid Build Coastguard Worker @package
7054*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7055*1b3f573fSAndroid Build Coastguard Worker}
7056*1b3f573fSAndroid Build Coastguard Worker
7057*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
7058*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
7059*1b3f573fSAndroid Build Coastguard Worker}
7060*1b3f573fSAndroid Build Coastguard Worker
7061*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
7062*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
7063*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
7064*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
7065*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7066*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7067*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
7068*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7069*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7070*1b3f573fSAndroid Build Coastguard Worker      }
7071*1b3f573fSAndroid Build Coastguard Worker    }
7072*1b3f573fSAndroid Build Coastguard Worker  }
7073*1b3f573fSAndroid Build Coastguard Worker  return self;
7074*1b3f573fSAndroid Build Coastguard Worker}
7075*1b3f573fSAndroid Build Coastguard Worker
7076*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64UInt64Dictionary *)dictionary {
7077*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
7078*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7079*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
7080*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7081*1b3f573fSAndroid Build Coastguard Worker    }
7082*1b3f573fSAndroid Build Coastguard Worker  }
7083*1b3f573fSAndroid Build Coastguard Worker  return self;
7084*1b3f573fSAndroid Build Coastguard Worker}
7085*1b3f573fSAndroid Build Coastguard Worker
7086*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7087*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
7088*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
7089*1b3f573fSAndroid Build Coastguard Worker}
7090*1b3f573fSAndroid Build Coastguard Worker
7091*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
7092*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7093*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7094*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
7095*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
7096*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
7097*1b3f573fSAndroid Build Coastguard Worker}
7098*1b3f573fSAndroid Build Coastguard Worker
7099*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7100*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
7101*1b3f573fSAndroid Build Coastguard Worker}
7102*1b3f573fSAndroid Build Coastguard Worker
7103*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7104*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
7105*1b3f573fSAndroid Build Coastguard Worker    return YES;
7106*1b3f573fSAndroid Build Coastguard Worker  }
7107*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64UInt64Dictionary class]]) {
7108*1b3f573fSAndroid Build Coastguard Worker    return NO;
7109*1b3f573fSAndroid Build Coastguard Worker  }
7110*1b3f573fSAndroid Build Coastguard Worker  GPBInt64UInt64Dictionary *otherDictionary = other;
7111*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7112*1b3f573fSAndroid Build Coastguard Worker}
7113*1b3f573fSAndroid Build Coastguard Worker
7114*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
7115*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7116*1b3f573fSAndroid Build Coastguard Worker}
7117*1b3f573fSAndroid Build Coastguard Worker
7118*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
7119*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7120*1b3f573fSAndroid Build Coastguard Worker}
7121*1b3f573fSAndroid Build Coastguard Worker
7122*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
7123*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7124*1b3f573fSAndroid Build Coastguard Worker}
7125*1b3f573fSAndroid Build Coastguard Worker
7126*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
7127*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, uint64_t value, BOOL *stop))block {
7128*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
7129*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7130*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7131*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7132*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7133*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7134*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue unsignedLongLongValue], &stop);
7135*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
7136*1b3f573fSAndroid Build Coastguard Worker      break;
7137*1b3f573fSAndroid Build Coastguard Worker    }
7138*1b3f573fSAndroid Build Coastguard Worker  }
7139*1b3f573fSAndroid Build Coastguard Worker}
7140*1b3f573fSAndroid Build Coastguard Worker
7141*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7142*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7143*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7144*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
7145*1b3f573fSAndroid Build Coastguard Worker    return 0;
7146*1b3f573fSAndroid Build Coastguard Worker  }
7147*1b3f573fSAndroid Build Coastguard Worker
7148*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7149*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7150*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
7151*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7152*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7153*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7154*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7155*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7156*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
7157*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7158*1b3f573fSAndroid Build Coastguard Worker  }
7159*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7160*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
7161*1b3f573fSAndroid Build Coastguard Worker  return result;
7162*1b3f573fSAndroid Build Coastguard Worker}
7163*1b3f573fSAndroid Build Coastguard Worker
7164*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7165*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7166*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7167*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7168*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7169*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7170*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7171*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7172*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7173*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7174*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7175*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
7176*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7177*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
7178*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7179*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7180*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7181*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
7182*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7183*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7184*1b3f573fSAndroid Build Coastguard Worker  }
7185*1b3f573fSAndroid Build Coastguard Worker}
7186*1b3f573fSAndroid Build Coastguard Worker
7187*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7188*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7189*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt64)];
7190*1b3f573fSAndroid Build Coastguard Worker}
7191*1b3f573fSAndroid Build Coastguard Worker
7192*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7193*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(int64_t key, uint64_t value, BOOL *stop) {
7194*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
7195*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%llu", value]);
7196*1b3f573fSAndroid Build Coastguard Worker  }];
7197*1b3f573fSAndroid Build Coastguard Worker}
7198*1b3f573fSAndroid Build Coastguard Worker
7199*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int64_t)key {
7200*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7201*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
7202*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
7203*1b3f573fSAndroid Build Coastguard Worker  }
7204*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
7205*1b3f573fSAndroid Build Coastguard Worker}
7206*1b3f573fSAndroid Build Coastguard Worker
7207*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64UInt64Dictionary *)otherDictionary {
7208*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
7209*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7210*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
7211*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7212*1b3f573fSAndroid Build Coastguard Worker    }
7213*1b3f573fSAndroid Build Coastguard Worker  }
7214*1b3f573fSAndroid Build Coastguard Worker}
7215*1b3f573fSAndroid Build Coastguard Worker
7216*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(int64_t)key {
7217*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7218*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
7219*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7220*1b3f573fSAndroid Build Coastguard Worker  }
7221*1b3f573fSAndroid Build Coastguard Worker}
7222*1b3f573fSAndroid Build Coastguard Worker
7223*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(int64_t)aKey {
7224*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7225*1b3f573fSAndroid Build Coastguard Worker}
7226*1b3f573fSAndroid Build Coastguard Worker
7227*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
7228*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7229*1b3f573fSAndroid Build Coastguard Worker}
7230*1b3f573fSAndroid Build Coastguard Worker
7231*1b3f573fSAndroid Build Coastguard Worker@end
7232*1b3f573fSAndroid Build Coastguard Worker
7233*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> Int64
7234*1b3f573fSAndroid Build Coastguard Worker
7235*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64Int64Dictionary {
7236*1b3f573fSAndroid Build Coastguard Worker @package
7237*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7238*1b3f573fSAndroid Build Coastguard Worker}
7239*1b3f573fSAndroid Build Coastguard Worker
7240*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
7241*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
7242*1b3f573fSAndroid Build Coastguard Worker}
7243*1b3f573fSAndroid Build Coastguard Worker
7244*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
7245*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const int64_t [])keys
7246*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
7247*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
7248*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7249*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7250*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
7251*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7252*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7253*1b3f573fSAndroid Build Coastguard Worker      }
7254*1b3f573fSAndroid Build Coastguard Worker    }
7255*1b3f573fSAndroid Build Coastguard Worker  }
7256*1b3f573fSAndroid Build Coastguard Worker  return self;
7257*1b3f573fSAndroid Build Coastguard Worker}
7258*1b3f573fSAndroid Build Coastguard Worker
7259*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64Int64Dictionary *)dictionary {
7260*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
7261*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7262*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
7263*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7264*1b3f573fSAndroid Build Coastguard Worker    }
7265*1b3f573fSAndroid Build Coastguard Worker  }
7266*1b3f573fSAndroid Build Coastguard Worker  return self;
7267*1b3f573fSAndroid Build Coastguard Worker}
7268*1b3f573fSAndroid Build Coastguard Worker
7269*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7270*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
7271*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
7272*1b3f573fSAndroid Build Coastguard Worker}
7273*1b3f573fSAndroid Build Coastguard Worker
7274*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
7275*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7276*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7277*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
7278*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
7279*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
7280*1b3f573fSAndroid Build Coastguard Worker}
7281*1b3f573fSAndroid Build Coastguard Worker
7282*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7283*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self];
7284*1b3f573fSAndroid Build Coastguard Worker}
7285*1b3f573fSAndroid Build Coastguard Worker
7286*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7287*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
7288*1b3f573fSAndroid Build Coastguard Worker    return YES;
7289*1b3f573fSAndroid Build Coastguard Worker  }
7290*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64Int64Dictionary class]]) {
7291*1b3f573fSAndroid Build Coastguard Worker    return NO;
7292*1b3f573fSAndroid Build Coastguard Worker  }
7293*1b3f573fSAndroid Build Coastguard Worker  GPBInt64Int64Dictionary *otherDictionary = other;
7294*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7295*1b3f573fSAndroid Build Coastguard Worker}
7296*1b3f573fSAndroid Build Coastguard Worker
7297*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
7298*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7299*1b3f573fSAndroid Build Coastguard Worker}
7300*1b3f573fSAndroid Build Coastguard Worker
7301*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
7302*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7303*1b3f573fSAndroid Build Coastguard Worker}
7304*1b3f573fSAndroid Build Coastguard Worker
7305*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
7306*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7307*1b3f573fSAndroid Build Coastguard Worker}
7308*1b3f573fSAndroid Build Coastguard Worker
7309*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
7310*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int64_t value, BOOL *stop))block {
7311*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
7312*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7313*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7314*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7315*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7316*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7317*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue longLongValue], &stop);
7318*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
7319*1b3f573fSAndroid Build Coastguard Worker      break;
7320*1b3f573fSAndroid Build Coastguard Worker    }
7321*1b3f573fSAndroid Build Coastguard Worker  }
7322*1b3f573fSAndroid Build Coastguard Worker}
7323*1b3f573fSAndroid Build Coastguard Worker
7324*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7325*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7326*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7327*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
7328*1b3f573fSAndroid Build Coastguard Worker    return 0;
7329*1b3f573fSAndroid Build Coastguard Worker  }
7330*1b3f573fSAndroid Build Coastguard Worker
7331*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7332*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7333*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
7334*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7335*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7336*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7337*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7338*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7339*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
7340*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7341*1b3f573fSAndroid Build Coastguard Worker  }
7342*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7343*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
7344*1b3f573fSAndroid Build Coastguard Worker  return result;
7345*1b3f573fSAndroid Build Coastguard Worker}
7346*1b3f573fSAndroid Build Coastguard Worker
7347*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7348*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7349*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7350*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7351*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7352*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7353*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7354*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7355*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7356*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7357*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7358*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
7359*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7360*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
7361*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7362*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7363*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7364*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
7365*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7366*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7367*1b3f573fSAndroid Build Coastguard Worker  }
7368*1b3f573fSAndroid Build Coastguard Worker}
7369*1b3f573fSAndroid Build Coastguard Worker
7370*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7371*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7372*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt64)];
7373*1b3f573fSAndroid Build Coastguard Worker}
7374*1b3f573fSAndroid Build Coastguard Worker
7375*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7376*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(int64_t key, int64_t value, BOOL *stop) {
7377*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
7378*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%lld", value]);
7379*1b3f573fSAndroid Build Coastguard Worker  }];
7380*1b3f573fSAndroid Build Coastguard Worker}
7381*1b3f573fSAndroid Build Coastguard Worker
7382*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(int64_t)key {
7383*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7384*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
7385*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
7386*1b3f573fSAndroid Build Coastguard Worker  }
7387*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
7388*1b3f573fSAndroid Build Coastguard Worker}
7389*1b3f573fSAndroid Build Coastguard Worker
7390*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64Int64Dictionary *)otherDictionary {
7391*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
7392*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7393*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
7394*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7395*1b3f573fSAndroid Build Coastguard Worker    }
7396*1b3f573fSAndroid Build Coastguard Worker  }
7397*1b3f573fSAndroid Build Coastguard Worker}
7398*1b3f573fSAndroid Build Coastguard Worker
7399*1b3f573fSAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(int64_t)key {
7400*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7401*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
7402*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7403*1b3f573fSAndroid Build Coastguard Worker  }
7404*1b3f573fSAndroid Build Coastguard Worker}
7405*1b3f573fSAndroid Build Coastguard Worker
7406*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt64ForKey:(int64_t)aKey {
7407*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7408*1b3f573fSAndroid Build Coastguard Worker}
7409*1b3f573fSAndroid Build Coastguard Worker
7410*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
7411*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7412*1b3f573fSAndroid Build Coastguard Worker}
7413*1b3f573fSAndroid Build Coastguard Worker
7414*1b3f573fSAndroid Build Coastguard Worker@end
7415*1b3f573fSAndroid Build Coastguard Worker
7416*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> Bool
7417*1b3f573fSAndroid Build Coastguard Worker
7418*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64BoolDictionary {
7419*1b3f573fSAndroid Build Coastguard Worker @package
7420*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7421*1b3f573fSAndroid Build Coastguard Worker}
7422*1b3f573fSAndroid Build Coastguard Worker
7423*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
7424*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
7425*1b3f573fSAndroid Build Coastguard Worker}
7426*1b3f573fSAndroid Build Coastguard Worker
7427*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
7428*1b3f573fSAndroid Build Coastguard Worker                      forKeys:(const int64_t [])keys
7429*1b3f573fSAndroid Build Coastguard Worker                        count:(NSUInteger)count {
7430*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
7431*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7432*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7433*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
7434*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7435*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7436*1b3f573fSAndroid Build Coastguard Worker      }
7437*1b3f573fSAndroid Build Coastguard Worker    }
7438*1b3f573fSAndroid Build Coastguard Worker  }
7439*1b3f573fSAndroid Build Coastguard Worker  return self;
7440*1b3f573fSAndroid Build Coastguard Worker}
7441*1b3f573fSAndroid Build Coastguard Worker
7442*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64BoolDictionary *)dictionary {
7443*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
7444*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7445*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
7446*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7447*1b3f573fSAndroid Build Coastguard Worker    }
7448*1b3f573fSAndroid Build Coastguard Worker  }
7449*1b3f573fSAndroid Build Coastguard Worker  return self;
7450*1b3f573fSAndroid Build Coastguard Worker}
7451*1b3f573fSAndroid Build Coastguard Worker
7452*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7453*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
7454*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
7455*1b3f573fSAndroid Build Coastguard Worker}
7456*1b3f573fSAndroid Build Coastguard Worker
7457*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
7458*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7459*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7460*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
7461*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
7462*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
7463*1b3f573fSAndroid Build Coastguard Worker}
7464*1b3f573fSAndroid Build Coastguard Worker
7465*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7466*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
7467*1b3f573fSAndroid Build Coastguard Worker}
7468*1b3f573fSAndroid Build Coastguard Worker
7469*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7470*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
7471*1b3f573fSAndroid Build Coastguard Worker    return YES;
7472*1b3f573fSAndroid Build Coastguard Worker  }
7473*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64BoolDictionary class]]) {
7474*1b3f573fSAndroid Build Coastguard Worker    return NO;
7475*1b3f573fSAndroid Build Coastguard Worker  }
7476*1b3f573fSAndroid Build Coastguard Worker  GPBInt64BoolDictionary *otherDictionary = other;
7477*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7478*1b3f573fSAndroid Build Coastguard Worker}
7479*1b3f573fSAndroid Build Coastguard Worker
7480*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
7481*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7482*1b3f573fSAndroid Build Coastguard Worker}
7483*1b3f573fSAndroid Build Coastguard Worker
7484*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
7485*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7486*1b3f573fSAndroid Build Coastguard Worker}
7487*1b3f573fSAndroid Build Coastguard Worker
7488*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
7489*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7490*1b3f573fSAndroid Build Coastguard Worker}
7491*1b3f573fSAndroid Build Coastguard Worker
7492*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
7493*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, BOOL value, BOOL *stop))block {
7494*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
7495*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7496*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7497*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7498*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7499*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7500*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue boolValue], &stop);
7501*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
7502*1b3f573fSAndroid Build Coastguard Worker      break;
7503*1b3f573fSAndroid Build Coastguard Worker    }
7504*1b3f573fSAndroid Build Coastguard Worker  }
7505*1b3f573fSAndroid Build Coastguard Worker}
7506*1b3f573fSAndroid Build Coastguard Worker
7507*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7508*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7509*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7510*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
7511*1b3f573fSAndroid Build Coastguard Worker    return 0;
7512*1b3f573fSAndroid Build Coastguard Worker  }
7513*1b3f573fSAndroid Build Coastguard Worker
7514*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7515*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7516*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
7517*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7518*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7519*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7520*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7521*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7522*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
7523*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7524*1b3f573fSAndroid Build Coastguard Worker  }
7525*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7526*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
7527*1b3f573fSAndroid Build Coastguard Worker  return result;
7528*1b3f573fSAndroid Build Coastguard Worker}
7529*1b3f573fSAndroid Build Coastguard Worker
7530*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7531*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7532*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7533*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7534*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7535*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7536*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7537*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7538*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7539*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7540*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7541*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
7542*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7543*1b3f573fSAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
7544*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7545*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7546*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7547*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
7548*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7549*1b3f573fSAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7550*1b3f573fSAndroid Build Coastguard Worker  }
7551*1b3f573fSAndroid Build Coastguard Worker}
7552*1b3f573fSAndroid Build Coastguard Worker
7553*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7554*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7555*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt64)];
7556*1b3f573fSAndroid Build Coastguard Worker}
7557*1b3f573fSAndroid Build Coastguard Worker
7558*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7559*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(int64_t key, BOOL value, BOOL *stop) {
7560*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
7561*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], (value ? @"true" : @"false"));
7562*1b3f573fSAndroid Build Coastguard Worker  }];
7563*1b3f573fSAndroid Build Coastguard Worker}
7564*1b3f573fSAndroid Build Coastguard Worker
7565*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(int64_t)key {
7566*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7567*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
7568*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped boolValue];
7569*1b3f573fSAndroid Build Coastguard Worker  }
7570*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
7571*1b3f573fSAndroid Build Coastguard Worker}
7572*1b3f573fSAndroid Build Coastguard Worker
7573*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64BoolDictionary *)otherDictionary {
7574*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
7575*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7576*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
7577*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7578*1b3f573fSAndroid Build Coastguard Worker    }
7579*1b3f573fSAndroid Build Coastguard Worker  }
7580*1b3f573fSAndroid Build Coastguard Worker}
7581*1b3f573fSAndroid Build Coastguard Worker
7582*1b3f573fSAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(int64_t)key {
7583*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7584*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
7585*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7586*1b3f573fSAndroid Build Coastguard Worker  }
7587*1b3f573fSAndroid Build Coastguard Worker}
7588*1b3f573fSAndroid Build Coastguard Worker
7589*1b3f573fSAndroid Build Coastguard Worker- (void)removeBoolForKey:(int64_t)aKey {
7590*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7591*1b3f573fSAndroid Build Coastguard Worker}
7592*1b3f573fSAndroid Build Coastguard Worker
7593*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
7594*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7595*1b3f573fSAndroid Build Coastguard Worker}
7596*1b3f573fSAndroid Build Coastguard Worker
7597*1b3f573fSAndroid Build Coastguard Worker@end
7598*1b3f573fSAndroid Build Coastguard Worker
7599*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> Float
7600*1b3f573fSAndroid Build Coastguard Worker
7601*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64FloatDictionary {
7602*1b3f573fSAndroid Build Coastguard Worker @package
7603*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7604*1b3f573fSAndroid Build Coastguard Worker}
7605*1b3f573fSAndroid Build Coastguard Worker
7606*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
7607*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
7608*1b3f573fSAndroid Build Coastguard Worker}
7609*1b3f573fSAndroid Build Coastguard Worker
7610*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
7611*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const int64_t [])keys
7612*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
7613*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
7614*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7615*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7616*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
7617*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7618*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7619*1b3f573fSAndroid Build Coastguard Worker      }
7620*1b3f573fSAndroid Build Coastguard Worker    }
7621*1b3f573fSAndroid Build Coastguard Worker  }
7622*1b3f573fSAndroid Build Coastguard Worker  return self;
7623*1b3f573fSAndroid Build Coastguard Worker}
7624*1b3f573fSAndroid Build Coastguard Worker
7625*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64FloatDictionary *)dictionary {
7626*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
7627*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7628*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
7629*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7630*1b3f573fSAndroid Build Coastguard Worker    }
7631*1b3f573fSAndroid Build Coastguard Worker  }
7632*1b3f573fSAndroid Build Coastguard Worker  return self;
7633*1b3f573fSAndroid Build Coastguard Worker}
7634*1b3f573fSAndroid Build Coastguard Worker
7635*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7636*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
7637*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
7638*1b3f573fSAndroid Build Coastguard Worker}
7639*1b3f573fSAndroid Build Coastguard Worker
7640*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
7641*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7642*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7643*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
7644*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
7645*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
7646*1b3f573fSAndroid Build Coastguard Worker}
7647*1b3f573fSAndroid Build Coastguard Worker
7648*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7649*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64FloatDictionary allocWithZone:zone] initWithDictionary:self];
7650*1b3f573fSAndroid Build Coastguard Worker}
7651*1b3f573fSAndroid Build Coastguard Worker
7652*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7653*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
7654*1b3f573fSAndroid Build Coastguard Worker    return YES;
7655*1b3f573fSAndroid Build Coastguard Worker  }
7656*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64FloatDictionary class]]) {
7657*1b3f573fSAndroid Build Coastguard Worker    return NO;
7658*1b3f573fSAndroid Build Coastguard Worker  }
7659*1b3f573fSAndroid Build Coastguard Worker  GPBInt64FloatDictionary *otherDictionary = other;
7660*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7661*1b3f573fSAndroid Build Coastguard Worker}
7662*1b3f573fSAndroid Build Coastguard Worker
7663*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
7664*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7665*1b3f573fSAndroid Build Coastguard Worker}
7666*1b3f573fSAndroid Build Coastguard Worker
7667*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
7668*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7669*1b3f573fSAndroid Build Coastguard Worker}
7670*1b3f573fSAndroid Build Coastguard Worker
7671*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
7672*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7673*1b3f573fSAndroid Build Coastguard Worker}
7674*1b3f573fSAndroid Build Coastguard Worker
7675*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
7676*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, float value, BOOL *stop))block {
7677*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
7678*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7679*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7680*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7681*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7682*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7683*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue floatValue], &stop);
7684*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
7685*1b3f573fSAndroid Build Coastguard Worker      break;
7686*1b3f573fSAndroid Build Coastguard Worker    }
7687*1b3f573fSAndroid Build Coastguard Worker  }
7688*1b3f573fSAndroid Build Coastguard Worker}
7689*1b3f573fSAndroid Build Coastguard Worker
7690*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7691*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7692*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7693*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
7694*1b3f573fSAndroid Build Coastguard Worker    return 0;
7695*1b3f573fSAndroid Build Coastguard Worker  }
7696*1b3f573fSAndroid Build Coastguard Worker
7697*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7698*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7699*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
7700*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7701*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7702*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7703*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7704*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7705*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
7706*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7707*1b3f573fSAndroid Build Coastguard Worker  }
7708*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7709*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
7710*1b3f573fSAndroid Build Coastguard Worker  return result;
7711*1b3f573fSAndroid Build Coastguard Worker}
7712*1b3f573fSAndroid Build Coastguard Worker
7713*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7714*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7715*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7716*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7717*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7718*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7719*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7720*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7721*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7722*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7723*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7724*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
7725*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7726*1b3f573fSAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
7727*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7728*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7729*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7730*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
7731*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7732*1b3f573fSAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7733*1b3f573fSAndroid Build Coastguard Worker  }
7734*1b3f573fSAndroid Build Coastguard Worker}
7735*1b3f573fSAndroid Build Coastguard Worker
7736*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7737*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7738*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt64)];
7739*1b3f573fSAndroid Build Coastguard Worker}
7740*1b3f573fSAndroid Build Coastguard Worker
7741*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7742*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(int64_t key, float value, BOOL *stop) {
7743*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
7744*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
7745*1b3f573fSAndroid Build Coastguard Worker  }];
7746*1b3f573fSAndroid Build Coastguard Worker}
7747*1b3f573fSAndroid Build Coastguard Worker
7748*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(int64_t)key {
7749*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7750*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
7751*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped floatValue];
7752*1b3f573fSAndroid Build Coastguard Worker  }
7753*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
7754*1b3f573fSAndroid Build Coastguard Worker}
7755*1b3f573fSAndroid Build Coastguard Worker
7756*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64FloatDictionary *)otherDictionary {
7757*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
7758*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7759*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
7760*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7761*1b3f573fSAndroid Build Coastguard Worker    }
7762*1b3f573fSAndroid Build Coastguard Worker  }
7763*1b3f573fSAndroid Build Coastguard Worker}
7764*1b3f573fSAndroid Build Coastguard Worker
7765*1b3f573fSAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(int64_t)key {
7766*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7767*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
7768*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7769*1b3f573fSAndroid Build Coastguard Worker  }
7770*1b3f573fSAndroid Build Coastguard Worker}
7771*1b3f573fSAndroid Build Coastguard Worker
7772*1b3f573fSAndroid Build Coastguard Worker- (void)removeFloatForKey:(int64_t)aKey {
7773*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7774*1b3f573fSAndroid Build Coastguard Worker}
7775*1b3f573fSAndroid Build Coastguard Worker
7776*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
7777*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7778*1b3f573fSAndroid Build Coastguard Worker}
7779*1b3f573fSAndroid Build Coastguard Worker
7780*1b3f573fSAndroid Build Coastguard Worker@end
7781*1b3f573fSAndroid Build Coastguard Worker
7782*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> Double
7783*1b3f573fSAndroid Build Coastguard Worker
7784*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64DoubleDictionary {
7785*1b3f573fSAndroid Build Coastguard Worker @package
7786*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7787*1b3f573fSAndroid Build Coastguard Worker}
7788*1b3f573fSAndroid Build Coastguard Worker
7789*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
7790*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
7791*1b3f573fSAndroid Build Coastguard Worker}
7792*1b3f573fSAndroid Build Coastguard Worker
7793*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
7794*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
7795*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
7796*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
7797*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7798*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7799*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
7800*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7801*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7802*1b3f573fSAndroid Build Coastguard Worker      }
7803*1b3f573fSAndroid Build Coastguard Worker    }
7804*1b3f573fSAndroid Build Coastguard Worker  }
7805*1b3f573fSAndroid Build Coastguard Worker  return self;
7806*1b3f573fSAndroid Build Coastguard Worker}
7807*1b3f573fSAndroid Build Coastguard Worker
7808*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64DoubleDictionary *)dictionary {
7809*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
7810*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7811*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
7812*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7813*1b3f573fSAndroid Build Coastguard Worker    }
7814*1b3f573fSAndroid Build Coastguard Worker  }
7815*1b3f573fSAndroid Build Coastguard Worker  return self;
7816*1b3f573fSAndroid Build Coastguard Worker}
7817*1b3f573fSAndroid Build Coastguard Worker
7818*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
7819*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
7820*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
7821*1b3f573fSAndroid Build Coastguard Worker}
7822*1b3f573fSAndroid Build Coastguard Worker
7823*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
7824*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
7825*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
7826*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
7827*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
7828*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
7829*1b3f573fSAndroid Build Coastguard Worker}
7830*1b3f573fSAndroid Build Coastguard Worker
7831*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
7832*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self];
7833*1b3f573fSAndroid Build Coastguard Worker}
7834*1b3f573fSAndroid Build Coastguard Worker
7835*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
7836*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
7837*1b3f573fSAndroid Build Coastguard Worker    return YES;
7838*1b3f573fSAndroid Build Coastguard Worker  }
7839*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64DoubleDictionary class]]) {
7840*1b3f573fSAndroid Build Coastguard Worker    return NO;
7841*1b3f573fSAndroid Build Coastguard Worker  }
7842*1b3f573fSAndroid Build Coastguard Worker  GPBInt64DoubleDictionary *otherDictionary = other;
7843*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
7844*1b3f573fSAndroid Build Coastguard Worker}
7845*1b3f573fSAndroid Build Coastguard Worker
7846*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
7847*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7848*1b3f573fSAndroid Build Coastguard Worker}
7849*1b3f573fSAndroid Build Coastguard Worker
7850*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
7851*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
7852*1b3f573fSAndroid Build Coastguard Worker}
7853*1b3f573fSAndroid Build Coastguard Worker
7854*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
7855*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
7856*1b3f573fSAndroid Build Coastguard Worker}
7857*1b3f573fSAndroid Build Coastguard Worker
7858*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
7859*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, double value, BOOL *stop))block {
7860*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
7861*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7862*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7863*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7864*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7865*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7866*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue doubleValue], &stop);
7867*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
7868*1b3f573fSAndroid Build Coastguard Worker      break;
7869*1b3f573fSAndroid Build Coastguard Worker    }
7870*1b3f573fSAndroid Build Coastguard Worker  }
7871*1b3f573fSAndroid Build Coastguard Worker}
7872*1b3f573fSAndroid Build Coastguard Worker
7873*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7874*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7875*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
7876*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
7877*1b3f573fSAndroid Build Coastguard Worker    return 0;
7878*1b3f573fSAndroid Build Coastguard Worker  }
7879*1b3f573fSAndroid Build Coastguard Worker
7880*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7881*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7882*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
7883*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7884*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7885*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7886*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7887*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7888*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
7889*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7890*1b3f573fSAndroid Build Coastguard Worker  }
7891*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
7892*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
7893*1b3f573fSAndroid Build Coastguard Worker  return result;
7894*1b3f573fSAndroid Build Coastguard Worker}
7895*1b3f573fSAndroid Build Coastguard Worker
7896*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7897*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
7898*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
7899*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
7900*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
7901*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
7902*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
7903*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
7904*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
7905*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
7906*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
7907*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
7908*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
7909*1b3f573fSAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
7910*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
7911*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
7912*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
7913*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
7914*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
7915*1b3f573fSAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
7916*1b3f573fSAndroid Build Coastguard Worker  }
7917*1b3f573fSAndroid Build Coastguard Worker}
7918*1b3f573fSAndroid Build Coastguard Worker
7919*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
7920*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
7921*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt64)];
7922*1b3f573fSAndroid Build Coastguard Worker}
7923*1b3f573fSAndroid Build Coastguard Worker
7924*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
7925*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(int64_t key, double value, BOOL *stop) {
7926*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
7927*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
7928*1b3f573fSAndroid Build Coastguard Worker  }];
7929*1b3f573fSAndroid Build Coastguard Worker}
7930*1b3f573fSAndroid Build Coastguard Worker
7931*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(int64_t)key {
7932*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7933*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
7934*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
7935*1b3f573fSAndroid Build Coastguard Worker  }
7936*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
7937*1b3f573fSAndroid Build Coastguard Worker}
7938*1b3f573fSAndroid Build Coastguard Worker
7939*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64DoubleDictionary *)otherDictionary {
7940*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
7941*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7942*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
7943*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
7944*1b3f573fSAndroid Build Coastguard Worker    }
7945*1b3f573fSAndroid Build Coastguard Worker  }
7946*1b3f573fSAndroid Build Coastguard Worker}
7947*1b3f573fSAndroid Build Coastguard Worker
7948*1b3f573fSAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(int64_t)key {
7949*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
7950*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
7951*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
7952*1b3f573fSAndroid Build Coastguard Worker  }
7953*1b3f573fSAndroid Build Coastguard Worker}
7954*1b3f573fSAndroid Build Coastguard Worker
7955*1b3f573fSAndroid Build Coastguard Worker- (void)removeDoubleForKey:(int64_t)aKey {
7956*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
7957*1b3f573fSAndroid Build Coastguard Worker}
7958*1b3f573fSAndroid Build Coastguard Worker
7959*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
7960*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
7961*1b3f573fSAndroid Build Coastguard Worker}
7962*1b3f573fSAndroid Build Coastguard Worker
7963*1b3f573fSAndroid Build Coastguard Worker@end
7964*1b3f573fSAndroid Build Coastguard Worker
7965*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> Enum
7966*1b3f573fSAndroid Build Coastguard Worker
7967*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64EnumDictionary {
7968*1b3f573fSAndroid Build Coastguard Worker @package
7969*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
7970*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
7971*1b3f573fSAndroid Build Coastguard Worker}
7972*1b3f573fSAndroid Build Coastguard Worker
7973*1b3f573fSAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
7974*1b3f573fSAndroid Build Coastguard Worker
7975*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
7976*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
7977*1b3f573fSAndroid Build Coastguard Worker}
7978*1b3f573fSAndroid Build Coastguard Worker
7979*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
7980*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
7981*1b3f573fSAndroid Build Coastguard Worker}
7982*1b3f573fSAndroid Build Coastguard Worker
7983*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
7984*1b3f573fSAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
7985*1b3f573fSAndroid Build Coastguard Worker                                   forKeys:(const int64_t [])keys
7986*1b3f573fSAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
7987*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
7988*1b3f573fSAndroid Build Coastguard Worker  if (self) {
7989*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
7990*1b3f573fSAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
7991*1b3f573fSAndroid Build Coastguard Worker    if (count && rawValues && keys) {
7992*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
7993*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
7994*1b3f573fSAndroid Build Coastguard Worker      }
7995*1b3f573fSAndroid Build Coastguard Worker    }
7996*1b3f573fSAndroid Build Coastguard Worker  }
7997*1b3f573fSAndroid Build Coastguard Worker  return self;
7998*1b3f573fSAndroid Build Coastguard Worker}
7999*1b3f573fSAndroid Build Coastguard Worker
8000*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64EnumDictionary *)dictionary {
8001*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
8002*1b3f573fSAndroid Build Coastguard Worker                                rawValues:NULL
8003*1b3f573fSAndroid Build Coastguard Worker                                  forKeys:NULL
8004*1b3f573fSAndroid Build Coastguard Worker                                    count:0];
8005*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8006*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
8007*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8008*1b3f573fSAndroid Build Coastguard Worker    }
8009*1b3f573fSAndroid Build Coastguard Worker  }
8010*1b3f573fSAndroid Build Coastguard Worker  return self;
8011*1b3f573fSAndroid Build Coastguard Worker}
8012*1b3f573fSAndroid Build Coastguard Worker
8013*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
8014*1b3f573fSAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
8015*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
8016*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
8017*1b3f573fSAndroid Build Coastguard Worker}
8018*1b3f573fSAndroid Build Coastguard Worker
8019*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
8020*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8021*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8022*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
8023*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
8024*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
8025*1b3f573fSAndroid Build Coastguard Worker}
8026*1b3f573fSAndroid Build Coastguard Worker
8027*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8028*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
8029*1b3f573fSAndroid Build Coastguard Worker}
8030*1b3f573fSAndroid Build Coastguard Worker
8031*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8032*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
8033*1b3f573fSAndroid Build Coastguard Worker    return YES;
8034*1b3f573fSAndroid Build Coastguard Worker  }
8035*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64EnumDictionary class]]) {
8036*1b3f573fSAndroid Build Coastguard Worker    return NO;
8037*1b3f573fSAndroid Build Coastguard Worker  }
8038*1b3f573fSAndroid Build Coastguard Worker  GPBInt64EnumDictionary *otherDictionary = other;
8039*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8040*1b3f573fSAndroid Build Coastguard Worker}
8041*1b3f573fSAndroid Build Coastguard Worker
8042*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
8043*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8044*1b3f573fSAndroid Build Coastguard Worker}
8045*1b3f573fSAndroid Build Coastguard Worker
8046*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
8047*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8048*1b3f573fSAndroid Build Coastguard Worker}
8049*1b3f573fSAndroid Build Coastguard Worker
8050*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
8051*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8052*1b3f573fSAndroid Build Coastguard Worker}
8053*1b3f573fSAndroid Build Coastguard Worker
8054*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
8055*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block {
8056*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
8057*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8058*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8059*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
8060*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8061*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8062*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], [aValue intValue], &stop);
8063*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
8064*1b3f573fSAndroid Build Coastguard Worker      break;
8065*1b3f573fSAndroid Build Coastguard Worker    }
8066*1b3f573fSAndroid Build Coastguard Worker  }
8067*1b3f573fSAndroid Build Coastguard Worker}
8068*1b3f573fSAndroid Build Coastguard Worker
8069*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8070*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8071*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8072*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
8073*1b3f573fSAndroid Build Coastguard Worker    return 0;
8074*1b3f573fSAndroid Build Coastguard Worker  }
8075*1b3f573fSAndroid Build Coastguard Worker
8076*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8077*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8078*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
8079*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8080*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
8081*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8082*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8083*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8084*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
8085*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8086*1b3f573fSAndroid Build Coastguard Worker  }
8087*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8088*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
8089*1b3f573fSAndroid Build Coastguard Worker  return result;
8090*1b3f573fSAndroid Build Coastguard Worker}
8091*1b3f573fSAndroid Build Coastguard Worker
8092*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8093*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8094*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8095*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8096*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8097*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8098*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8099*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
8100*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8101*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8102*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8103*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
8104*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
8105*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
8106*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8107*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8108*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8109*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
8110*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8111*1b3f573fSAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8112*1b3f573fSAndroid Build Coastguard Worker  }
8113*1b3f573fSAndroid Build Coastguard Worker}
8114*1b3f573fSAndroid Build Coastguard Worker
8115*1b3f573fSAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
8116*1b3f573fSAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
8117*1b3f573fSAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
8118*1b3f573fSAndroid Build Coastguard Worker  size_t msgSize = ComputeDictInt64FieldSize(key->valueInt64, kMapKeyFieldNumber, keyDataType);
8119*1b3f573fSAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
8120*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
8121*1b3f573fSAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
8122*1b3f573fSAndroid Build Coastguard Worker  WriteDictInt64Field(outputStream, key->valueInt64, kMapKeyFieldNumber, keyDataType);
8123*1b3f573fSAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
8124*1b3f573fSAndroid Build Coastguard Worker  [outputStream release];
8125*1b3f573fSAndroid Build Coastguard Worker  return data;
8126*1b3f573fSAndroid Build Coastguard Worker}
8127*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8128*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8129*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt64)];
8130*1b3f573fSAndroid Build Coastguard Worker}
8131*1b3f573fSAndroid Build Coastguard Worker
8132*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8133*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
8134*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
8135*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], @(value));
8136*1b3f573fSAndroid Build Coastguard Worker  }];
8137*1b3f573fSAndroid Build Coastguard Worker}
8138*1b3f573fSAndroid Build Coastguard Worker
8139*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(int64_t)key {
8140*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8141*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
8142*1b3f573fSAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
8143*1b3f573fSAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
8144*1b3f573fSAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
8145*1b3f573fSAndroid Build Coastguard Worker    }
8146*1b3f573fSAndroid Build Coastguard Worker    *value = result;
8147*1b3f573fSAndroid Build Coastguard Worker  }
8148*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
8149*1b3f573fSAndroid Build Coastguard Worker}
8150*1b3f573fSAndroid Build Coastguard Worker
8151*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int64_t)key {
8152*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8153*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && rawValue) {
8154*1b3f573fSAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
8155*1b3f573fSAndroid Build Coastguard Worker  }
8156*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
8157*1b3f573fSAndroid Build Coastguard Worker}
8158*1b3f573fSAndroid Build Coastguard Worker
8159*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
8160*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block {
8161*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
8162*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
8163*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
8164*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
8165*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8166*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
8167*1b3f573fSAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
8168*1b3f573fSAndroid Build Coastguard Worker      if (!func(unwrapped)) {
8169*1b3f573fSAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
8170*1b3f573fSAndroid Build Coastguard Worker      }
8171*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], unwrapped, &stop);
8172*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
8173*1b3f573fSAndroid Build Coastguard Worker      break;
8174*1b3f573fSAndroid Build Coastguard Worker    }
8175*1b3f573fSAndroid Build Coastguard Worker  }
8176*1b3f573fSAndroid Build Coastguard Worker}
8177*1b3f573fSAndroid Build Coastguard Worker
8178*1b3f573fSAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBInt64EnumDictionary *)otherDictionary {
8179*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
8180*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8181*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
8182*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8183*1b3f573fSAndroid Build Coastguard Worker    }
8184*1b3f573fSAndroid Build Coastguard Worker  }
8185*1b3f573fSAndroid Build Coastguard Worker}
8186*1b3f573fSAndroid Build Coastguard Worker
8187*1b3f573fSAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(int64_t)key {
8188*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
8189*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
8190*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8191*1b3f573fSAndroid Build Coastguard Worker  }
8192*1b3f573fSAndroid Build Coastguard Worker}
8193*1b3f573fSAndroid Build Coastguard Worker
8194*1b3f573fSAndroid Build Coastguard Worker- (void)removeEnumForKey:(int64_t)aKey {
8195*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
8196*1b3f573fSAndroid Build Coastguard Worker}
8197*1b3f573fSAndroid Build Coastguard Worker
8198*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
8199*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8200*1b3f573fSAndroid Build Coastguard Worker}
8201*1b3f573fSAndroid Build Coastguard Worker
8202*1b3f573fSAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(int64_t)key {
8203*1b3f573fSAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
8204*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8205*1b3f573fSAndroid Build Coastguard Worker                format:@"GPBInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
8206*1b3f573fSAndroid Build Coastguard Worker                       value];
8207*1b3f573fSAndroid Build Coastguard Worker  }
8208*1b3f573fSAndroid Build Coastguard Worker
8209*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:@(key)];
8210*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
8211*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8212*1b3f573fSAndroid Build Coastguard Worker  }
8213*1b3f573fSAndroid Build Coastguard Worker}
8214*1b3f573fSAndroid Build Coastguard Worker
8215*1b3f573fSAndroid Build Coastguard Worker@end
8216*1b3f573fSAndroid Build Coastguard Worker
8217*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 -> Object
8218*1b3f573fSAndroid Build Coastguard Worker
8219*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64ObjectDictionary {
8220*1b3f573fSAndroid Build Coastguard Worker @package
8221*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8222*1b3f573fSAndroid Build Coastguard Worker}
8223*1b3f573fSAndroid Build Coastguard Worker
8224*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
8225*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
8226*1b3f573fSAndroid Build Coastguard Worker}
8227*1b3f573fSAndroid Build Coastguard Worker
8228*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
8229*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const int64_t [])keys
8230*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
8231*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
8232*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8233*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8234*1b3f573fSAndroid Build Coastguard Worker    if (count && objects && keys) {
8235*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8236*1b3f573fSAndroid Build Coastguard Worker        if (!objects[i]) {
8237*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8238*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil object to a Dictionary"];
8239*1b3f573fSAndroid Build Coastguard Worker        }
8240*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:objects[i] forKey:@(keys[i])];
8241*1b3f573fSAndroid Build Coastguard Worker      }
8242*1b3f573fSAndroid Build Coastguard Worker    }
8243*1b3f573fSAndroid Build Coastguard Worker  }
8244*1b3f573fSAndroid Build Coastguard Worker  return self;
8245*1b3f573fSAndroid Build Coastguard Worker}
8246*1b3f573fSAndroid Build Coastguard Worker
8247*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64ObjectDictionary *)dictionary {
8248*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
8249*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8250*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
8251*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8252*1b3f573fSAndroid Build Coastguard Worker    }
8253*1b3f573fSAndroid Build Coastguard Worker  }
8254*1b3f573fSAndroid Build Coastguard Worker  return self;
8255*1b3f573fSAndroid Build Coastguard Worker}
8256*1b3f573fSAndroid Build Coastguard Worker
8257*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8258*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
8259*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
8260*1b3f573fSAndroid Build Coastguard Worker}
8261*1b3f573fSAndroid Build Coastguard Worker
8262*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
8263*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8264*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8265*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
8266*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
8267*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
8268*1b3f573fSAndroid Build Coastguard Worker}
8269*1b3f573fSAndroid Build Coastguard Worker
8270*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8271*1b3f573fSAndroid Build Coastguard Worker  return [[GPBInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self];
8272*1b3f573fSAndroid Build Coastguard Worker}
8273*1b3f573fSAndroid Build Coastguard Worker
8274*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8275*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
8276*1b3f573fSAndroid Build Coastguard Worker    return YES;
8277*1b3f573fSAndroid Build Coastguard Worker  }
8278*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBInt64ObjectDictionary class]]) {
8279*1b3f573fSAndroid Build Coastguard Worker    return NO;
8280*1b3f573fSAndroid Build Coastguard Worker  }
8281*1b3f573fSAndroid Build Coastguard Worker  GPBInt64ObjectDictionary *otherDictionary = other;
8282*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8283*1b3f573fSAndroid Build Coastguard Worker}
8284*1b3f573fSAndroid Build Coastguard Worker
8285*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
8286*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8287*1b3f573fSAndroid Build Coastguard Worker}
8288*1b3f573fSAndroid Build Coastguard Worker
8289*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
8290*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8291*1b3f573fSAndroid Build Coastguard Worker}
8292*1b3f573fSAndroid Build Coastguard Worker
8293*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
8294*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8295*1b3f573fSAndroid Build Coastguard Worker}
8296*1b3f573fSAndroid Build Coastguard Worker
8297*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
8298*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(int64_t key, id object, BOOL *stop))block {
8299*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
8300*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8301*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8302*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
8303*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8304*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
8305*1b3f573fSAndroid Build Coastguard Worker    block([aKey longLongValue], aObject, &stop);
8306*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
8307*1b3f573fSAndroid Build Coastguard Worker      break;
8308*1b3f573fSAndroid Build Coastguard Worker    }
8309*1b3f573fSAndroid Build Coastguard Worker  }
8310*1b3f573fSAndroid Build Coastguard Worker}
8311*1b3f573fSAndroid Build Coastguard Worker
8312*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isInitialized {
8313*1b3f573fSAndroid Build Coastguard Worker  for (GPBMessage *msg in [_dictionary objectEnumerator]) {
8314*1b3f573fSAndroid Build Coastguard Worker    if (!msg.initialized) {
8315*1b3f573fSAndroid Build Coastguard Worker      return NO;
8316*1b3f573fSAndroid Build Coastguard Worker    }
8317*1b3f573fSAndroid Build Coastguard Worker  }
8318*1b3f573fSAndroid Build Coastguard Worker  return YES;
8319*1b3f573fSAndroid Build Coastguard Worker}
8320*1b3f573fSAndroid Build Coastguard Worker
8321*1b3f573fSAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
8322*1b3f573fSAndroid Build Coastguard Worker  GPBInt64ObjectDictionary *newDict =
8323*1b3f573fSAndroid Build Coastguard Worker      [[GPBInt64ObjectDictionary alloc] init];
8324*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
8325*1b3f573fSAndroid Build Coastguard Worker  id aKey;
8326*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *internalDict = newDict->_dictionary;
8327*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8328*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *msg = _dictionary[aKey];
8329*1b3f573fSAndroid Build Coastguard Worker    GPBMessage *copiedMsg = [msg copyWithZone:zone];
8330*1b3f573fSAndroid Build Coastguard Worker    [internalDict setObject:copiedMsg forKey:aKey];
8331*1b3f573fSAndroid Build Coastguard Worker    [copiedMsg release];
8332*1b3f573fSAndroid Build Coastguard Worker  }
8333*1b3f573fSAndroid Build Coastguard Worker  return newDict;
8334*1b3f573fSAndroid Build Coastguard Worker}
8335*1b3f573fSAndroid Build Coastguard Worker
8336*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8337*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8338*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8339*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
8340*1b3f573fSAndroid Build Coastguard Worker    return 0;
8341*1b3f573fSAndroid Build Coastguard Worker  }
8342*1b3f573fSAndroid Build Coastguard Worker
8343*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8344*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8345*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
8346*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8347*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
8348*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8349*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
8350*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8351*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
8352*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8353*1b3f573fSAndroid Build Coastguard Worker  }
8354*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8355*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
8356*1b3f573fSAndroid Build Coastguard Worker  return result;
8357*1b3f573fSAndroid Build Coastguard Worker}
8358*1b3f573fSAndroid Build Coastguard Worker
8359*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8360*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8361*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8362*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8363*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8364*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8365*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8366*1b3f573fSAndroid Build Coastguard Worker  NSNumber *aKey;
8367*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8368*1b3f573fSAndroid Build Coastguard Worker    id aObject = internal[aKey];
8369*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8370*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
8371*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedKey = [aKey longLongValue];
8372*1b3f573fSAndroid Build Coastguard Worker    id unwrappedValue = aObject;
8373*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8374*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8375*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8376*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
8377*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8378*1b3f573fSAndroid Build Coastguard Worker    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8379*1b3f573fSAndroid Build Coastguard Worker  }
8380*1b3f573fSAndroid Build Coastguard Worker}
8381*1b3f573fSAndroid Build Coastguard Worker
8382*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8383*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8384*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:value->valueString forKey:@(key->valueInt64)];
8385*1b3f573fSAndroid Build Coastguard Worker}
8386*1b3f573fSAndroid Build Coastguard Worker
8387*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8388*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndObjectsUsingBlock:^(int64_t key, id object, BOOL *stop) {
8389*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
8390*1b3f573fSAndroid Build Coastguard Worker      block([NSString stringWithFormat:@"%lld", key], object);
8391*1b3f573fSAndroid Build Coastguard Worker  }];
8392*1b3f573fSAndroid Build Coastguard Worker}
8393*1b3f573fSAndroid Build Coastguard Worker
8394*1b3f573fSAndroid Build Coastguard Worker- (id)objectForKey:(int64_t)key {
8395*1b3f573fSAndroid Build Coastguard Worker  id result = [_dictionary objectForKey:@(key)];
8396*1b3f573fSAndroid Build Coastguard Worker  return result;
8397*1b3f573fSAndroid Build Coastguard Worker}
8398*1b3f573fSAndroid Build Coastguard Worker
8399*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64ObjectDictionary *)otherDictionary {
8400*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
8401*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8402*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
8403*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8404*1b3f573fSAndroid Build Coastguard Worker    }
8405*1b3f573fSAndroid Build Coastguard Worker  }
8406*1b3f573fSAndroid Build Coastguard Worker}
8407*1b3f573fSAndroid Build Coastguard Worker
8408*1b3f573fSAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(int64_t)key {
8409*1b3f573fSAndroid Build Coastguard Worker  if (!object) {
8410*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8411*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
8412*1b3f573fSAndroid Build Coastguard Worker  }
8413*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:object forKey:@(key)];
8414*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
8415*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8416*1b3f573fSAndroid Build Coastguard Worker  }
8417*1b3f573fSAndroid Build Coastguard Worker}
8418*1b3f573fSAndroid Build Coastguard Worker
8419*1b3f573fSAndroid Build Coastguard Worker- (void)removeObjectForKey:(int64_t)aKey {
8420*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:@(aKey)];
8421*1b3f573fSAndroid Build Coastguard Worker}
8422*1b3f573fSAndroid Build Coastguard Worker
8423*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
8424*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8425*1b3f573fSAndroid Build Coastguard Worker}
8426*1b3f573fSAndroid Build Coastguard Worker
8427*1b3f573fSAndroid Build Coastguard Worker@end
8428*1b3f573fSAndroid Build Coastguard Worker
8429*1b3f573fSAndroid Build Coastguard Worker// clang-format on
8430*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_POD_IMPL_FOR_KEY(String, NSString, *, OBJECT)
8431*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
8432*1b3f573fSAndroid Build Coastguard Worker// clang-format off
8433*1b3f573fSAndroid Build Coastguard Worker
8434*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> UInt32
8435*1b3f573fSAndroid Build Coastguard Worker
8436*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringUInt32Dictionary {
8437*1b3f573fSAndroid Build Coastguard Worker @package
8438*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8439*1b3f573fSAndroid Build Coastguard Worker}
8440*1b3f573fSAndroid Build Coastguard Worker
8441*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
8442*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
8443*1b3f573fSAndroid Build Coastguard Worker}
8444*1b3f573fSAndroid Build Coastguard Worker
8445*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
8446*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const NSString * [])keys
8447*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
8448*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
8449*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8450*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8451*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
8452*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8453*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
8454*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8455*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
8456*1b3f573fSAndroid Build Coastguard Worker        }
8457*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
8458*1b3f573fSAndroid Build Coastguard Worker      }
8459*1b3f573fSAndroid Build Coastguard Worker    }
8460*1b3f573fSAndroid Build Coastguard Worker  }
8461*1b3f573fSAndroid Build Coastguard Worker  return self;
8462*1b3f573fSAndroid Build Coastguard Worker}
8463*1b3f573fSAndroid Build Coastguard Worker
8464*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringUInt32Dictionary *)dictionary {
8465*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
8466*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8467*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
8468*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8469*1b3f573fSAndroid Build Coastguard Worker    }
8470*1b3f573fSAndroid Build Coastguard Worker  }
8471*1b3f573fSAndroid Build Coastguard Worker  return self;
8472*1b3f573fSAndroid Build Coastguard Worker}
8473*1b3f573fSAndroid Build Coastguard Worker
8474*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8475*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
8476*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
8477*1b3f573fSAndroid Build Coastguard Worker}
8478*1b3f573fSAndroid Build Coastguard Worker
8479*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
8480*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8481*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8482*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
8483*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
8484*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
8485*1b3f573fSAndroid Build Coastguard Worker}
8486*1b3f573fSAndroid Build Coastguard Worker
8487*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8488*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringUInt32Dictionary allocWithZone:zone] initWithDictionary:self];
8489*1b3f573fSAndroid Build Coastguard Worker}
8490*1b3f573fSAndroid Build Coastguard Worker
8491*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8492*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
8493*1b3f573fSAndroid Build Coastguard Worker    return YES;
8494*1b3f573fSAndroid Build Coastguard Worker  }
8495*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringUInt32Dictionary class]]) {
8496*1b3f573fSAndroid Build Coastguard Worker    return NO;
8497*1b3f573fSAndroid Build Coastguard Worker  }
8498*1b3f573fSAndroid Build Coastguard Worker  GPBStringUInt32Dictionary *otherDictionary = other;
8499*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8500*1b3f573fSAndroid Build Coastguard Worker}
8501*1b3f573fSAndroid Build Coastguard Worker
8502*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
8503*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8504*1b3f573fSAndroid Build Coastguard Worker}
8505*1b3f573fSAndroid Build Coastguard Worker
8506*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
8507*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8508*1b3f573fSAndroid Build Coastguard Worker}
8509*1b3f573fSAndroid Build Coastguard Worker
8510*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
8511*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8512*1b3f573fSAndroid Build Coastguard Worker}
8513*1b3f573fSAndroid Build Coastguard Worker
8514*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
8515*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, uint32_t value, BOOL *stop))block {
8516*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
8517*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8518*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8519*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8520*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8521*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8522*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue unsignedIntValue], &stop);
8523*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
8524*1b3f573fSAndroid Build Coastguard Worker      break;
8525*1b3f573fSAndroid Build Coastguard Worker    }
8526*1b3f573fSAndroid Build Coastguard Worker  }
8527*1b3f573fSAndroid Build Coastguard Worker}
8528*1b3f573fSAndroid Build Coastguard Worker
8529*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8530*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8531*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8532*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
8533*1b3f573fSAndroid Build Coastguard Worker    return 0;
8534*1b3f573fSAndroid Build Coastguard Worker  }
8535*1b3f573fSAndroid Build Coastguard Worker
8536*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8537*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8538*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
8539*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8540*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8541*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8542*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8543*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
8544*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
8545*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8546*1b3f573fSAndroid Build Coastguard Worker  }
8547*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8548*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
8549*1b3f573fSAndroid Build Coastguard Worker  return result;
8550*1b3f573fSAndroid Build Coastguard Worker}
8551*1b3f573fSAndroid Build Coastguard Worker
8552*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8553*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8554*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8555*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8556*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8557*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8558*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8559*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8560*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8561*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8562*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8563*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
8564*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
8565*1b3f573fSAndroid Build Coastguard Worker    uint32_t unwrappedValue = [aValue unsignedIntValue];
8566*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8567*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8568*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8569*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
8570*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8571*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8572*1b3f573fSAndroid Build Coastguard Worker  }
8573*1b3f573fSAndroid Build Coastguard Worker}
8574*1b3f573fSAndroid Build Coastguard Worker
8575*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8576*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8577*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt32) forKey:key->valueString];
8578*1b3f573fSAndroid Build Coastguard Worker}
8579*1b3f573fSAndroid Build Coastguard Worker
8580*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8581*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt32sUsingBlock:^(NSString *key, uint32_t value, BOOL *stop) {
8582*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
8583*1b3f573fSAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%u", value]);
8584*1b3f573fSAndroid Build Coastguard Worker  }];
8585*1b3f573fSAndroid Build Coastguard Worker}
8586*1b3f573fSAndroid Build Coastguard Worker
8587*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(NSString *)key {
8588*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
8589*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
8590*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedIntValue];
8591*1b3f573fSAndroid Build Coastguard Worker  }
8592*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
8593*1b3f573fSAndroid Build Coastguard Worker}
8594*1b3f573fSAndroid Build Coastguard Worker
8595*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringUInt32Dictionary *)otherDictionary {
8596*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
8597*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8598*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
8599*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8600*1b3f573fSAndroid Build Coastguard Worker    }
8601*1b3f573fSAndroid Build Coastguard Worker  }
8602*1b3f573fSAndroid Build Coastguard Worker}
8603*1b3f573fSAndroid Build Coastguard Worker
8604*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(NSString *)key {
8605*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
8606*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8607*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
8608*1b3f573fSAndroid Build Coastguard Worker  }
8609*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
8610*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
8611*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8612*1b3f573fSAndroid Build Coastguard Worker  }
8613*1b3f573fSAndroid Build Coastguard Worker}
8614*1b3f573fSAndroid Build Coastguard Worker
8615*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(NSString *)aKey {
8616*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
8617*1b3f573fSAndroid Build Coastguard Worker}
8618*1b3f573fSAndroid Build Coastguard Worker
8619*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
8620*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8621*1b3f573fSAndroid Build Coastguard Worker}
8622*1b3f573fSAndroid Build Coastguard Worker
8623*1b3f573fSAndroid Build Coastguard Worker@end
8624*1b3f573fSAndroid Build Coastguard Worker
8625*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> Int32
8626*1b3f573fSAndroid Build Coastguard Worker
8627*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringInt32Dictionary {
8628*1b3f573fSAndroid Build Coastguard Worker @package
8629*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8630*1b3f573fSAndroid Build Coastguard Worker}
8631*1b3f573fSAndroid Build Coastguard Worker
8632*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
8633*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
8634*1b3f573fSAndroid Build Coastguard Worker}
8635*1b3f573fSAndroid Build Coastguard Worker
8636*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
8637*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const NSString * [])keys
8638*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
8639*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
8640*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8641*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8642*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
8643*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8644*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
8645*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8646*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
8647*1b3f573fSAndroid Build Coastguard Worker        }
8648*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
8649*1b3f573fSAndroid Build Coastguard Worker      }
8650*1b3f573fSAndroid Build Coastguard Worker    }
8651*1b3f573fSAndroid Build Coastguard Worker  }
8652*1b3f573fSAndroid Build Coastguard Worker  return self;
8653*1b3f573fSAndroid Build Coastguard Worker}
8654*1b3f573fSAndroid Build Coastguard Worker
8655*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringInt32Dictionary *)dictionary {
8656*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
8657*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8658*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
8659*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8660*1b3f573fSAndroid Build Coastguard Worker    }
8661*1b3f573fSAndroid Build Coastguard Worker  }
8662*1b3f573fSAndroid Build Coastguard Worker  return self;
8663*1b3f573fSAndroid Build Coastguard Worker}
8664*1b3f573fSAndroid Build Coastguard Worker
8665*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8666*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
8667*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
8668*1b3f573fSAndroid Build Coastguard Worker}
8669*1b3f573fSAndroid Build Coastguard Worker
8670*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
8671*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8672*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8673*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
8674*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
8675*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
8676*1b3f573fSAndroid Build Coastguard Worker}
8677*1b3f573fSAndroid Build Coastguard Worker
8678*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8679*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringInt32Dictionary allocWithZone:zone] initWithDictionary:self];
8680*1b3f573fSAndroid Build Coastguard Worker}
8681*1b3f573fSAndroid Build Coastguard Worker
8682*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8683*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
8684*1b3f573fSAndroid Build Coastguard Worker    return YES;
8685*1b3f573fSAndroid Build Coastguard Worker  }
8686*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringInt32Dictionary class]]) {
8687*1b3f573fSAndroid Build Coastguard Worker    return NO;
8688*1b3f573fSAndroid Build Coastguard Worker  }
8689*1b3f573fSAndroid Build Coastguard Worker  GPBStringInt32Dictionary *otherDictionary = other;
8690*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8691*1b3f573fSAndroid Build Coastguard Worker}
8692*1b3f573fSAndroid Build Coastguard Worker
8693*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
8694*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8695*1b3f573fSAndroid Build Coastguard Worker}
8696*1b3f573fSAndroid Build Coastguard Worker
8697*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
8698*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8699*1b3f573fSAndroid Build Coastguard Worker}
8700*1b3f573fSAndroid Build Coastguard Worker
8701*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
8702*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8703*1b3f573fSAndroid Build Coastguard Worker}
8704*1b3f573fSAndroid Build Coastguard Worker
8705*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
8706*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block {
8707*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
8708*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8709*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8710*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8711*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8712*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8713*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue intValue], &stop);
8714*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
8715*1b3f573fSAndroid Build Coastguard Worker      break;
8716*1b3f573fSAndroid Build Coastguard Worker    }
8717*1b3f573fSAndroid Build Coastguard Worker  }
8718*1b3f573fSAndroid Build Coastguard Worker}
8719*1b3f573fSAndroid Build Coastguard Worker
8720*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8721*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8722*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8723*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
8724*1b3f573fSAndroid Build Coastguard Worker    return 0;
8725*1b3f573fSAndroid Build Coastguard Worker  }
8726*1b3f573fSAndroid Build Coastguard Worker
8727*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8728*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8729*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
8730*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8731*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8732*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8733*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8734*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
8735*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
8736*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8737*1b3f573fSAndroid Build Coastguard Worker  }
8738*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8739*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
8740*1b3f573fSAndroid Build Coastguard Worker  return result;
8741*1b3f573fSAndroid Build Coastguard Worker}
8742*1b3f573fSAndroid Build Coastguard Worker
8743*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8744*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8745*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8746*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8747*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8748*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8749*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8750*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8751*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8752*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8753*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8754*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
8755*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
8756*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
8757*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8758*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8759*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8760*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
8761*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8762*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8763*1b3f573fSAndroid Build Coastguard Worker  }
8764*1b3f573fSAndroid Build Coastguard Worker}
8765*1b3f573fSAndroid Build Coastguard Worker
8766*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8767*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8768*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt32) forKey:key->valueString];
8769*1b3f573fSAndroid Build Coastguard Worker}
8770*1b3f573fSAndroid Build Coastguard Worker
8771*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8772*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt32sUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
8773*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
8774*1b3f573fSAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%d", value]);
8775*1b3f573fSAndroid Build Coastguard Worker  }];
8776*1b3f573fSAndroid Build Coastguard Worker}
8777*1b3f573fSAndroid Build Coastguard Worker
8778*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(NSString *)key {
8779*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
8780*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
8781*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped intValue];
8782*1b3f573fSAndroid Build Coastguard Worker  }
8783*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
8784*1b3f573fSAndroid Build Coastguard Worker}
8785*1b3f573fSAndroid Build Coastguard Worker
8786*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringInt32Dictionary *)otherDictionary {
8787*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
8788*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8789*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
8790*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8791*1b3f573fSAndroid Build Coastguard Worker    }
8792*1b3f573fSAndroid Build Coastguard Worker  }
8793*1b3f573fSAndroid Build Coastguard Worker}
8794*1b3f573fSAndroid Build Coastguard Worker
8795*1b3f573fSAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(NSString *)key {
8796*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
8797*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8798*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
8799*1b3f573fSAndroid Build Coastguard Worker  }
8800*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
8801*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
8802*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8803*1b3f573fSAndroid Build Coastguard Worker  }
8804*1b3f573fSAndroid Build Coastguard Worker}
8805*1b3f573fSAndroid Build Coastguard Worker
8806*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt32ForKey:(NSString *)aKey {
8807*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
8808*1b3f573fSAndroid Build Coastguard Worker}
8809*1b3f573fSAndroid Build Coastguard Worker
8810*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
8811*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
8812*1b3f573fSAndroid Build Coastguard Worker}
8813*1b3f573fSAndroid Build Coastguard Worker
8814*1b3f573fSAndroid Build Coastguard Worker@end
8815*1b3f573fSAndroid Build Coastguard Worker
8816*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> UInt64
8817*1b3f573fSAndroid Build Coastguard Worker
8818*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringUInt64Dictionary {
8819*1b3f573fSAndroid Build Coastguard Worker @package
8820*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
8821*1b3f573fSAndroid Build Coastguard Worker}
8822*1b3f573fSAndroid Build Coastguard Worker
8823*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
8824*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
8825*1b3f573fSAndroid Build Coastguard Worker}
8826*1b3f573fSAndroid Build Coastguard Worker
8827*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
8828*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const NSString * [])keys
8829*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
8830*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
8831*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8832*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
8833*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
8834*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
8835*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
8836*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
8837*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
8838*1b3f573fSAndroid Build Coastguard Worker        }
8839*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
8840*1b3f573fSAndroid Build Coastguard Worker      }
8841*1b3f573fSAndroid Build Coastguard Worker    }
8842*1b3f573fSAndroid Build Coastguard Worker  }
8843*1b3f573fSAndroid Build Coastguard Worker  return self;
8844*1b3f573fSAndroid Build Coastguard Worker}
8845*1b3f573fSAndroid Build Coastguard Worker
8846*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringUInt64Dictionary *)dictionary {
8847*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
8848*1b3f573fSAndroid Build Coastguard Worker  if (self) {
8849*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
8850*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8851*1b3f573fSAndroid Build Coastguard Worker    }
8852*1b3f573fSAndroid Build Coastguard Worker  }
8853*1b3f573fSAndroid Build Coastguard Worker  return self;
8854*1b3f573fSAndroid Build Coastguard Worker}
8855*1b3f573fSAndroid Build Coastguard Worker
8856*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
8857*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
8858*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
8859*1b3f573fSAndroid Build Coastguard Worker}
8860*1b3f573fSAndroid Build Coastguard Worker
8861*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
8862*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
8863*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
8864*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
8865*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
8866*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
8867*1b3f573fSAndroid Build Coastguard Worker}
8868*1b3f573fSAndroid Build Coastguard Worker
8869*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
8870*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringUInt64Dictionary allocWithZone:zone] initWithDictionary:self];
8871*1b3f573fSAndroid Build Coastguard Worker}
8872*1b3f573fSAndroid Build Coastguard Worker
8873*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
8874*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
8875*1b3f573fSAndroid Build Coastguard Worker    return YES;
8876*1b3f573fSAndroid Build Coastguard Worker  }
8877*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringUInt64Dictionary class]]) {
8878*1b3f573fSAndroid Build Coastguard Worker    return NO;
8879*1b3f573fSAndroid Build Coastguard Worker  }
8880*1b3f573fSAndroid Build Coastguard Worker  GPBStringUInt64Dictionary *otherDictionary = other;
8881*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
8882*1b3f573fSAndroid Build Coastguard Worker}
8883*1b3f573fSAndroid Build Coastguard Worker
8884*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
8885*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8886*1b3f573fSAndroid Build Coastguard Worker}
8887*1b3f573fSAndroid Build Coastguard Worker
8888*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
8889*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
8890*1b3f573fSAndroid Build Coastguard Worker}
8891*1b3f573fSAndroid Build Coastguard Worker
8892*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
8893*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
8894*1b3f573fSAndroid Build Coastguard Worker}
8895*1b3f573fSAndroid Build Coastguard Worker
8896*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
8897*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, uint64_t value, BOOL *stop))block {
8898*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
8899*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8900*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8901*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8902*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8903*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8904*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue unsignedLongLongValue], &stop);
8905*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
8906*1b3f573fSAndroid Build Coastguard Worker      break;
8907*1b3f573fSAndroid Build Coastguard Worker    }
8908*1b3f573fSAndroid Build Coastguard Worker  }
8909*1b3f573fSAndroid Build Coastguard Worker}
8910*1b3f573fSAndroid Build Coastguard Worker
8911*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8912*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8913*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
8914*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
8915*1b3f573fSAndroid Build Coastguard Worker    return 0;
8916*1b3f573fSAndroid Build Coastguard Worker  }
8917*1b3f573fSAndroid Build Coastguard Worker
8918*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8919*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8920*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
8921*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8922*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8923*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8924*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8925*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
8926*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
8927*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8928*1b3f573fSAndroid Build Coastguard Worker  }
8929*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
8930*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
8931*1b3f573fSAndroid Build Coastguard Worker  return result;
8932*1b3f573fSAndroid Build Coastguard Worker}
8933*1b3f573fSAndroid Build Coastguard Worker
8934*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8935*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
8936*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
8937*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
8938*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
8939*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
8940*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
8941*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
8942*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
8943*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
8944*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
8945*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
8946*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
8947*1b3f573fSAndroid Build Coastguard Worker    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
8948*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
8949*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
8950*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
8951*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
8952*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
8953*1b3f573fSAndroid Build Coastguard Worker    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
8954*1b3f573fSAndroid Build Coastguard Worker  }
8955*1b3f573fSAndroid Build Coastguard Worker}
8956*1b3f573fSAndroid Build Coastguard Worker
8957*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
8958*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
8959*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueUInt64) forKey:key->valueString];
8960*1b3f573fSAndroid Build Coastguard Worker}
8961*1b3f573fSAndroid Build Coastguard Worker
8962*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
8963*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndUInt64sUsingBlock:^(NSString *key, uint64_t value, BOOL *stop) {
8964*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
8965*1b3f573fSAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%llu", value]);
8966*1b3f573fSAndroid Build Coastguard Worker  }];
8967*1b3f573fSAndroid Build Coastguard Worker}
8968*1b3f573fSAndroid Build Coastguard Worker
8969*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(NSString *)key {
8970*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
8971*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
8972*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped unsignedLongLongValue];
8973*1b3f573fSAndroid Build Coastguard Worker  }
8974*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
8975*1b3f573fSAndroid Build Coastguard Worker}
8976*1b3f573fSAndroid Build Coastguard Worker
8977*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringUInt64Dictionary *)otherDictionary {
8978*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
8979*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8980*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
8981*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
8982*1b3f573fSAndroid Build Coastguard Worker    }
8983*1b3f573fSAndroid Build Coastguard Worker  }
8984*1b3f573fSAndroid Build Coastguard Worker}
8985*1b3f573fSAndroid Build Coastguard Worker
8986*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(NSString *)key {
8987*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
8988*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
8989*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
8990*1b3f573fSAndroid Build Coastguard Worker  }
8991*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
8992*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
8993*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
8994*1b3f573fSAndroid Build Coastguard Worker  }
8995*1b3f573fSAndroid Build Coastguard Worker}
8996*1b3f573fSAndroid Build Coastguard Worker
8997*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(NSString *)aKey {
8998*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
8999*1b3f573fSAndroid Build Coastguard Worker}
9000*1b3f573fSAndroid Build Coastguard Worker
9001*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
9002*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9003*1b3f573fSAndroid Build Coastguard Worker}
9004*1b3f573fSAndroid Build Coastguard Worker
9005*1b3f573fSAndroid Build Coastguard Worker@end
9006*1b3f573fSAndroid Build Coastguard Worker
9007*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> Int64
9008*1b3f573fSAndroid Build Coastguard Worker
9009*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringInt64Dictionary {
9010*1b3f573fSAndroid Build Coastguard Worker @package
9011*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9012*1b3f573fSAndroid Build Coastguard Worker}
9013*1b3f573fSAndroid Build Coastguard Worker
9014*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
9015*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
9016*1b3f573fSAndroid Build Coastguard Worker}
9017*1b3f573fSAndroid Build Coastguard Worker
9018*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
9019*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const NSString * [])keys
9020*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
9021*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
9022*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9023*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9024*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
9025*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9026*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
9027*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9028*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9029*1b3f573fSAndroid Build Coastguard Worker        }
9030*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9031*1b3f573fSAndroid Build Coastguard Worker      }
9032*1b3f573fSAndroid Build Coastguard Worker    }
9033*1b3f573fSAndroid Build Coastguard Worker  }
9034*1b3f573fSAndroid Build Coastguard Worker  return self;
9035*1b3f573fSAndroid Build Coastguard Worker}
9036*1b3f573fSAndroid Build Coastguard Worker
9037*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringInt64Dictionary *)dictionary {
9038*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
9039*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9040*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
9041*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9042*1b3f573fSAndroid Build Coastguard Worker    }
9043*1b3f573fSAndroid Build Coastguard Worker  }
9044*1b3f573fSAndroid Build Coastguard Worker  return self;
9045*1b3f573fSAndroid Build Coastguard Worker}
9046*1b3f573fSAndroid Build Coastguard Worker
9047*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9048*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
9049*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
9050*1b3f573fSAndroid Build Coastguard Worker}
9051*1b3f573fSAndroid Build Coastguard Worker
9052*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
9053*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9054*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9055*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
9056*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
9057*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
9058*1b3f573fSAndroid Build Coastguard Worker}
9059*1b3f573fSAndroid Build Coastguard Worker
9060*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9061*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringInt64Dictionary allocWithZone:zone] initWithDictionary:self];
9062*1b3f573fSAndroid Build Coastguard Worker}
9063*1b3f573fSAndroid Build Coastguard Worker
9064*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9065*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
9066*1b3f573fSAndroid Build Coastguard Worker    return YES;
9067*1b3f573fSAndroid Build Coastguard Worker  }
9068*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringInt64Dictionary class]]) {
9069*1b3f573fSAndroid Build Coastguard Worker    return NO;
9070*1b3f573fSAndroid Build Coastguard Worker  }
9071*1b3f573fSAndroid Build Coastguard Worker  GPBStringInt64Dictionary *otherDictionary = other;
9072*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9073*1b3f573fSAndroid Build Coastguard Worker}
9074*1b3f573fSAndroid Build Coastguard Worker
9075*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
9076*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9077*1b3f573fSAndroid Build Coastguard Worker}
9078*1b3f573fSAndroid Build Coastguard Worker
9079*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
9080*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9081*1b3f573fSAndroid Build Coastguard Worker}
9082*1b3f573fSAndroid Build Coastguard Worker
9083*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
9084*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9085*1b3f573fSAndroid Build Coastguard Worker}
9086*1b3f573fSAndroid Build Coastguard Worker
9087*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
9088*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int64_t value, BOOL *stop))block {
9089*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
9090*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9091*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9092*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9093*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9094*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9095*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue longLongValue], &stop);
9096*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
9097*1b3f573fSAndroid Build Coastguard Worker      break;
9098*1b3f573fSAndroid Build Coastguard Worker    }
9099*1b3f573fSAndroid Build Coastguard Worker  }
9100*1b3f573fSAndroid Build Coastguard Worker}
9101*1b3f573fSAndroid Build Coastguard Worker
9102*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9103*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9104*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9105*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
9106*1b3f573fSAndroid Build Coastguard Worker    return 0;
9107*1b3f573fSAndroid Build Coastguard Worker  }
9108*1b3f573fSAndroid Build Coastguard Worker
9109*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9110*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9111*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
9112*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9113*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9114*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9115*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9116*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9117*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
9118*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9119*1b3f573fSAndroid Build Coastguard Worker  }
9120*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9121*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
9122*1b3f573fSAndroid Build Coastguard Worker  return result;
9123*1b3f573fSAndroid Build Coastguard Worker}
9124*1b3f573fSAndroid Build Coastguard Worker
9125*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9126*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9127*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9128*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9129*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9130*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9131*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9132*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9133*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9134*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9135*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9136*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
9137*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9138*1b3f573fSAndroid Build Coastguard Worker    int64_t unwrappedValue = [aValue longLongValue];
9139*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9140*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9141*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9142*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
9143*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9144*1b3f573fSAndroid Build Coastguard Worker    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9145*1b3f573fSAndroid Build Coastguard Worker  }
9146*1b3f573fSAndroid Build Coastguard Worker}
9147*1b3f573fSAndroid Build Coastguard Worker
9148*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9149*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9150*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueInt64) forKey:key->valueString];
9151*1b3f573fSAndroid Build Coastguard Worker}
9152*1b3f573fSAndroid Build Coastguard Worker
9153*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9154*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndInt64sUsingBlock:^(NSString *key, int64_t value, BOOL *stop) {
9155*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
9156*1b3f573fSAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%lld", value]);
9157*1b3f573fSAndroid Build Coastguard Worker  }];
9158*1b3f573fSAndroid Build Coastguard Worker}
9159*1b3f573fSAndroid Build Coastguard Worker
9160*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(NSString *)key {
9161*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9162*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
9163*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped longLongValue];
9164*1b3f573fSAndroid Build Coastguard Worker  }
9165*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
9166*1b3f573fSAndroid Build Coastguard Worker}
9167*1b3f573fSAndroid Build Coastguard Worker
9168*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringInt64Dictionary *)otherDictionary {
9169*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
9170*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9171*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
9172*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9173*1b3f573fSAndroid Build Coastguard Worker    }
9174*1b3f573fSAndroid Build Coastguard Worker  }
9175*1b3f573fSAndroid Build Coastguard Worker}
9176*1b3f573fSAndroid Build Coastguard Worker
9177*1b3f573fSAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(NSString *)key {
9178*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
9179*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9180*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9181*1b3f573fSAndroid Build Coastguard Worker  }
9182*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9183*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
9184*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9185*1b3f573fSAndroid Build Coastguard Worker  }
9186*1b3f573fSAndroid Build Coastguard Worker}
9187*1b3f573fSAndroid Build Coastguard Worker
9188*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt64ForKey:(NSString *)aKey {
9189*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9190*1b3f573fSAndroid Build Coastguard Worker}
9191*1b3f573fSAndroid Build Coastguard Worker
9192*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
9193*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9194*1b3f573fSAndroid Build Coastguard Worker}
9195*1b3f573fSAndroid Build Coastguard Worker
9196*1b3f573fSAndroid Build Coastguard Worker@end
9197*1b3f573fSAndroid Build Coastguard Worker
9198*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> Bool
9199*1b3f573fSAndroid Build Coastguard Worker
9200*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringBoolDictionary {
9201*1b3f573fSAndroid Build Coastguard Worker @package
9202*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9203*1b3f573fSAndroid Build Coastguard Worker}
9204*1b3f573fSAndroid Build Coastguard Worker
9205*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
9206*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
9207*1b3f573fSAndroid Build Coastguard Worker}
9208*1b3f573fSAndroid Build Coastguard Worker
9209*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
9210*1b3f573fSAndroid Build Coastguard Worker                      forKeys:(const NSString * [])keys
9211*1b3f573fSAndroid Build Coastguard Worker                        count:(NSUInteger)count {
9212*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
9213*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9214*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9215*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
9216*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9217*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
9218*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9219*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9220*1b3f573fSAndroid Build Coastguard Worker        }
9221*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9222*1b3f573fSAndroid Build Coastguard Worker      }
9223*1b3f573fSAndroid Build Coastguard Worker    }
9224*1b3f573fSAndroid Build Coastguard Worker  }
9225*1b3f573fSAndroid Build Coastguard Worker  return self;
9226*1b3f573fSAndroid Build Coastguard Worker}
9227*1b3f573fSAndroid Build Coastguard Worker
9228*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringBoolDictionary *)dictionary {
9229*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
9230*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9231*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
9232*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9233*1b3f573fSAndroid Build Coastguard Worker    }
9234*1b3f573fSAndroid Build Coastguard Worker  }
9235*1b3f573fSAndroid Build Coastguard Worker  return self;
9236*1b3f573fSAndroid Build Coastguard Worker}
9237*1b3f573fSAndroid Build Coastguard Worker
9238*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9239*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
9240*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
9241*1b3f573fSAndroid Build Coastguard Worker}
9242*1b3f573fSAndroid Build Coastguard Worker
9243*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
9244*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9245*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9246*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
9247*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
9248*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
9249*1b3f573fSAndroid Build Coastguard Worker}
9250*1b3f573fSAndroid Build Coastguard Worker
9251*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9252*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringBoolDictionary allocWithZone:zone] initWithDictionary:self];
9253*1b3f573fSAndroid Build Coastguard Worker}
9254*1b3f573fSAndroid Build Coastguard Worker
9255*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9256*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
9257*1b3f573fSAndroid Build Coastguard Worker    return YES;
9258*1b3f573fSAndroid Build Coastguard Worker  }
9259*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringBoolDictionary class]]) {
9260*1b3f573fSAndroid Build Coastguard Worker    return NO;
9261*1b3f573fSAndroid Build Coastguard Worker  }
9262*1b3f573fSAndroid Build Coastguard Worker  GPBStringBoolDictionary *otherDictionary = other;
9263*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9264*1b3f573fSAndroid Build Coastguard Worker}
9265*1b3f573fSAndroid Build Coastguard Worker
9266*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
9267*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9268*1b3f573fSAndroid Build Coastguard Worker}
9269*1b3f573fSAndroid Build Coastguard Worker
9270*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
9271*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9272*1b3f573fSAndroid Build Coastguard Worker}
9273*1b3f573fSAndroid Build Coastguard Worker
9274*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
9275*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9276*1b3f573fSAndroid Build Coastguard Worker}
9277*1b3f573fSAndroid Build Coastguard Worker
9278*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
9279*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, BOOL value, BOOL *stop))block {
9280*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
9281*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9282*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9283*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9284*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9285*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9286*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue boolValue], &stop);
9287*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
9288*1b3f573fSAndroid Build Coastguard Worker      break;
9289*1b3f573fSAndroid Build Coastguard Worker    }
9290*1b3f573fSAndroid Build Coastguard Worker  }
9291*1b3f573fSAndroid Build Coastguard Worker}
9292*1b3f573fSAndroid Build Coastguard Worker
9293*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9294*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9295*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9296*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
9297*1b3f573fSAndroid Build Coastguard Worker    return 0;
9298*1b3f573fSAndroid Build Coastguard Worker  }
9299*1b3f573fSAndroid Build Coastguard Worker
9300*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9301*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9302*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
9303*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9304*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9305*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9306*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9307*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9308*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
9309*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9310*1b3f573fSAndroid Build Coastguard Worker  }
9311*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9312*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
9313*1b3f573fSAndroid Build Coastguard Worker  return result;
9314*1b3f573fSAndroid Build Coastguard Worker}
9315*1b3f573fSAndroid Build Coastguard Worker
9316*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9317*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9318*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9319*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9320*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9321*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9322*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9323*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9324*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9325*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9326*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9327*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
9328*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9329*1b3f573fSAndroid Build Coastguard Worker    BOOL unwrappedValue = [aValue boolValue];
9330*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9331*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9332*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9333*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
9334*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9335*1b3f573fSAndroid Build Coastguard Worker    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9336*1b3f573fSAndroid Build Coastguard Worker  }
9337*1b3f573fSAndroid Build Coastguard Worker}
9338*1b3f573fSAndroid Build Coastguard Worker
9339*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9340*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9341*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueBool) forKey:key->valueString];
9342*1b3f573fSAndroid Build Coastguard Worker}
9343*1b3f573fSAndroid Build Coastguard Worker
9344*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9345*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndBoolsUsingBlock:^(NSString *key, BOOL value, BOOL *stop) {
9346*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
9347*1b3f573fSAndroid Build Coastguard Worker      block(key, (value ? @"true" : @"false"));
9348*1b3f573fSAndroid Build Coastguard Worker  }];
9349*1b3f573fSAndroid Build Coastguard Worker}
9350*1b3f573fSAndroid Build Coastguard Worker
9351*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(NSString *)key {
9352*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9353*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
9354*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped boolValue];
9355*1b3f573fSAndroid Build Coastguard Worker  }
9356*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
9357*1b3f573fSAndroid Build Coastguard Worker}
9358*1b3f573fSAndroid Build Coastguard Worker
9359*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringBoolDictionary *)otherDictionary {
9360*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
9361*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9362*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
9363*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9364*1b3f573fSAndroid Build Coastguard Worker    }
9365*1b3f573fSAndroid Build Coastguard Worker  }
9366*1b3f573fSAndroid Build Coastguard Worker}
9367*1b3f573fSAndroid Build Coastguard Worker
9368*1b3f573fSAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(NSString *)key {
9369*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
9370*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9371*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9372*1b3f573fSAndroid Build Coastguard Worker  }
9373*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9374*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
9375*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9376*1b3f573fSAndroid Build Coastguard Worker  }
9377*1b3f573fSAndroid Build Coastguard Worker}
9378*1b3f573fSAndroid Build Coastguard Worker
9379*1b3f573fSAndroid Build Coastguard Worker- (void)removeBoolForKey:(NSString *)aKey {
9380*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9381*1b3f573fSAndroid Build Coastguard Worker}
9382*1b3f573fSAndroid Build Coastguard Worker
9383*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
9384*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9385*1b3f573fSAndroid Build Coastguard Worker}
9386*1b3f573fSAndroid Build Coastguard Worker
9387*1b3f573fSAndroid Build Coastguard Worker@end
9388*1b3f573fSAndroid Build Coastguard Worker
9389*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> Float
9390*1b3f573fSAndroid Build Coastguard Worker
9391*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringFloatDictionary {
9392*1b3f573fSAndroid Build Coastguard Worker @package
9393*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9394*1b3f573fSAndroid Build Coastguard Worker}
9395*1b3f573fSAndroid Build Coastguard Worker
9396*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
9397*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
9398*1b3f573fSAndroid Build Coastguard Worker}
9399*1b3f573fSAndroid Build Coastguard Worker
9400*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
9401*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const NSString * [])keys
9402*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
9403*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
9404*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9405*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9406*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
9407*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9408*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
9409*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9410*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9411*1b3f573fSAndroid Build Coastguard Worker        }
9412*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9413*1b3f573fSAndroid Build Coastguard Worker      }
9414*1b3f573fSAndroid Build Coastguard Worker    }
9415*1b3f573fSAndroid Build Coastguard Worker  }
9416*1b3f573fSAndroid Build Coastguard Worker  return self;
9417*1b3f573fSAndroid Build Coastguard Worker}
9418*1b3f573fSAndroid Build Coastguard Worker
9419*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringFloatDictionary *)dictionary {
9420*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
9421*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9422*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
9423*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9424*1b3f573fSAndroid Build Coastguard Worker    }
9425*1b3f573fSAndroid Build Coastguard Worker  }
9426*1b3f573fSAndroid Build Coastguard Worker  return self;
9427*1b3f573fSAndroid Build Coastguard Worker}
9428*1b3f573fSAndroid Build Coastguard Worker
9429*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9430*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
9431*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
9432*1b3f573fSAndroid Build Coastguard Worker}
9433*1b3f573fSAndroid Build Coastguard Worker
9434*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
9435*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9436*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9437*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
9438*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
9439*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
9440*1b3f573fSAndroid Build Coastguard Worker}
9441*1b3f573fSAndroid Build Coastguard Worker
9442*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9443*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringFloatDictionary allocWithZone:zone] initWithDictionary:self];
9444*1b3f573fSAndroid Build Coastguard Worker}
9445*1b3f573fSAndroid Build Coastguard Worker
9446*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9447*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
9448*1b3f573fSAndroid Build Coastguard Worker    return YES;
9449*1b3f573fSAndroid Build Coastguard Worker  }
9450*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringFloatDictionary class]]) {
9451*1b3f573fSAndroid Build Coastguard Worker    return NO;
9452*1b3f573fSAndroid Build Coastguard Worker  }
9453*1b3f573fSAndroid Build Coastguard Worker  GPBStringFloatDictionary *otherDictionary = other;
9454*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9455*1b3f573fSAndroid Build Coastguard Worker}
9456*1b3f573fSAndroid Build Coastguard Worker
9457*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
9458*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9459*1b3f573fSAndroid Build Coastguard Worker}
9460*1b3f573fSAndroid Build Coastguard Worker
9461*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
9462*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9463*1b3f573fSAndroid Build Coastguard Worker}
9464*1b3f573fSAndroid Build Coastguard Worker
9465*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
9466*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9467*1b3f573fSAndroid Build Coastguard Worker}
9468*1b3f573fSAndroid Build Coastguard Worker
9469*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
9470*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, float value, BOOL *stop))block {
9471*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
9472*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9473*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9474*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9475*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9476*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9477*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue floatValue], &stop);
9478*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
9479*1b3f573fSAndroid Build Coastguard Worker      break;
9480*1b3f573fSAndroid Build Coastguard Worker    }
9481*1b3f573fSAndroid Build Coastguard Worker  }
9482*1b3f573fSAndroid Build Coastguard Worker}
9483*1b3f573fSAndroid Build Coastguard Worker
9484*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9485*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9486*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9487*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
9488*1b3f573fSAndroid Build Coastguard Worker    return 0;
9489*1b3f573fSAndroid Build Coastguard Worker  }
9490*1b3f573fSAndroid Build Coastguard Worker
9491*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9492*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9493*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
9494*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9495*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9496*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9497*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9498*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9499*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
9500*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9501*1b3f573fSAndroid Build Coastguard Worker  }
9502*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9503*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
9504*1b3f573fSAndroid Build Coastguard Worker  return result;
9505*1b3f573fSAndroid Build Coastguard Worker}
9506*1b3f573fSAndroid Build Coastguard Worker
9507*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9508*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9509*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9510*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9511*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9512*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9513*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9514*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9515*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9516*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9517*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9518*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
9519*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9520*1b3f573fSAndroid Build Coastguard Worker    float unwrappedValue = [aValue floatValue];
9521*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9522*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9523*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9524*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
9525*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9526*1b3f573fSAndroid Build Coastguard Worker    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9527*1b3f573fSAndroid Build Coastguard Worker  }
9528*1b3f573fSAndroid Build Coastguard Worker}
9529*1b3f573fSAndroid Build Coastguard Worker
9530*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9531*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9532*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueFloat) forKey:key->valueString];
9533*1b3f573fSAndroid Build Coastguard Worker}
9534*1b3f573fSAndroid Build Coastguard Worker
9535*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9536*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndFloatsUsingBlock:^(NSString *key, float value, BOOL *stop) {
9537*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
9538*1b3f573fSAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
9539*1b3f573fSAndroid Build Coastguard Worker  }];
9540*1b3f573fSAndroid Build Coastguard Worker}
9541*1b3f573fSAndroid Build Coastguard Worker
9542*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(NSString *)key {
9543*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9544*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
9545*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped floatValue];
9546*1b3f573fSAndroid Build Coastguard Worker  }
9547*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
9548*1b3f573fSAndroid Build Coastguard Worker}
9549*1b3f573fSAndroid Build Coastguard Worker
9550*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringFloatDictionary *)otherDictionary {
9551*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
9552*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9553*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
9554*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9555*1b3f573fSAndroid Build Coastguard Worker    }
9556*1b3f573fSAndroid Build Coastguard Worker  }
9557*1b3f573fSAndroid Build Coastguard Worker}
9558*1b3f573fSAndroid Build Coastguard Worker
9559*1b3f573fSAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(NSString *)key {
9560*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
9561*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9562*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9563*1b3f573fSAndroid Build Coastguard Worker  }
9564*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9565*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
9566*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9567*1b3f573fSAndroid Build Coastguard Worker  }
9568*1b3f573fSAndroid Build Coastguard Worker}
9569*1b3f573fSAndroid Build Coastguard Worker
9570*1b3f573fSAndroid Build Coastguard Worker- (void)removeFloatForKey:(NSString *)aKey {
9571*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9572*1b3f573fSAndroid Build Coastguard Worker}
9573*1b3f573fSAndroid Build Coastguard Worker
9574*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
9575*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9576*1b3f573fSAndroid Build Coastguard Worker}
9577*1b3f573fSAndroid Build Coastguard Worker
9578*1b3f573fSAndroid Build Coastguard Worker@end
9579*1b3f573fSAndroid Build Coastguard Worker
9580*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> Double
9581*1b3f573fSAndroid Build Coastguard Worker
9582*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringDoubleDictionary {
9583*1b3f573fSAndroid Build Coastguard Worker @package
9584*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9585*1b3f573fSAndroid Build Coastguard Worker}
9586*1b3f573fSAndroid Build Coastguard Worker
9587*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
9588*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
9589*1b3f573fSAndroid Build Coastguard Worker}
9590*1b3f573fSAndroid Build Coastguard Worker
9591*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
9592*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const NSString * [])keys
9593*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
9594*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
9595*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9596*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9597*1b3f573fSAndroid Build Coastguard Worker    if (count && values && keys) {
9598*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9599*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
9600*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9601*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9602*1b3f573fSAndroid Build Coastguard Worker        }
9603*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(values[i]) forKey:keys[i]];
9604*1b3f573fSAndroid Build Coastguard Worker      }
9605*1b3f573fSAndroid Build Coastguard Worker    }
9606*1b3f573fSAndroid Build Coastguard Worker  }
9607*1b3f573fSAndroid Build Coastguard Worker  return self;
9608*1b3f573fSAndroid Build Coastguard Worker}
9609*1b3f573fSAndroid Build Coastguard Worker
9610*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringDoubleDictionary *)dictionary {
9611*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
9612*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9613*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
9614*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9615*1b3f573fSAndroid Build Coastguard Worker    }
9616*1b3f573fSAndroid Build Coastguard Worker  }
9617*1b3f573fSAndroid Build Coastguard Worker  return self;
9618*1b3f573fSAndroid Build Coastguard Worker}
9619*1b3f573fSAndroid Build Coastguard Worker
9620*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
9621*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
9622*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
9623*1b3f573fSAndroid Build Coastguard Worker}
9624*1b3f573fSAndroid Build Coastguard Worker
9625*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
9626*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9627*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9628*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
9629*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
9630*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
9631*1b3f573fSAndroid Build Coastguard Worker}
9632*1b3f573fSAndroid Build Coastguard Worker
9633*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9634*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringDoubleDictionary allocWithZone:zone] initWithDictionary:self];
9635*1b3f573fSAndroid Build Coastguard Worker}
9636*1b3f573fSAndroid Build Coastguard Worker
9637*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9638*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
9639*1b3f573fSAndroid Build Coastguard Worker    return YES;
9640*1b3f573fSAndroid Build Coastguard Worker  }
9641*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringDoubleDictionary class]]) {
9642*1b3f573fSAndroid Build Coastguard Worker    return NO;
9643*1b3f573fSAndroid Build Coastguard Worker  }
9644*1b3f573fSAndroid Build Coastguard Worker  GPBStringDoubleDictionary *otherDictionary = other;
9645*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9646*1b3f573fSAndroid Build Coastguard Worker}
9647*1b3f573fSAndroid Build Coastguard Worker
9648*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
9649*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9650*1b3f573fSAndroid Build Coastguard Worker}
9651*1b3f573fSAndroid Build Coastguard Worker
9652*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
9653*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9654*1b3f573fSAndroid Build Coastguard Worker}
9655*1b3f573fSAndroid Build Coastguard Worker
9656*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
9657*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9658*1b3f573fSAndroid Build Coastguard Worker}
9659*1b3f573fSAndroid Build Coastguard Worker
9660*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
9661*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, double value, BOOL *stop))block {
9662*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
9663*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9664*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9665*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9666*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9667*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9668*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue doubleValue], &stop);
9669*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
9670*1b3f573fSAndroid Build Coastguard Worker      break;
9671*1b3f573fSAndroid Build Coastguard Worker    }
9672*1b3f573fSAndroid Build Coastguard Worker  }
9673*1b3f573fSAndroid Build Coastguard Worker}
9674*1b3f573fSAndroid Build Coastguard Worker
9675*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9676*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9677*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9678*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
9679*1b3f573fSAndroid Build Coastguard Worker    return 0;
9680*1b3f573fSAndroid Build Coastguard Worker  }
9681*1b3f573fSAndroid Build Coastguard Worker
9682*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9683*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9684*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
9685*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9686*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9687*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9688*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9689*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9690*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
9691*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9692*1b3f573fSAndroid Build Coastguard Worker  }
9693*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9694*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
9695*1b3f573fSAndroid Build Coastguard Worker  return result;
9696*1b3f573fSAndroid Build Coastguard Worker}
9697*1b3f573fSAndroid Build Coastguard Worker
9698*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9699*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9700*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9701*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9702*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9703*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9704*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9705*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9706*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9707*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9708*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9709*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
9710*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9711*1b3f573fSAndroid Build Coastguard Worker    double unwrappedValue = [aValue doubleValue];
9712*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9713*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9714*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9715*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
9716*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9717*1b3f573fSAndroid Build Coastguard Worker    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9718*1b3f573fSAndroid Build Coastguard Worker  }
9719*1b3f573fSAndroid Build Coastguard Worker}
9720*1b3f573fSAndroid Build Coastguard Worker
9721*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9722*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9723*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueDouble) forKey:key->valueString];
9724*1b3f573fSAndroid Build Coastguard Worker}
9725*1b3f573fSAndroid Build Coastguard Worker
9726*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9727*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndDoublesUsingBlock:^(NSString *key, double value, BOOL *stop) {
9728*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
9729*1b3f573fSAndroid Build Coastguard Worker      block(key, [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
9730*1b3f573fSAndroid Build Coastguard Worker  }];
9731*1b3f573fSAndroid Build Coastguard Worker}
9732*1b3f573fSAndroid Build Coastguard Worker
9733*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(NSString *)key {
9734*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9735*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
9736*1b3f573fSAndroid Build Coastguard Worker    *value = [wrapped doubleValue];
9737*1b3f573fSAndroid Build Coastguard Worker  }
9738*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
9739*1b3f573fSAndroid Build Coastguard Worker}
9740*1b3f573fSAndroid Build Coastguard Worker
9741*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringDoubleDictionary *)otherDictionary {
9742*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
9743*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9744*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
9745*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9746*1b3f573fSAndroid Build Coastguard Worker    }
9747*1b3f573fSAndroid Build Coastguard Worker  }
9748*1b3f573fSAndroid Build Coastguard Worker}
9749*1b3f573fSAndroid Build Coastguard Worker
9750*1b3f573fSAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(NSString *)key {
9751*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
9752*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
9753*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
9754*1b3f573fSAndroid Build Coastguard Worker  }
9755*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
9756*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
9757*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
9758*1b3f573fSAndroid Build Coastguard Worker  }
9759*1b3f573fSAndroid Build Coastguard Worker}
9760*1b3f573fSAndroid Build Coastguard Worker
9761*1b3f573fSAndroid Build Coastguard Worker- (void)removeDoubleForKey:(NSString *)aKey {
9762*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
9763*1b3f573fSAndroid Build Coastguard Worker}
9764*1b3f573fSAndroid Build Coastguard Worker
9765*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
9766*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
9767*1b3f573fSAndroid Build Coastguard Worker}
9768*1b3f573fSAndroid Build Coastguard Worker
9769*1b3f573fSAndroid Build Coastguard Worker@end
9770*1b3f573fSAndroid Build Coastguard Worker
9771*1b3f573fSAndroid Build Coastguard Worker#pragma mark - String -> Enum
9772*1b3f573fSAndroid Build Coastguard Worker
9773*1b3f573fSAndroid Build Coastguard Worker@implementation GPBStringEnumDictionary {
9774*1b3f573fSAndroid Build Coastguard Worker @package
9775*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
9776*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
9777*1b3f573fSAndroid Build Coastguard Worker}
9778*1b3f573fSAndroid Build Coastguard Worker
9779*1b3f573fSAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
9780*1b3f573fSAndroid Build Coastguard Worker
9781*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
9782*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
9783*1b3f573fSAndroid Build Coastguard Worker}
9784*1b3f573fSAndroid Build Coastguard Worker
9785*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
9786*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
9787*1b3f573fSAndroid Build Coastguard Worker}
9788*1b3f573fSAndroid Build Coastguard Worker
9789*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
9790*1b3f573fSAndroid Build Coastguard Worker                                 rawValues:(const int32_t [])rawValues
9791*1b3f573fSAndroid Build Coastguard Worker                                   forKeys:(const NSString * [])keys
9792*1b3f573fSAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
9793*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
9794*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9795*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
9796*1b3f573fSAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
9797*1b3f573fSAndroid Build Coastguard Worker    if (count && rawValues && keys) {
9798*1b3f573fSAndroid Build Coastguard Worker      for (NSUInteger i = 0; i < count; ++i) {
9799*1b3f573fSAndroid Build Coastguard Worker        if (!keys[i]) {
9800*1b3f573fSAndroid Build Coastguard Worker          [NSException raise:NSInvalidArgumentException
9801*1b3f573fSAndroid Build Coastguard Worker                      format:@"Attempting to add nil key to a Dictionary"];
9802*1b3f573fSAndroid Build Coastguard Worker        }
9803*1b3f573fSAndroid Build Coastguard Worker        [_dictionary setObject:@(rawValues[i]) forKey:keys[i]];
9804*1b3f573fSAndroid Build Coastguard Worker      }
9805*1b3f573fSAndroid Build Coastguard Worker    }
9806*1b3f573fSAndroid Build Coastguard Worker  }
9807*1b3f573fSAndroid Build Coastguard Worker  return self;
9808*1b3f573fSAndroid Build Coastguard Worker}
9809*1b3f573fSAndroid Build Coastguard Worker
9810*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringEnumDictionary *)dictionary {
9811*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
9812*1b3f573fSAndroid Build Coastguard Worker                                rawValues:NULL
9813*1b3f573fSAndroid Build Coastguard Worker                                  forKeys:NULL
9814*1b3f573fSAndroid Build Coastguard Worker                                    count:0];
9815*1b3f573fSAndroid Build Coastguard Worker  if (self) {
9816*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
9817*1b3f573fSAndroid Build Coastguard Worker      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9818*1b3f573fSAndroid Build Coastguard Worker    }
9819*1b3f573fSAndroid Build Coastguard Worker  }
9820*1b3f573fSAndroid Build Coastguard Worker  return self;
9821*1b3f573fSAndroid Build Coastguard Worker}
9822*1b3f573fSAndroid Build Coastguard Worker
9823*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
9824*1b3f573fSAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
9825*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
9826*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
9827*1b3f573fSAndroid Build Coastguard Worker}
9828*1b3f573fSAndroid Build Coastguard Worker
9829*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
9830*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
9831*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
9832*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
9833*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
9834*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
9835*1b3f573fSAndroid Build Coastguard Worker}
9836*1b3f573fSAndroid Build Coastguard Worker
9837*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
9838*1b3f573fSAndroid Build Coastguard Worker  return [[GPBStringEnumDictionary allocWithZone:zone] initWithDictionary:self];
9839*1b3f573fSAndroid Build Coastguard Worker}
9840*1b3f573fSAndroid Build Coastguard Worker
9841*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
9842*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
9843*1b3f573fSAndroid Build Coastguard Worker    return YES;
9844*1b3f573fSAndroid Build Coastguard Worker  }
9845*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBStringEnumDictionary class]]) {
9846*1b3f573fSAndroid Build Coastguard Worker    return NO;
9847*1b3f573fSAndroid Build Coastguard Worker  }
9848*1b3f573fSAndroid Build Coastguard Worker  GPBStringEnumDictionary *otherDictionary = other;
9849*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary isEqual:otherDictionary->_dictionary];
9850*1b3f573fSAndroid Build Coastguard Worker}
9851*1b3f573fSAndroid Build Coastguard Worker
9852*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
9853*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9854*1b3f573fSAndroid Build Coastguard Worker}
9855*1b3f573fSAndroid Build Coastguard Worker
9856*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
9857*1b3f573fSAndroid Build Coastguard Worker  return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary];
9858*1b3f573fSAndroid Build Coastguard Worker}
9859*1b3f573fSAndroid Build Coastguard Worker
9860*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
9861*1b3f573fSAndroid Build Coastguard Worker  return _dictionary.count;
9862*1b3f573fSAndroid Build Coastguard Worker}
9863*1b3f573fSAndroid Build Coastguard Worker
9864*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
9865*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block {
9866*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
9867*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9868*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9869*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9870*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9871*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9872*1b3f573fSAndroid Build Coastguard Worker    block(aKey, [aValue intValue], &stop);
9873*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
9874*1b3f573fSAndroid Build Coastguard Worker      break;
9875*1b3f573fSAndroid Build Coastguard Worker    }
9876*1b3f573fSAndroid Build Coastguard Worker  }
9877*1b3f573fSAndroid Build Coastguard Worker}
9878*1b3f573fSAndroid Build Coastguard Worker
9879*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9880*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9881*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = internal.count;
9882*1b3f573fSAndroid Build Coastguard Worker  if (count == 0) {
9883*1b3f573fSAndroid Build Coastguard Worker    return 0;
9884*1b3f573fSAndroid Build Coastguard Worker  }
9885*1b3f573fSAndroid Build Coastguard Worker
9886*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9887*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9888*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
9889*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9890*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9891*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9892*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9893*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
9894*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
9895*1b3f573fSAndroid Build Coastguard Worker    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9896*1b3f573fSAndroid Build Coastguard Worker  }
9897*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
9898*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
9899*1b3f573fSAndroid Build Coastguard Worker  return result;
9900*1b3f573fSAndroid Build Coastguard Worker}
9901*1b3f573fSAndroid Build Coastguard Worker
9902*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9903*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
9904*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
9905*1b3f573fSAndroid Build Coastguard Worker  GPBDataType keyDataType = field.mapKeyDataType;
9906*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
9907*1b3f573fSAndroid Build Coastguard Worker  NSDictionary *internal = _dictionary;
9908*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [internal keyEnumerator];
9909*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9910*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9911*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = internal[aKey];
9912*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:tag];
9913*1b3f573fSAndroid Build Coastguard Worker    // Write the size of the message.
9914*1b3f573fSAndroid Build Coastguard Worker    NSString *unwrappedKey = aKey;
9915*1b3f573fSAndroid Build Coastguard Worker    int32_t unwrappedValue = [aValue intValue];
9916*1b3f573fSAndroid Build Coastguard Worker    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
9917*1b3f573fSAndroid Build Coastguard Worker    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
9918*1b3f573fSAndroid Build Coastguard Worker    [outputStream writeInt32NoTag:(int32_t)msgSize];
9919*1b3f573fSAndroid Build Coastguard Worker    // Write the fields.
9920*1b3f573fSAndroid Build Coastguard Worker    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
9921*1b3f573fSAndroid Build Coastguard Worker    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
9922*1b3f573fSAndroid Build Coastguard Worker  }
9923*1b3f573fSAndroid Build Coastguard Worker}
9924*1b3f573fSAndroid Build Coastguard Worker
9925*1b3f573fSAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
9926*1b3f573fSAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
9927*1b3f573fSAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
9928*1b3f573fSAndroid Build Coastguard Worker  size_t msgSize = ComputeDictStringFieldSize(key->valueString, kMapKeyFieldNumber, keyDataType);
9929*1b3f573fSAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
9930*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
9931*1b3f573fSAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
9932*1b3f573fSAndroid Build Coastguard Worker  WriteDictStringField(outputStream, key->valueString, kMapKeyFieldNumber, keyDataType);
9933*1b3f573fSAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
9934*1b3f573fSAndroid Build Coastguard Worker  [outputStream release];
9935*1b3f573fSAndroid Build Coastguard Worker  return data;
9936*1b3f573fSAndroid Build Coastguard Worker}
9937*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
9938*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
9939*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value->valueEnum) forKey:key->valueString];
9940*1b3f573fSAndroid Build Coastguard Worker}
9941*1b3f573fSAndroid Build Coastguard Worker
9942*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
9943*1b3f573fSAndroid Build Coastguard Worker  [self enumerateKeysAndRawValuesUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
9944*1b3f573fSAndroid Build Coastguard Worker      #pragma unused(stop)
9945*1b3f573fSAndroid Build Coastguard Worker      block(key, @(value));
9946*1b3f573fSAndroid Build Coastguard Worker  }];
9947*1b3f573fSAndroid Build Coastguard Worker}
9948*1b3f573fSAndroid Build Coastguard Worker
9949*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(NSString *)key {
9950*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9951*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && value) {
9952*1b3f573fSAndroid Build Coastguard Worker    int32_t result = [wrapped intValue];
9953*1b3f573fSAndroid Build Coastguard Worker    if (!_validationFunc(result)) {
9954*1b3f573fSAndroid Build Coastguard Worker      result = kGPBUnrecognizedEnumeratorValue;
9955*1b3f573fSAndroid Build Coastguard Worker    }
9956*1b3f573fSAndroid Build Coastguard Worker    *value = result;
9957*1b3f573fSAndroid Build Coastguard Worker  }
9958*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
9959*1b3f573fSAndroid Build Coastguard Worker}
9960*1b3f573fSAndroid Build Coastguard Worker
9961*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(NSString *)key {
9962*1b3f573fSAndroid Build Coastguard Worker  NSNumber *wrapped = [_dictionary objectForKey:key];
9963*1b3f573fSAndroid Build Coastguard Worker  if (wrapped && rawValue) {
9964*1b3f573fSAndroid Build Coastguard Worker    *rawValue = [wrapped intValue];
9965*1b3f573fSAndroid Build Coastguard Worker  }
9966*1b3f573fSAndroid Build Coastguard Worker  return (wrapped != NULL);
9967*1b3f573fSAndroid Build Coastguard Worker}
9968*1b3f573fSAndroid Build Coastguard Worker
9969*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
9970*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block {
9971*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
9972*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
9973*1b3f573fSAndroid Build Coastguard Worker  NSEnumerator *keys = [_dictionary keyEnumerator];
9974*1b3f573fSAndroid Build Coastguard Worker  NSString *aKey;
9975*1b3f573fSAndroid Build Coastguard Worker  while ((aKey = [keys nextObject])) {
9976*1b3f573fSAndroid Build Coastguard Worker    NSNumber *aValue = _dictionary[aKey];
9977*1b3f573fSAndroid Build Coastguard Worker      int32_t unwrapped = [aValue intValue];
9978*1b3f573fSAndroid Build Coastguard Worker      if (!func(unwrapped)) {
9979*1b3f573fSAndroid Build Coastguard Worker        unwrapped = kGPBUnrecognizedEnumeratorValue;
9980*1b3f573fSAndroid Build Coastguard Worker      }
9981*1b3f573fSAndroid Build Coastguard Worker    block(aKey, unwrapped, &stop);
9982*1b3f573fSAndroid Build Coastguard Worker    if (stop) {
9983*1b3f573fSAndroid Build Coastguard Worker      break;
9984*1b3f573fSAndroid Build Coastguard Worker    }
9985*1b3f573fSAndroid Build Coastguard Worker  }
9986*1b3f573fSAndroid Build Coastguard Worker}
9987*1b3f573fSAndroid Build Coastguard Worker
9988*1b3f573fSAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBStringEnumDictionary *)otherDictionary {
9989*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
9990*1b3f573fSAndroid Build Coastguard Worker    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9991*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
9992*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
9993*1b3f573fSAndroid Build Coastguard Worker    }
9994*1b3f573fSAndroid Build Coastguard Worker  }
9995*1b3f573fSAndroid Build Coastguard Worker}
9996*1b3f573fSAndroid Build Coastguard Worker
9997*1b3f573fSAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(NSString *)key {
9998*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
9999*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
10000*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
10001*1b3f573fSAndroid Build Coastguard Worker  }
10002*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
10003*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
10004*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10005*1b3f573fSAndroid Build Coastguard Worker  }
10006*1b3f573fSAndroid Build Coastguard Worker}
10007*1b3f573fSAndroid Build Coastguard Worker
10008*1b3f573fSAndroid Build Coastguard Worker- (void)removeEnumForKey:(NSString *)aKey {
10009*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
10010*1b3f573fSAndroid Build Coastguard Worker}
10011*1b3f573fSAndroid Build Coastguard Worker
10012*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
10013*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeAllObjects];
10014*1b3f573fSAndroid Build Coastguard Worker}
10015*1b3f573fSAndroid Build Coastguard Worker
10016*1b3f573fSAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(NSString *)key {
10017*1b3f573fSAndroid Build Coastguard Worker  if (!key) {
10018*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
10019*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil key to a Dictionary"];
10020*1b3f573fSAndroid Build Coastguard Worker  }
10021*1b3f573fSAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
10022*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
10023*1b3f573fSAndroid Build Coastguard Worker                format:@"GPBStringEnumDictionary: Attempt to set an unknown enum value (%d)",
10024*1b3f573fSAndroid Build Coastguard Worker                       value];
10025*1b3f573fSAndroid Build Coastguard Worker  }
10026*1b3f573fSAndroid Build Coastguard Worker
10027*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:@(value) forKey:key];
10028*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
10029*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10030*1b3f573fSAndroid Build Coastguard Worker  }
10031*1b3f573fSAndroid Build Coastguard Worker}
10032*1b3f573fSAndroid Build Coastguard Worker
10033*1b3f573fSAndroid Build Coastguard Worker@end
10034*1b3f573fSAndroid Build Coastguard Worker
10035*1b3f573fSAndroid Build Coastguard Worker// clang-format on
10036*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (5 expansions)
10037*1b3f573fSAndroid Build Coastguard Worker
10038*1b3f573fSAndroid Build Coastguard Worker
10039*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt32, uint32_t)
10040*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10041*1b3f573fSAndroid Build Coastguard Worker// clang-format off
10042*1b3f573fSAndroid Build Coastguard Worker
10043*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> UInt32
10044*1b3f573fSAndroid Build Coastguard Worker
10045*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolUInt32Dictionary {
10046*1b3f573fSAndroid Build Coastguard Worker @package
10047*1b3f573fSAndroid Build Coastguard Worker  uint32_t _values[2];
10048*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
10049*1b3f573fSAndroid Build Coastguard Worker}
10050*1b3f573fSAndroid Build Coastguard Worker
10051*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
10052*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
10053*1b3f573fSAndroid Build Coastguard Worker}
10054*1b3f573fSAndroid Build Coastguard Worker
10055*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values
10056*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
10057*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
10058*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
10059*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10060*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10061*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10062*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = values[i];
10063*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10064*1b3f573fSAndroid Build Coastguard Worker    }
10065*1b3f573fSAndroid Build Coastguard Worker  }
10066*1b3f573fSAndroid Build Coastguard Worker  return self;
10067*1b3f573fSAndroid Build Coastguard Worker}
10068*1b3f573fSAndroid Build Coastguard Worker
10069*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolUInt32Dictionary *)dictionary {
10070*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
10071*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10072*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
10073*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10074*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10075*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10076*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
10077*1b3f573fSAndroid Build Coastguard Worker        }
10078*1b3f573fSAndroid Build Coastguard Worker      }
10079*1b3f573fSAndroid Build Coastguard Worker    }
10080*1b3f573fSAndroid Build Coastguard Worker  }
10081*1b3f573fSAndroid Build Coastguard Worker  return self;
10082*1b3f573fSAndroid Build Coastguard Worker}
10083*1b3f573fSAndroid Build Coastguard Worker
10084*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10085*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
10086*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt32s:NULL forKeys:NULL count:0];
10087*1b3f573fSAndroid Build Coastguard Worker}
10088*1b3f573fSAndroid Build Coastguard Worker
10089*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10090*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
10091*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10092*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10093*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
10094*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
10095*1b3f573fSAndroid Build Coastguard Worker}
10096*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10097*1b3f573fSAndroid Build Coastguard Worker
10098*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10099*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolUInt32Dictionary allocWithZone:zone] initWithDictionary:self];
10100*1b3f573fSAndroid Build Coastguard Worker}
10101*1b3f573fSAndroid Build Coastguard Worker
10102*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10103*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
10104*1b3f573fSAndroid Build Coastguard Worker    return YES;
10105*1b3f573fSAndroid Build Coastguard Worker  }
10106*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolUInt32Dictionary class]]) {
10107*1b3f573fSAndroid Build Coastguard Worker    return NO;
10108*1b3f573fSAndroid Build Coastguard Worker  }
10109*1b3f573fSAndroid Build Coastguard Worker  GPBBoolUInt32Dictionary *otherDictionary = other;
10110*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10111*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10112*1b3f573fSAndroid Build Coastguard Worker    return NO;
10113*1b3f573fSAndroid Build Coastguard Worker  }
10114*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10115*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10116*1b3f573fSAndroid Build Coastguard Worker    return NO;
10117*1b3f573fSAndroid Build Coastguard Worker  }
10118*1b3f573fSAndroid Build Coastguard Worker  return YES;
10119*1b3f573fSAndroid Build Coastguard Worker}
10120*1b3f573fSAndroid Build Coastguard Worker
10121*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
10122*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10123*1b3f573fSAndroid Build Coastguard Worker}
10124*1b3f573fSAndroid Build Coastguard Worker
10125*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
10126*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10127*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10128*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %u", _values[0]];
10129*1b3f573fSAndroid Build Coastguard Worker  }
10130*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10131*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %u", _values[1]];
10132*1b3f573fSAndroid Build Coastguard Worker  }
10133*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
10134*1b3f573fSAndroid Build Coastguard Worker  return result;
10135*1b3f573fSAndroid Build Coastguard Worker}
10136*1b3f573fSAndroid Build Coastguard Worker
10137*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
10138*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10139*1b3f573fSAndroid Build Coastguard Worker}
10140*1b3f573fSAndroid Build Coastguard Worker
10141*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt32:(uint32_t *)value forKey:(BOOL)key {
10142*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10143*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10144*1b3f573fSAndroid Build Coastguard Worker    if (value) {
10145*1b3f573fSAndroid Build Coastguard Worker      *value = _values[idx];
10146*1b3f573fSAndroid Build Coastguard Worker    }
10147*1b3f573fSAndroid Build Coastguard Worker    return YES;
10148*1b3f573fSAndroid Build Coastguard Worker  }
10149*1b3f573fSAndroid Build Coastguard Worker  return NO;
10150*1b3f573fSAndroid Build Coastguard Worker}
10151*1b3f573fSAndroid Build Coastguard Worker
10152*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10153*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10154*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10155*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueUInt32;
10156*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10157*1b3f573fSAndroid Build Coastguard Worker}
10158*1b3f573fSAndroid Build Coastguard Worker
10159*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10160*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10161*1b3f573fSAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%u", _values[0]]);
10162*1b3f573fSAndroid Build Coastguard Worker  }
10163*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10164*1b3f573fSAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%u", _values[1]]);
10165*1b3f573fSAndroid Build Coastguard Worker  }
10166*1b3f573fSAndroid Build Coastguard Worker}
10167*1b3f573fSAndroid Build Coastguard Worker
10168*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock:
10169*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, uint32_t value, BOOL *stop))block {
10170*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
10171*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10172*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10173*1b3f573fSAndroid Build Coastguard Worker  }
10174*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10175*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10176*1b3f573fSAndroid Build Coastguard Worker  }
10177*1b3f573fSAndroid Build Coastguard Worker}
10178*1b3f573fSAndroid Build Coastguard Worker
10179*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10180*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10181*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
10182*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
10183*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10184*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10185*1b3f573fSAndroid Build Coastguard Worker      ++count;
10186*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10187*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10188*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10189*1b3f573fSAndroid Build Coastguard Worker    }
10190*1b3f573fSAndroid Build Coastguard Worker  }
10191*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10192*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
10193*1b3f573fSAndroid Build Coastguard Worker  return result;
10194*1b3f573fSAndroid Build Coastguard Worker}
10195*1b3f573fSAndroid Build Coastguard Worker
10196*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10197*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10198*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10199*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10200*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10201*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10202*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
10203*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10204*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
10205*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10206*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10207*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10208*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
10209*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10210*1b3f573fSAndroid Build Coastguard Worker      WriteDictUInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10211*1b3f573fSAndroid Build Coastguard Worker    }
10212*1b3f573fSAndroid Build Coastguard Worker  }
10213*1b3f573fSAndroid Build Coastguard Worker}
10214*1b3f573fSAndroid Build Coastguard Worker
10215*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolUInt32Dictionary *)otherDictionary {
10216*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
10217*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10218*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10219*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
10220*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10221*1b3f573fSAndroid Build Coastguard Worker      }
10222*1b3f573fSAndroid Build Coastguard Worker    }
10223*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
10224*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10225*1b3f573fSAndroid Build Coastguard Worker    }
10226*1b3f573fSAndroid Build Coastguard Worker  }
10227*1b3f573fSAndroid Build Coastguard Worker}
10228*1b3f573fSAndroid Build Coastguard Worker
10229*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(BOOL)key {
10230*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10231*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
10232*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10233*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
10234*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10235*1b3f573fSAndroid Build Coastguard Worker  }
10236*1b3f573fSAndroid Build Coastguard Worker}
10237*1b3f573fSAndroid Build Coastguard Worker
10238*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(BOOL)aKey {
10239*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10240*1b3f573fSAndroid Build Coastguard Worker}
10241*1b3f573fSAndroid Build Coastguard Worker
10242*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
10243*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
10244*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
10245*1b3f573fSAndroid Build Coastguard Worker}
10246*1b3f573fSAndroid Build Coastguard Worker
10247*1b3f573fSAndroid Build Coastguard Worker@end
10248*1b3f573fSAndroid Build Coastguard Worker
10249*1b3f573fSAndroid Build Coastguard Worker// clang-format on
10250*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int32, int32_t)
10251*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10252*1b3f573fSAndroid Build Coastguard Worker// clang-format off
10253*1b3f573fSAndroid Build Coastguard Worker
10254*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Int32
10255*1b3f573fSAndroid Build Coastguard Worker
10256*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolInt32Dictionary {
10257*1b3f573fSAndroid Build Coastguard Worker @package
10258*1b3f573fSAndroid Build Coastguard Worker  int32_t _values[2];
10259*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
10260*1b3f573fSAndroid Build Coastguard Worker}
10261*1b3f573fSAndroid Build Coastguard Worker
10262*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
10263*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
10264*1b3f573fSAndroid Build Coastguard Worker}
10265*1b3f573fSAndroid Build Coastguard Worker
10266*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values
10267*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const BOOL [])keys
10268*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
10269*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
10270*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10271*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10272*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10273*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = values[i];
10274*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10275*1b3f573fSAndroid Build Coastguard Worker    }
10276*1b3f573fSAndroid Build Coastguard Worker  }
10277*1b3f573fSAndroid Build Coastguard Worker  return self;
10278*1b3f573fSAndroid Build Coastguard Worker}
10279*1b3f573fSAndroid Build Coastguard Worker
10280*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolInt32Dictionary *)dictionary {
10281*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt32s:NULL forKeys:NULL count:0];
10282*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10283*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
10284*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10285*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10286*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10287*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
10288*1b3f573fSAndroid Build Coastguard Worker        }
10289*1b3f573fSAndroid Build Coastguard Worker      }
10290*1b3f573fSAndroid Build Coastguard Worker    }
10291*1b3f573fSAndroid Build Coastguard Worker  }
10292*1b3f573fSAndroid Build Coastguard Worker  return self;
10293*1b3f573fSAndroid Build Coastguard Worker}
10294*1b3f573fSAndroid Build Coastguard Worker
10295*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10296*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
10297*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt32s:NULL forKeys:NULL count:0];
10298*1b3f573fSAndroid Build Coastguard Worker}
10299*1b3f573fSAndroid Build Coastguard Worker
10300*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10301*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
10302*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10303*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10304*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
10305*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
10306*1b3f573fSAndroid Build Coastguard Worker}
10307*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10308*1b3f573fSAndroid Build Coastguard Worker
10309*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10310*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolInt32Dictionary allocWithZone:zone] initWithDictionary:self];
10311*1b3f573fSAndroid Build Coastguard Worker}
10312*1b3f573fSAndroid Build Coastguard Worker
10313*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10314*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
10315*1b3f573fSAndroid Build Coastguard Worker    return YES;
10316*1b3f573fSAndroid Build Coastguard Worker  }
10317*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolInt32Dictionary class]]) {
10318*1b3f573fSAndroid Build Coastguard Worker    return NO;
10319*1b3f573fSAndroid Build Coastguard Worker  }
10320*1b3f573fSAndroid Build Coastguard Worker  GPBBoolInt32Dictionary *otherDictionary = other;
10321*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10322*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10323*1b3f573fSAndroid Build Coastguard Worker    return NO;
10324*1b3f573fSAndroid Build Coastguard Worker  }
10325*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10326*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10327*1b3f573fSAndroid Build Coastguard Worker    return NO;
10328*1b3f573fSAndroid Build Coastguard Worker  }
10329*1b3f573fSAndroid Build Coastguard Worker  return YES;
10330*1b3f573fSAndroid Build Coastguard Worker}
10331*1b3f573fSAndroid Build Coastguard Worker
10332*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
10333*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10334*1b3f573fSAndroid Build Coastguard Worker}
10335*1b3f573fSAndroid Build Coastguard Worker
10336*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
10337*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10338*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10339*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %d", _values[0]];
10340*1b3f573fSAndroid Build Coastguard Worker  }
10341*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10342*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %d", _values[1]];
10343*1b3f573fSAndroid Build Coastguard Worker  }
10344*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
10345*1b3f573fSAndroid Build Coastguard Worker  return result;
10346*1b3f573fSAndroid Build Coastguard Worker}
10347*1b3f573fSAndroid Build Coastguard Worker
10348*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
10349*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10350*1b3f573fSAndroid Build Coastguard Worker}
10351*1b3f573fSAndroid Build Coastguard Worker
10352*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt32:(int32_t *)value forKey:(BOOL)key {
10353*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10354*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10355*1b3f573fSAndroid Build Coastguard Worker    if (value) {
10356*1b3f573fSAndroid Build Coastguard Worker      *value = _values[idx];
10357*1b3f573fSAndroid Build Coastguard Worker    }
10358*1b3f573fSAndroid Build Coastguard Worker    return YES;
10359*1b3f573fSAndroid Build Coastguard Worker  }
10360*1b3f573fSAndroid Build Coastguard Worker  return NO;
10361*1b3f573fSAndroid Build Coastguard Worker}
10362*1b3f573fSAndroid Build Coastguard Worker
10363*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10364*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10365*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10366*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueInt32;
10367*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10368*1b3f573fSAndroid Build Coastguard Worker}
10369*1b3f573fSAndroid Build Coastguard Worker
10370*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10371*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10372*1b3f573fSAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%d", _values[0]]);
10373*1b3f573fSAndroid Build Coastguard Worker  }
10374*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10375*1b3f573fSAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%d", _values[1]]);
10376*1b3f573fSAndroid Build Coastguard Worker  }
10377*1b3f573fSAndroid Build Coastguard Worker}
10378*1b3f573fSAndroid Build Coastguard Worker
10379*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock:
10380*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int32_t value, BOOL *stop))block {
10381*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
10382*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10383*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10384*1b3f573fSAndroid Build Coastguard Worker  }
10385*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10386*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10387*1b3f573fSAndroid Build Coastguard Worker  }
10388*1b3f573fSAndroid Build Coastguard Worker}
10389*1b3f573fSAndroid Build Coastguard Worker
10390*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10391*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10392*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
10393*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
10394*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10395*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10396*1b3f573fSAndroid Build Coastguard Worker      ++count;
10397*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10398*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10399*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10400*1b3f573fSAndroid Build Coastguard Worker    }
10401*1b3f573fSAndroid Build Coastguard Worker  }
10402*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10403*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
10404*1b3f573fSAndroid Build Coastguard Worker  return result;
10405*1b3f573fSAndroid Build Coastguard Worker}
10406*1b3f573fSAndroid Build Coastguard Worker
10407*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10408*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10409*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10410*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10411*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10412*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10413*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
10414*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10415*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
10416*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10417*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10418*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10419*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
10420*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10421*1b3f573fSAndroid Build Coastguard Worker      WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10422*1b3f573fSAndroid Build Coastguard Worker    }
10423*1b3f573fSAndroid Build Coastguard Worker  }
10424*1b3f573fSAndroid Build Coastguard Worker}
10425*1b3f573fSAndroid Build Coastguard Worker
10426*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolInt32Dictionary *)otherDictionary {
10427*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
10428*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10429*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10430*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
10431*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10432*1b3f573fSAndroid Build Coastguard Worker      }
10433*1b3f573fSAndroid Build Coastguard Worker    }
10434*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
10435*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10436*1b3f573fSAndroid Build Coastguard Worker    }
10437*1b3f573fSAndroid Build Coastguard Worker  }
10438*1b3f573fSAndroid Build Coastguard Worker}
10439*1b3f573fSAndroid Build Coastguard Worker
10440*1b3f573fSAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(BOOL)key {
10441*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10442*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
10443*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10444*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
10445*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10446*1b3f573fSAndroid Build Coastguard Worker  }
10447*1b3f573fSAndroid Build Coastguard Worker}
10448*1b3f573fSAndroid Build Coastguard Worker
10449*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt32ForKey:(BOOL)aKey {
10450*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10451*1b3f573fSAndroid Build Coastguard Worker}
10452*1b3f573fSAndroid Build Coastguard Worker
10453*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
10454*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
10455*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
10456*1b3f573fSAndroid Build Coastguard Worker}
10457*1b3f573fSAndroid Build Coastguard Worker
10458*1b3f573fSAndroid Build Coastguard Worker@end
10459*1b3f573fSAndroid Build Coastguard Worker
10460*1b3f573fSAndroid Build Coastguard Worker// clang-format on
10461*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt64, uint64_t)
10462*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10463*1b3f573fSAndroid Build Coastguard Worker// clang-format off
10464*1b3f573fSAndroid Build Coastguard Worker
10465*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> UInt64
10466*1b3f573fSAndroid Build Coastguard Worker
10467*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolUInt64Dictionary {
10468*1b3f573fSAndroid Build Coastguard Worker @package
10469*1b3f573fSAndroid Build Coastguard Worker  uint64_t _values[2];
10470*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
10471*1b3f573fSAndroid Build Coastguard Worker}
10472*1b3f573fSAndroid Build Coastguard Worker
10473*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
10474*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
10475*1b3f573fSAndroid Build Coastguard Worker}
10476*1b3f573fSAndroid Build Coastguard Worker
10477*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values
10478*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
10479*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
10480*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
10481*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10482*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10483*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10484*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = values[i];
10485*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10486*1b3f573fSAndroid Build Coastguard Worker    }
10487*1b3f573fSAndroid Build Coastguard Worker  }
10488*1b3f573fSAndroid Build Coastguard Worker  return self;
10489*1b3f573fSAndroid Build Coastguard Worker}
10490*1b3f573fSAndroid Build Coastguard Worker
10491*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolUInt64Dictionary *)dictionary {
10492*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
10493*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10494*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
10495*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10496*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10497*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10498*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
10499*1b3f573fSAndroid Build Coastguard Worker        }
10500*1b3f573fSAndroid Build Coastguard Worker      }
10501*1b3f573fSAndroid Build Coastguard Worker    }
10502*1b3f573fSAndroid Build Coastguard Worker  }
10503*1b3f573fSAndroid Build Coastguard Worker  return self;
10504*1b3f573fSAndroid Build Coastguard Worker}
10505*1b3f573fSAndroid Build Coastguard Worker
10506*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10507*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
10508*1b3f573fSAndroid Build Coastguard Worker  return [self initWithUInt64s:NULL forKeys:NULL count:0];
10509*1b3f573fSAndroid Build Coastguard Worker}
10510*1b3f573fSAndroid Build Coastguard Worker
10511*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10512*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
10513*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10514*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10515*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
10516*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
10517*1b3f573fSAndroid Build Coastguard Worker}
10518*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10519*1b3f573fSAndroid Build Coastguard Worker
10520*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10521*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolUInt64Dictionary allocWithZone:zone] initWithDictionary:self];
10522*1b3f573fSAndroid Build Coastguard Worker}
10523*1b3f573fSAndroid Build Coastguard Worker
10524*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10525*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
10526*1b3f573fSAndroid Build Coastguard Worker    return YES;
10527*1b3f573fSAndroid Build Coastguard Worker  }
10528*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolUInt64Dictionary class]]) {
10529*1b3f573fSAndroid Build Coastguard Worker    return NO;
10530*1b3f573fSAndroid Build Coastguard Worker  }
10531*1b3f573fSAndroid Build Coastguard Worker  GPBBoolUInt64Dictionary *otherDictionary = other;
10532*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10533*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10534*1b3f573fSAndroid Build Coastguard Worker    return NO;
10535*1b3f573fSAndroid Build Coastguard Worker  }
10536*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10537*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10538*1b3f573fSAndroid Build Coastguard Worker    return NO;
10539*1b3f573fSAndroid Build Coastguard Worker  }
10540*1b3f573fSAndroid Build Coastguard Worker  return YES;
10541*1b3f573fSAndroid Build Coastguard Worker}
10542*1b3f573fSAndroid Build Coastguard Worker
10543*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
10544*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10545*1b3f573fSAndroid Build Coastguard Worker}
10546*1b3f573fSAndroid Build Coastguard Worker
10547*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
10548*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10549*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10550*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %llu", _values[0]];
10551*1b3f573fSAndroid Build Coastguard Worker  }
10552*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10553*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %llu", _values[1]];
10554*1b3f573fSAndroid Build Coastguard Worker  }
10555*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
10556*1b3f573fSAndroid Build Coastguard Worker  return result;
10557*1b3f573fSAndroid Build Coastguard Worker}
10558*1b3f573fSAndroid Build Coastguard Worker
10559*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
10560*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10561*1b3f573fSAndroid Build Coastguard Worker}
10562*1b3f573fSAndroid Build Coastguard Worker
10563*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getUInt64:(uint64_t *)value forKey:(BOOL)key {
10564*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10565*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10566*1b3f573fSAndroid Build Coastguard Worker    if (value) {
10567*1b3f573fSAndroid Build Coastguard Worker      *value = _values[idx];
10568*1b3f573fSAndroid Build Coastguard Worker    }
10569*1b3f573fSAndroid Build Coastguard Worker    return YES;
10570*1b3f573fSAndroid Build Coastguard Worker  }
10571*1b3f573fSAndroid Build Coastguard Worker  return NO;
10572*1b3f573fSAndroid Build Coastguard Worker}
10573*1b3f573fSAndroid Build Coastguard Worker
10574*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10575*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10576*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10577*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueUInt64;
10578*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10579*1b3f573fSAndroid Build Coastguard Worker}
10580*1b3f573fSAndroid Build Coastguard Worker
10581*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10582*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10583*1b3f573fSAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%llu", _values[0]]);
10584*1b3f573fSAndroid Build Coastguard Worker  }
10585*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10586*1b3f573fSAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%llu", _values[1]]);
10587*1b3f573fSAndroid Build Coastguard Worker  }
10588*1b3f573fSAndroid Build Coastguard Worker}
10589*1b3f573fSAndroid Build Coastguard Worker
10590*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock:
10591*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, uint64_t value, BOOL *stop))block {
10592*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
10593*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10594*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10595*1b3f573fSAndroid Build Coastguard Worker  }
10596*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10597*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10598*1b3f573fSAndroid Build Coastguard Worker  }
10599*1b3f573fSAndroid Build Coastguard Worker}
10600*1b3f573fSAndroid Build Coastguard Worker
10601*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10602*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10603*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
10604*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
10605*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10606*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10607*1b3f573fSAndroid Build Coastguard Worker      ++count;
10608*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10609*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10610*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10611*1b3f573fSAndroid Build Coastguard Worker    }
10612*1b3f573fSAndroid Build Coastguard Worker  }
10613*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10614*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
10615*1b3f573fSAndroid Build Coastguard Worker  return result;
10616*1b3f573fSAndroid Build Coastguard Worker}
10617*1b3f573fSAndroid Build Coastguard Worker
10618*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10619*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10620*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10621*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10622*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10623*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10624*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
10625*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10626*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
10627*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10628*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10629*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10630*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
10631*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10632*1b3f573fSAndroid Build Coastguard Worker      WriteDictUInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10633*1b3f573fSAndroid Build Coastguard Worker    }
10634*1b3f573fSAndroid Build Coastguard Worker  }
10635*1b3f573fSAndroid Build Coastguard Worker}
10636*1b3f573fSAndroid Build Coastguard Worker
10637*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolUInt64Dictionary *)otherDictionary {
10638*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
10639*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10640*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10641*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
10642*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10643*1b3f573fSAndroid Build Coastguard Worker      }
10644*1b3f573fSAndroid Build Coastguard Worker    }
10645*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
10646*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10647*1b3f573fSAndroid Build Coastguard Worker    }
10648*1b3f573fSAndroid Build Coastguard Worker  }
10649*1b3f573fSAndroid Build Coastguard Worker}
10650*1b3f573fSAndroid Build Coastguard Worker
10651*1b3f573fSAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(BOOL)key {
10652*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10653*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
10654*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10655*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
10656*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10657*1b3f573fSAndroid Build Coastguard Worker  }
10658*1b3f573fSAndroid Build Coastguard Worker}
10659*1b3f573fSAndroid Build Coastguard Worker
10660*1b3f573fSAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(BOOL)aKey {
10661*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10662*1b3f573fSAndroid Build Coastguard Worker}
10663*1b3f573fSAndroid Build Coastguard Worker
10664*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
10665*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
10666*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
10667*1b3f573fSAndroid Build Coastguard Worker}
10668*1b3f573fSAndroid Build Coastguard Worker
10669*1b3f573fSAndroid Build Coastguard Worker@end
10670*1b3f573fSAndroid Build Coastguard Worker
10671*1b3f573fSAndroid Build Coastguard Worker// clang-format on
10672*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int64, int64_t)
10673*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10674*1b3f573fSAndroid Build Coastguard Worker// clang-format off
10675*1b3f573fSAndroid Build Coastguard Worker
10676*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Int64
10677*1b3f573fSAndroid Build Coastguard Worker
10678*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolInt64Dictionary {
10679*1b3f573fSAndroid Build Coastguard Worker @package
10680*1b3f573fSAndroid Build Coastguard Worker  int64_t _values[2];
10681*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
10682*1b3f573fSAndroid Build Coastguard Worker}
10683*1b3f573fSAndroid Build Coastguard Worker
10684*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
10685*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
10686*1b3f573fSAndroid Build Coastguard Worker}
10687*1b3f573fSAndroid Build Coastguard Worker
10688*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values
10689*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const BOOL [])keys
10690*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
10691*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
10692*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10693*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10694*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10695*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = values[i];
10696*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10697*1b3f573fSAndroid Build Coastguard Worker    }
10698*1b3f573fSAndroid Build Coastguard Worker  }
10699*1b3f573fSAndroid Build Coastguard Worker  return self;
10700*1b3f573fSAndroid Build Coastguard Worker}
10701*1b3f573fSAndroid Build Coastguard Worker
10702*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolInt64Dictionary *)dictionary {
10703*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithInt64s:NULL forKeys:NULL count:0];
10704*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10705*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
10706*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10707*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10708*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10709*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
10710*1b3f573fSAndroid Build Coastguard Worker        }
10711*1b3f573fSAndroid Build Coastguard Worker      }
10712*1b3f573fSAndroid Build Coastguard Worker    }
10713*1b3f573fSAndroid Build Coastguard Worker  }
10714*1b3f573fSAndroid Build Coastguard Worker  return self;
10715*1b3f573fSAndroid Build Coastguard Worker}
10716*1b3f573fSAndroid Build Coastguard Worker
10717*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10718*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
10719*1b3f573fSAndroid Build Coastguard Worker  return [self initWithInt64s:NULL forKeys:NULL count:0];
10720*1b3f573fSAndroid Build Coastguard Worker}
10721*1b3f573fSAndroid Build Coastguard Worker
10722*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10723*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
10724*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10725*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10726*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
10727*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
10728*1b3f573fSAndroid Build Coastguard Worker}
10729*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10730*1b3f573fSAndroid Build Coastguard Worker
10731*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10732*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolInt64Dictionary allocWithZone:zone] initWithDictionary:self];
10733*1b3f573fSAndroid Build Coastguard Worker}
10734*1b3f573fSAndroid Build Coastguard Worker
10735*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10736*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
10737*1b3f573fSAndroid Build Coastguard Worker    return YES;
10738*1b3f573fSAndroid Build Coastguard Worker  }
10739*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolInt64Dictionary class]]) {
10740*1b3f573fSAndroid Build Coastguard Worker    return NO;
10741*1b3f573fSAndroid Build Coastguard Worker  }
10742*1b3f573fSAndroid Build Coastguard Worker  GPBBoolInt64Dictionary *otherDictionary = other;
10743*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10744*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10745*1b3f573fSAndroid Build Coastguard Worker    return NO;
10746*1b3f573fSAndroid Build Coastguard Worker  }
10747*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10748*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10749*1b3f573fSAndroid Build Coastguard Worker    return NO;
10750*1b3f573fSAndroid Build Coastguard Worker  }
10751*1b3f573fSAndroid Build Coastguard Worker  return YES;
10752*1b3f573fSAndroid Build Coastguard Worker}
10753*1b3f573fSAndroid Build Coastguard Worker
10754*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
10755*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10756*1b3f573fSAndroid Build Coastguard Worker}
10757*1b3f573fSAndroid Build Coastguard Worker
10758*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
10759*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10760*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10761*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %lld", _values[0]];
10762*1b3f573fSAndroid Build Coastguard Worker  }
10763*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10764*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %lld", _values[1]];
10765*1b3f573fSAndroid Build Coastguard Worker  }
10766*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
10767*1b3f573fSAndroid Build Coastguard Worker  return result;
10768*1b3f573fSAndroid Build Coastguard Worker}
10769*1b3f573fSAndroid Build Coastguard Worker
10770*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
10771*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10772*1b3f573fSAndroid Build Coastguard Worker}
10773*1b3f573fSAndroid Build Coastguard Worker
10774*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getInt64:(int64_t *)value forKey:(BOOL)key {
10775*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10776*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10777*1b3f573fSAndroid Build Coastguard Worker    if (value) {
10778*1b3f573fSAndroid Build Coastguard Worker      *value = _values[idx];
10779*1b3f573fSAndroid Build Coastguard Worker    }
10780*1b3f573fSAndroid Build Coastguard Worker    return YES;
10781*1b3f573fSAndroid Build Coastguard Worker  }
10782*1b3f573fSAndroid Build Coastguard Worker  return NO;
10783*1b3f573fSAndroid Build Coastguard Worker}
10784*1b3f573fSAndroid Build Coastguard Worker
10785*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10786*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10787*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10788*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueInt64;
10789*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10790*1b3f573fSAndroid Build Coastguard Worker}
10791*1b3f573fSAndroid Build Coastguard Worker
10792*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
10793*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10794*1b3f573fSAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%lld", _values[0]]);
10795*1b3f573fSAndroid Build Coastguard Worker  }
10796*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10797*1b3f573fSAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%lld", _values[1]]);
10798*1b3f573fSAndroid Build Coastguard Worker  }
10799*1b3f573fSAndroid Build Coastguard Worker}
10800*1b3f573fSAndroid Build Coastguard Worker
10801*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock:
10802*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int64_t value, BOOL *stop))block {
10803*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
10804*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10805*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
10806*1b3f573fSAndroid Build Coastguard Worker  }
10807*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
10808*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
10809*1b3f573fSAndroid Build Coastguard Worker  }
10810*1b3f573fSAndroid Build Coastguard Worker}
10811*1b3f573fSAndroid Build Coastguard Worker
10812*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10813*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10814*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
10815*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
10816*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10817*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10818*1b3f573fSAndroid Build Coastguard Worker      ++count;
10819*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10820*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10821*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10822*1b3f573fSAndroid Build Coastguard Worker    }
10823*1b3f573fSAndroid Build Coastguard Worker  }
10824*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
10825*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
10826*1b3f573fSAndroid Build Coastguard Worker  return result;
10827*1b3f573fSAndroid Build Coastguard Worker}
10828*1b3f573fSAndroid Build Coastguard Worker
10829*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10830*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
10831*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
10832*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
10833*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
10834*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
10835*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
10836*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
10837*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
10838*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10839*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
10840*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
10841*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
10842*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
10843*1b3f573fSAndroid Build Coastguard Worker      WriteDictInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
10844*1b3f573fSAndroid Build Coastguard Worker    }
10845*1b3f573fSAndroid Build Coastguard Worker  }
10846*1b3f573fSAndroid Build Coastguard Worker}
10847*1b3f573fSAndroid Build Coastguard Worker
10848*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolInt64Dictionary *)otherDictionary {
10849*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
10850*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
10851*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
10852*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
10853*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
10854*1b3f573fSAndroid Build Coastguard Worker      }
10855*1b3f573fSAndroid Build Coastguard Worker    }
10856*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
10857*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
10858*1b3f573fSAndroid Build Coastguard Worker    }
10859*1b3f573fSAndroid Build Coastguard Worker  }
10860*1b3f573fSAndroid Build Coastguard Worker}
10861*1b3f573fSAndroid Build Coastguard Worker
10862*1b3f573fSAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(BOOL)key {
10863*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10864*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
10865*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
10866*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
10867*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
10868*1b3f573fSAndroid Build Coastguard Worker  }
10869*1b3f573fSAndroid Build Coastguard Worker}
10870*1b3f573fSAndroid Build Coastguard Worker
10871*1b3f573fSAndroid Build Coastguard Worker- (void)removeInt64ForKey:(BOOL)aKey {
10872*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
10873*1b3f573fSAndroid Build Coastguard Worker}
10874*1b3f573fSAndroid Build Coastguard Worker
10875*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
10876*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
10877*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
10878*1b3f573fSAndroid Build Coastguard Worker}
10879*1b3f573fSAndroid Build Coastguard Worker
10880*1b3f573fSAndroid Build Coastguard Worker@end
10881*1b3f573fSAndroid Build Coastguard Worker
10882*1b3f573fSAndroid Build Coastguard Worker// clang-format on
10883*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Bool, BOOL)
10884*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
10885*1b3f573fSAndroid Build Coastguard Worker// clang-format off
10886*1b3f573fSAndroid Build Coastguard Worker
10887*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Bool
10888*1b3f573fSAndroid Build Coastguard Worker
10889*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolBoolDictionary {
10890*1b3f573fSAndroid Build Coastguard Worker @package
10891*1b3f573fSAndroid Build Coastguard Worker  BOOL _values[2];
10892*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
10893*1b3f573fSAndroid Build Coastguard Worker}
10894*1b3f573fSAndroid Build Coastguard Worker
10895*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
10896*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
10897*1b3f573fSAndroid Build Coastguard Worker}
10898*1b3f573fSAndroid Build Coastguard Worker
10899*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values
10900*1b3f573fSAndroid Build Coastguard Worker                      forKeys:(const BOOL [])keys
10901*1b3f573fSAndroid Build Coastguard Worker                        count:(NSUInteger)count {
10902*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
10903*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10904*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
10905*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
10906*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = values[i];
10907*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
10908*1b3f573fSAndroid Build Coastguard Worker    }
10909*1b3f573fSAndroid Build Coastguard Worker  }
10910*1b3f573fSAndroid Build Coastguard Worker  return self;
10911*1b3f573fSAndroid Build Coastguard Worker}
10912*1b3f573fSAndroid Build Coastguard Worker
10913*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolBoolDictionary *)dictionary {
10914*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithBools:NULL forKeys:NULL count:0];
10915*1b3f573fSAndroid Build Coastguard Worker  if (self) {
10916*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
10917*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
10918*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
10919*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
10920*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
10921*1b3f573fSAndroid Build Coastguard Worker        }
10922*1b3f573fSAndroid Build Coastguard Worker      }
10923*1b3f573fSAndroid Build Coastguard Worker    }
10924*1b3f573fSAndroid Build Coastguard Worker  }
10925*1b3f573fSAndroid Build Coastguard Worker  return self;
10926*1b3f573fSAndroid Build Coastguard Worker}
10927*1b3f573fSAndroid Build Coastguard Worker
10928*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
10929*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
10930*1b3f573fSAndroid Build Coastguard Worker  return [self initWithBools:NULL forKeys:NULL count:0];
10931*1b3f573fSAndroid Build Coastguard Worker}
10932*1b3f573fSAndroid Build Coastguard Worker
10933*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
10934*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
10935*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
10936*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
10937*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
10938*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
10939*1b3f573fSAndroid Build Coastguard Worker}
10940*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
10941*1b3f573fSAndroid Build Coastguard Worker
10942*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
10943*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolBoolDictionary allocWithZone:zone] initWithDictionary:self];
10944*1b3f573fSAndroid Build Coastguard Worker}
10945*1b3f573fSAndroid Build Coastguard Worker
10946*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
10947*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
10948*1b3f573fSAndroid Build Coastguard Worker    return YES;
10949*1b3f573fSAndroid Build Coastguard Worker  }
10950*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolBoolDictionary class]]) {
10951*1b3f573fSAndroid Build Coastguard Worker    return NO;
10952*1b3f573fSAndroid Build Coastguard Worker  }
10953*1b3f573fSAndroid Build Coastguard Worker  GPBBoolBoolDictionary *otherDictionary = other;
10954*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
10955*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
10956*1b3f573fSAndroid Build Coastguard Worker    return NO;
10957*1b3f573fSAndroid Build Coastguard Worker  }
10958*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
10959*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
10960*1b3f573fSAndroid Build Coastguard Worker    return NO;
10961*1b3f573fSAndroid Build Coastguard Worker  }
10962*1b3f573fSAndroid Build Coastguard Worker  return YES;
10963*1b3f573fSAndroid Build Coastguard Worker}
10964*1b3f573fSAndroid Build Coastguard Worker
10965*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
10966*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10967*1b3f573fSAndroid Build Coastguard Worker}
10968*1b3f573fSAndroid Build Coastguard Worker
10969*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
10970*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
10971*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
10972*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %d", _values[0]];
10973*1b3f573fSAndroid Build Coastguard Worker  }
10974*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
10975*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %d", _values[1]];
10976*1b3f573fSAndroid Build Coastguard Worker  }
10977*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
10978*1b3f573fSAndroid Build Coastguard Worker  return result;
10979*1b3f573fSAndroid Build Coastguard Worker}
10980*1b3f573fSAndroid Build Coastguard Worker
10981*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
10982*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
10983*1b3f573fSAndroid Build Coastguard Worker}
10984*1b3f573fSAndroid Build Coastguard Worker
10985*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getBool:(BOOL *)value forKey:(BOOL)key {
10986*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
10987*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
10988*1b3f573fSAndroid Build Coastguard Worker    if (value) {
10989*1b3f573fSAndroid Build Coastguard Worker      *value = _values[idx];
10990*1b3f573fSAndroid Build Coastguard Worker    }
10991*1b3f573fSAndroid Build Coastguard Worker    return YES;
10992*1b3f573fSAndroid Build Coastguard Worker  }
10993*1b3f573fSAndroid Build Coastguard Worker  return NO;
10994*1b3f573fSAndroid Build Coastguard Worker}
10995*1b3f573fSAndroid Build Coastguard Worker
10996*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
10997*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
10998*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
10999*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueBool;
11000*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11001*1b3f573fSAndroid Build Coastguard Worker}
11002*1b3f573fSAndroid Build Coastguard Worker
11003*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11004*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11005*1b3f573fSAndroid Build Coastguard Worker    block(@"false", (_values[0] ? @"true" : @"false"));
11006*1b3f573fSAndroid Build Coastguard Worker  }
11007*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
11008*1b3f573fSAndroid Build Coastguard Worker    block(@"true", (_values[1] ? @"true" : @"false"));
11009*1b3f573fSAndroid Build Coastguard Worker  }
11010*1b3f573fSAndroid Build Coastguard Worker}
11011*1b3f573fSAndroid Build Coastguard Worker
11012*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock:
11013*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, BOOL value, BOOL *stop))block {
11014*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
11015*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11016*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11017*1b3f573fSAndroid Build Coastguard Worker  }
11018*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11019*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11020*1b3f573fSAndroid Build Coastguard Worker  }
11021*1b3f573fSAndroid Build Coastguard Worker}
11022*1b3f573fSAndroid Build Coastguard Worker
11023*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11024*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11025*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
11026*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
11027*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11028*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11029*1b3f573fSAndroid Build Coastguard Worker      ++count;
11030*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11031*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11032*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11033*1b3f573fSAndroid Build Coastguard Worker    }
11034*1b3f573fSAndroid Build Coastguard Worker  }
11035*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11036*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
11037*1b3f573fSAndroid Build Coastguard Worker  return result;
11038*1b3f573fSAndroid Build Coastguard Worker}
11039*1b3f573fSAndroid Build Coastguard Worker
11040*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11041*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11042*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11043*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11044*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11045*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11046*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
11047*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11048*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
11049*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11050*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11051*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11052*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
11053*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11054*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11055*1b3f573fSAndroid Build Coastguard Worker    }
11056*1b3f573fSAndroid Build Coastguard Worker  }
11057*1b3f573fSAndroid Build Coastguard Worker}
11058*1b3f573fSAndroid Build Coastguard Worker
11059*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolBoolDictionary *)otherDictionary {
11060*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
11061*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11062*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11063*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
11064*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11065*1b3f573fSAndroid Build Coastguard Worker      }
11066*1b3f573fSAndroid Build Coastguard Worker    }
11067*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
11068*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11069*1b3f573fSAndroid Build Coastguard Worker    }
11070*1b3f573fSAndroid Build Coastguard Worker  }
11071*1b3f573fSAndroid Build Coastguard Worker}
11072*1b3f573fSAndroid Build Coastguard Worker
11073*1b3f573fSAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(BOOL)key {
11074*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11075*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
11076*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11077*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
11078*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11079*1b3f573fSAndroid Build Coastguard Worker  }
11080*1b3f573fSAndroid Build Coastguard Worker}
11081*1b3f573fSAndroid Build Coastguard Worker
11082*1b3f573fSAndroid Build Coastguard Worker- (void)removeBoolForKey:(BOOL)aKey {
11083*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
11084*1b3f573fSAndroid Build Coastguard Worker}
11085*1b3f573fSAndroid Build Coastguard Worker
11086*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
11087*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
11088*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
11089*1b3f573fSAndroid Build Coastguard Worker}
11090*1b3f573fSAndroid Build Coastguard Worker
11091*1b3f573fSAndroid Build Coastguard Worker@end
11092*1b3f573fSAndroid Build Coastguard Worker
11093*1b3f573fSAndroid Build Coastguard Worker// clang-format on
11094*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Float, float)
11095*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11096*1b3f573fSAndroid Build Coastguard Worker// clang-format off
11097*1b3f573fSAndroid Build Coastguard Worker
11098*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Float
11099*1b3f573fSAndroid Build Coastguard Worker
11100*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolFloatDictionary {
11101*1b3f573fSAndroid Build Coastguard Worker @package
11102*1b3f573fSAndroid Build Coastguard Worker  float _values[2];
11103*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
11104*1b3f573fSAndroid Build Coastguard Worker}
11105*1b3f573fSAndroid Build Coastguard Worker
11106*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
11107*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
11108*1b3f573fSAndroid Build Coastguard Worker}
11109*1b3f573fSAndroid Build Coastguard Worker
11110*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values
11111*1b3f573fSAndroid Build Coastguard Worker                       forKeys:(const BOOL [])keys
11112*1b3f573fSAndroid Build Coastguard Worker                         count:(NSUInteger)count {
11113*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
11114*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11115*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11116*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11117*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = values[i];
11118*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
11119*1b3f573fSAndroid Build Coastguard Worker    }
11120*1b3f573fSAndroid Build Coastguard Worker  }
11121*1b3f573fSAndroid Build Coastguard Worker  return self;
11122*1b3f573fSAndroid Build Coastguard Worker}
11123*1b3f573fSAndroid Build Coastguard Worker
11124*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolFloatDictionary *)dictionary {
11125*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithFloats:NULL forKeys:NULL count:0];
11126*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11127*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
11128*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
11129*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
11130*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
11131*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
11132*1b3f573fSAndroid Build Coastguard Worker        }
11133*1b3f573fSAndroid Build Coastguard Worker      }
11134*1b3f573fSAndroid Build Coastguard Worker    }
11135*1b3f573fSAndroid Build Coastguard Worker  }
11136*1b3f573fSAndroid Build Coastguard Worker  return self;
11137*1b3f573fSAndroid Build Coastguard Worker}
11138*1b3f573fSAndroid Build Coastguard Worker
11139*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
11140*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
11141*1b3f573fSAndroid Build Coastguard Worker  return [self initWithFloats:NULL forKeys:NULL count:0];
11142*1b3f573fSAndroid Build Coastguard Worker}
11143*1b3f573fSAndroid Build Coastguard Worker
11144*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
11145*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
11146*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11147*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11148*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
11149*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
11150*1b3f573fSAndroid Build Coastguard Worker}
11151*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
11152*1b3f573fSAndroid Build Coastguard Worker
11153*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11154*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolFloatDictionary allocWithZone:zone] initWithDictionary:self];
11155*1b3f573fSAndroid Build Coastguard Worker}
11156*1b3f573fSAndroid Build Coastguard Worker
11157*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11158*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
11159*1b3f573fSAndroid Build Coastguard Worker    return YES;
11160*1b3f573fSAndroid Build Coastguard Worker  }
11161*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolFloatDictionary class]]) {
11162*1b3f573fSAndroid Build Coastguard Worker    return NO;
11163*1b3f573fSAndroid Build Coastguard Worker  }
11164*1b3f573fSAndroid Build Coastguard Worker  GPBBoolFloatDictionary *otherDictionary = other;
11165*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
11166*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
11167*1b3f573fSAndroid Build Coastguard Worker    return NO;
11168*1b3f573fSAndroid Build Coastguard Worker  }
11169*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
11170*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
11171*1b3f573fSAndroid Build Coastguard Worker    return NO;
11172*1b3f573fSAndroid Build Coastguard Worker  }
11173*1b3f573fSAndroid Build Coastguard Worker  return YES;
11174*1b3f573fSAndroid Build Coastguard Worker}
11175*1b3f573fSAndroid Build Coastguard Worker
11176*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
11177*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11178*1b3f573fSAndroid Build Coastguard Worker}
11179*1b3f573fSAndroid Build Coastguard Worker
11180*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
11181*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11182*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11183*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %f", _values[0]];
11184*1b3f573fSAndroid Build Coastguard Worker  }
11185*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
11186*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %f", _values[1]];
11187*1b3f573fSAndroid Build Coastguard Worker  }
11188*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
11189*1b3f573fSAndroid Build Coastguard Worker  return result;
11190*1b3f573fSAndroid Build Coastguard Worker}
11191*1b3f573fSAndroid Build Coastguard Worker
11192*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
11193*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11194*1b3f573fSAndroid Build Coastguard Worker}
11195*1b3f573fSAndroid Build Coastguard Worker
11196*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getFloat:(float *)value forKey:(BOOL)key {
11197*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11198*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11199*1b3f573fSAndroid Build Coastguard Worker    if (value) {
11200*1b3f573fSAndroid Build Coastguard Worker      *value = _values[idx];
11201*1b3f573fSAndroid Build Coastguard Worker    }
11202*1b3f573fSAndroid Build Coastguard Worker    return YES;
11203*1b3f573fSAndroid Build Coastguard Worker  }
11204*1b3f573fSAndroid Build Coastguard Worker  return NO;
11205*1b3f573fSAndroid Build Coastguard Worker}
11206*1b3f573fSAndroid Build Coastguard Worker
11207*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11208*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11209*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11210*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueFloat;
11211*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11212*1b3f573fSAndroid Build Coastguard Worker}
11213*1b3f573fSAndroid Build Coastguard Worker
11214*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11215*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11216*1b3f573fSAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[0]]);
11217*1b3f573fSAndroid Build Coastguard Worker  }
11218*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
11219*1b3f573fSAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[1]]);
11220*1b3f573fSAndroid Build Coastguard Worker  }
11221*1b3f573fSAndroid Build Coastguard Worker}
11222*1b3f573fSAndroid Build Coastguard Worker
11223*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock:
11224*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, float value, BOOL *stop))block {
11225*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
11226*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11227*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11228*1b3f573fSAndroid Build Coastguard Worker  }
11229*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11230*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11231*1b3f573fSAndroid Build Coastguard Worker  }
11232*1b3f573fSAndroid Build Coastguard Worker}
11233*1b3f573fSAndroid Build Coastguard Worker
11234*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11235*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11236*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
11237*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
11238*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11239*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11240*1b3f573fSAndroid Build Coastguard Worker      ++count;
11241*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11242*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11243*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11244*1b3f573fSAndroid Build Coastguard Worker    }
11245*1b3f573fSAndroid Build Coastguard Worker  }
11246*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11247*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
11248*1b3f573fSAndroid Build Coastguard Worker  return result;
11249*1b3f573fSAndroid Build Coastguard Worker}
11250*1b3f573fSAndroid Build Coastguard Worker
11251*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11252*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11253*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11254*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11255*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11256*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11257*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
11258*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11259*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
11260*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11261*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11262*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11263*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
11264*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11265*1b3f573fSAndroid Build Coastguard Worker      WriteDictFloatField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11266*1b3f573fSAndroid Build Coastguard Worker    }
11267*1b3f573fSAndroid Build Coastguard Worker  }
11268*1b3f573fSAndroid Build Coastguard Worker}
11269*1b3f573fSAndroid Build Coastguard Worker
11270*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolFloatDictionary *)otherDictionary {
11271*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
11272*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11273*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11274*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
11275*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11276*1b3f573fSAndroid Build Coastguard Worker      }
11277*1b3f573fSAndroid Build Coastguard Worker    }
11278*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
11279*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11280*1b3f573fSAndroid Build Coastguard Worker    }
11281*1b3f573fSAndroid Build Coastguard Worker  }
11282*1b3f573fSAndroid Build Coastguard Worker}
11283*1b3f573fSAndroid Build Coastguard Worker
11284*1b3f573fSAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(BOOL)key {
11285*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11286*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
11287*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11288*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
11289*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11290*1b3f573fSAndroid Build Coastguard Worker  }
11291*1b3f573fSAndroid Build Coastguard Worker}
11292*1b3f573fSAndroid Build Coastguard Worker
11293*1b3f573fSAndroid Build Coastguard Worker- (void)removeFloatForKey:(BOOL)aKey {
11294*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
11295*1b3f573fSAndroid Build Coastguard Worker}
11296*1b3f573fSAndroid Build Coastguard Worker
11297*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
11298*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
11299*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
11300*1b3f573fSAndroid Build Coastguard Worker}
11301*1b3f573fSAndroid Build Coastguard Worker
11302*1b3f573fSAndroid Build Coastguard Worker@end
11303*1b3f573fSAndroid Build Coastguard Worker
11304*1b3f573fSAndroid Build Coastguard Worker// clang-format on
11305*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Double, double)
11306*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11307*1b3f573fSAndroid Build Coastguard Worker// clang-format off
11308*1b3f573fSAndroid Build Coastguard Worker
11309*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Double
11310*1b3f573fSAndroid Build Coastguard Worker
11311*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolDoubleDictionary {
11312*1b3f573fSAndroid Build Coastguard Worker @package
11313*1b3f573fSAndroid Build Coastguard Worker  double _values[2];
11314*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
11315*1b3f573fSAndroid Build Coastguard Worker}
11316*1b3f573fSAndroid Build Coastguard Worker
11317*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
11318*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
11319*1b3f573fSAndroid Build Coastguard Worker}
11320*1b3f573fSAndroid Build Coastguard Worker
11321*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values
11322*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
11323*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
11324*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
11325*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11326*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11327*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11328*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = values[i];
11329*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
11330*1b3f573fSAndroid Build Coastguard Worker    }
11331*1b3f573fSAndroid Build Coastguard Worker  }
11332*1b3f573fSAndroid Build Coastguard Worker  return self;
11333*1b3f573fSAndroid Build Coastguard Worker}
11334*1b3f573fSAndroid Build Coastguard Worker
11335*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolDoubleDictionary *)dictionary {
11336*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithDoubles:NULL forKeys:NULL count:0];
11337*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11338*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
11339*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
11340*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
11341*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
11342*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
11343*1b3f573fSAndroid Build Coastguard Worker        }
11344*1b3f573fSAndroid Build Coastguard Worker      }
11345*1b3f573fSAndroid Build Coastguard Worker    }
11346*1b3f573fSAndroid Build Coastguard Worker  }
11347*1b3f573fSAndroid Build Coastguard Worker  return self;
11348*1b3f573fSAndroid Build Coastguard Worker}
11349*1b3f573fSAndroid Build Coastguard Worker
11350*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
11351*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
11352*1b3f573fSAndroid Build Coastguard Worker  return [self initWithDoubles:NULL forKeys:NULL count:0];
11353*1b3f573fSAndroid Build Coastguard Worker}
11354*1b3f573fSAndroid Build Coastguard Worker
11355*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
11356*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
11357*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11358*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11359*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
11360*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
11361*1b3f573fSAndroid Build Coastguard Worker}
11362*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
11363*1b3f573fSAndroid Build Coastguard Worker
11364*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11365*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolDoubleDictionary allocWithZone:zone] initWithDictionary:self];
11366*1b3f573fSAndroid Build Coastguard Worker}
11367*1b3f573fSAndroid Build Coastguard Worker
11368*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11369*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
11370*1b3f573fSAndroid Build Coastguard Worker    return YES;
11371*1b3f573fSAndroid Build Coastguard Worker  }
11372*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolDoubleDictionary class]]) {
11373*1b3f573fSAndroid Build Coastguard Worker    return NO;
11374*1b3f573fSAndroid Build Coastguard Worker  }
11375*1b3f573fSAndroid Build Coastguard Worker  GPBBoolDoubleDictionary *otherDictionary = other;
11376*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
11377*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
11378*1b3f573fSAndroid Build Coastguard Worker    return NO;
11379*1b3f573fSAndroid Build Coastguard Worker  }
11380*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
11381*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
11382*1b3f573fSAndroid Build Coastguard Worker    return NO;
11383*1b3f573fSAndroid Build Coastguard Worker  }
11384*1b3f573fSAndroid Build Coastguard Worker  return YES;
11385*1b3f573fSAndroid Build Coastguard Worker}
11386*1b3f573fSAndroid Build Coastguard Worker
11387*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
11388*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11389*1b3f573fSAndroid Build Coastguard Worker}
11390*1b3f573fSAndroid Build Coastguard Worker
11391*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
11392*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11393*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11394*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %lf", _values[0]];
11395*1b3f573fSAndroid Build Coastguard Worker  }
11396*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
11397*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %lf", _values[1]];
11398*1b3f573fSAndroid Build Coastguard Worker  }
11399*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
11400*1b3f573fSAndroid Build Coastguard Worker  return result;
11401*1b3f573fSAndroid Build Coastguard Worker}
11402*1b3f573fSAndroid Build Coastguard Worker
11403*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
11404*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11405*1b3f573fSAndroid Build Coastguard Worker}
11406*1b3f573fSAndroid Build Coastguard Worker
11407*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getDouble:(double *)value forKey:(BOOL)key {
11408*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11409*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11410*1b3f573fSAndroid Build Coastguard Worker    if (value) {
11411*1b3f573fSAndroid Build Coastguard Worker      *value = _values[idx];
11412*1b3f573fSAndroid Build Coastguard Worker    }
11413*1b3f573fSAndroid Build Coastguard Worker    return YES;
11414*1b3f573fSAndroid Build Coastguard Worker  }
11415*1b3f573fSAndroid Build Coastguard Worker  return NO;
11416*1b3f573fSAndroid Build Coastguard Worker}
11417*1b3f573fSAndroid Build Coastguard Worker
11418*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11419*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11420*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11421*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueDouble;
11422*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11423*1b3f573fSAndroid Build Coastguard Worker}
11424*1b3f573fSAndroid Build Coastguard Worker
11425*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11426*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11427*1b3f573fSAndroid Build Coastguard Worker    block(@"false", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[0]]);
11428*1b3f573fSAndroid Build Coastguard Worker  }
11429*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
11430*1b3f573fSAndroid Build Coastguard Worker    block(@"true", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[1]]);
11431*1b3f573fSAndroid Build Coastguard Worker  }
11432*1b3f573fSAndroid Build Coastguard Worker}
11433*1b3f573fSAndroid Build Coastguard Worker
11434*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock:
11435*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, double value, BOOL *stop))block {
11436*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
11437*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11438*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11439*1b3f573fSAndroid Build Coastguard Worker  }
11440*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11441*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11442*1b3f573fSAndroid Build Coastguard Worker  }
11443*1b3f573fSAndroid Build Coastguard Worker}
11444*1b3f573fSAndroid Build Coastguard Worker
11445*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11446*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11447*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
11448*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
11449*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11450*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11451*1b3f573fSAndroid Build Coastguard Worker      ++count;
11452*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11453*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11454*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11455*1b3f573fSAndroid Build Coastguard Worker    }
11456*1b3f573fSAndroid Build Coastguard Worker  }
11457*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11458*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
11459*1b3f573fSAndroid Build Coastguard Worker  return result;
11460*1b3f573fSAndroid Build Coastguard Worker}
11461*1b3f573fSAndroid Build Coastguard Worker
11462*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11463*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11464*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11465*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11466*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11467*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11468*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
11469*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11470*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
11471*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11472*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11473*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11474*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
11475*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11476*1b3f573fSAndroid Build Coastguard Worker      WriteDictDoubleField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11477*1b3f573fSAndroid Build Coastguard Worker    }
11478*1b3f573fSAndroid Build Coastguard Worker  }
11479*1b3f573fSAndroid Build Coastguard Worker}
11480*1b3f573fSAndroid Build Coastguard Worker
11481*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolDoubleDictionary *)otherDictionary {
11482*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
11483*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11484*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11485*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
11486*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11487*1b3f573fSAndroid Build Coastguard Worker      }
11488*1b3f573fSAndroid Build Coastguard Worker    }
11489*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
11490*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11491*1b3f573fSAndroid Build Coastguard Worker    }
11492*1b3f573fSAndroid Build Coastguard Worker  }
11493*1b3f573fSAndroid Build Coastguard Worker}
11494*1b3f573fSAndroid Build Coastguard Worker
11495*1b3f573fSAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(BOOL)key {
11496*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11497*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
11498*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11499*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
11500*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11501*1b3f573fSAndroid Build Coastguard Worker  }
11502*1b3f573fSAndroid Build Coastguard Worker}
11503*1b3f573fSAndroid Build Coastguard Worker
11504*1b3f573fSAndroid Build Coastguard Worker- (void)removeDoubleForKey:(BOOL)aKey {
11505*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
11506*1b3f573fSAndroid Build Coastguard Worker}
11507*1b3f573fSAndroid Build Coastguard Worker
11508*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
11509*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
11510*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
11511*1b3f573fSAndroid Build Coastguard Worker}
11512*1b3f573fSAndroid Build Coastguard Worker
11513*1b3f573fSAndroid Build Coastguard Worker@end
11514*1b3f573fSAndroid Build Coastguard Worker
11515*1b3f573fSAndroid Build Coastguard Worker// clang-format on
11516*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(Object, id)
11517*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11518*1b3f573fSAndroid Build Coastguard Worker// clang-format off
11519*1b3f573fSAndroid Build Coastguard Worker
11520*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Object
11521*1b3f573fSAndroid Build Coastguard Worker
11522*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolObjectDictionary {
11523*1b3f573fSAndroid Build Coastguard Worker @package
11524*1b3f573fSAndroid Build Coastguard Worker  id _values[2];
11525*1b3f573fSAndroid Build Coastguard Worker}
11526*1b3f573fSAndroid Build Coastguard Worker
11527*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
11528*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
11529*1b3f573fSAndroid Build Coastguard Worker}
11530*1b3f573fSAndroid Build Coastguard Worker
11531*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
11532*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const BOOL [])keys
11533*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
11534*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
11535*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11536*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11537*1b3f573fSAndroid Build Coastguard Worker      if (!objects[i]) {
11538*1b3f573fSAndroid Build Coastguard Worker        [NSException raise:NSInvalidArgumentException
11539*1b3f573fSAndroid Build Coastguard Worker                    format:@"Attempting to add nil object to a Dictionary"];
11540*1b3f573fSAndroid Build Coastguard Worker      }
11541*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11542*1b3f573fSAndroid Build Coastguard Worker      [_values[idx] release];
11543*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = (id)[objects[i] retain];
11544*1b3f573fSAndroid Build Coastguard Worker    }
11545*1b3f573fSAndroid Build Coastguard Worker  }
11546*1b3f573fSAndroid Build Coastguard Worker  return self;
11547*1b3f573fSAndroid Build Coastguard Worker}
11548*1b3f573fSAndroid Build Coastguard Worker
11549*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolObjectDictionary *)dictionary {
11550*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithObjects:NULL forKeys:NULL count:0];
11551*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11552*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
11553*1b3f573fSAndroid Build Coastguard Worker      _values[0] = [dictionary->_values[0] retain];
11554*1b3f573fSAndroid Build Coastguard Worker      _values[1] = [dictionary->_values[1] retain];
11555*1b3f573fSAndroid Build Coastguard Worker    }
11556*1b3f573fSAndroid Build Coastguard Worker  }
11557*1b3f573fSAndroid Build Coastguard Worker  return self;
11558*1b3f573fSAndroid Build Coastguard Worker}
11559*1b3f573fSAndroid Build Coastguard Worker
11560*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems {
11561*1b3f573fSAndroid Build Coastguard Worker  #pragma unused(numItems)
11562*1b3f573fSAndroid Build Coastguard Worker  return [self initWithObjects:NULL forKeys:NULL count:0];
11563*1b3f573fSAndroid Build Coastguard Worker}
11564*1b3f573fSAndroid Build Coastguard Worker
11565*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
11566*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11567*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11568*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
11569*1b3f573fSAndroid Build Coastguard Worker  [_values[0] release];
11570*1b3f573fSAndroid Build Coastguard Worker  [_values[1] release];
11571*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
11572*1b3f573fSAndroid Build Coastguard Worker}
11573*1b3f573fSAndroid Build Coastguard Worker
11574*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11575*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolObjectDictionary allocWithZone:zone] initWithDictionary:self];
11576*1b3f573fSAndroid Build Coastguard Worker}
11577*1b3f573fSAndroid Build Coastguard Worker
11578*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11579*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
11580*1b3f573fSAndroid Build Coastguard Worker    return YES;
11581*1b3f573fSAndroid Build Coastguard Worker  }
11582*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolObjectDictionary class]]) {
11583*1b3f573fSAndroid Build Coastguard Worker    return NO;
11584*1b3f573fSAndroid Build Coastguard Worker  }
11585*1b3f573fSAndroid Build Coastguard Worker  GPBBoolObjectDictionary *otherDictionary = other;
11586*1b3f573fSAndroid Build Coastguard Worker  if (((_values[0] != nil) != (otherDictionary->_values[0] != nil)) ||
11587*1b3f573fSAndroid Build Coastguard Worker      ((_values[1] != nil) != (otherDictionary->_values[1] != nil))) {
11588*1b3f573fSAndroid Build Coastguard Worker    return NO;
11589*1b3f573fSAndroid Build Coastguard Worker  }
11590*1b3f573fSAndroid Build Coastguard Worker  if (((_values[0] != nil) && (![_values[0] isEqual:otherDictionary->_values[0]])) ||
11591*1b3f573fSAndroid Build Coastguard Worker      ((_values[1] != nil) && (![_values[1] isEqual:otherDictionary->_values[1]]))) {
11592*1b3f573fSAndroid Build Coastguard Worker    return NO;
11593*1b3f573fSAndroid Build Coastguard Worker  }
11594*1b3f573fSAndroid Build Coastguard Worker  return YES;
11595*1b3f573fSAndroid Build Coastguard Worker}
11596*1b3f573fSAndroid Build Coastguard Worker
11597*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
11598*1b3f573fSAndroid Build Coastguard Worker  return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0);
11599*1b3f573fSAndroid Build Coastguard Worker}
11600*1b3f573fSAndroid Build Coastguard Worker
11601*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
11602*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11603*1b3f573fSAndroid Build Coastguard Worker  if ((_values[0] != nil)) {
11604*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %@", _values[0]];
11605*1b3f573fSAndroid Build Coastguard Worker  }
11606*1b3f573fSAndroid Build Coastguard Worker  if ((_values[1] != nil)) {
11607*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %@", _values[1]];
11608*1b3f573fSAndroid Build Coastguard Worker  }
11609*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
11610*1b3f573fSAndroid Build Coastguard Worker  return result;
11611*1b3f573fSAndroid Build Coastguard Worker}
11612*1b3f573fSAndroid Build Coastguard Worker
11613*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
11614*1b3f573fSAndroid Build Coastguard Worker  return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0);
11615*1b3f573fSAndroid Build Coastguard Worker}
11616*1b3f573fSAndroid Build Coastguard Worker
11617*1b3f573fSAndroid Build Coastguard Worker- (id)objectForKey:(BOOL)key {
11618*1b3f573fSAndroid Build Coastguard Worker  return _values[key ? 1 : 0];
11619*1b3f573fSAndroid Build Coastguard Worker}
11620*1b3f573fSAndroid Build Coastguard Worker
11621*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11622*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11623*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11624*1b3f573fSAndroid Build Coastguard Worker  [_values[idx] release];
11625*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = [value->valueString retain];
11626*1b3f573fSAndroid Build Coastguard Worker}
11627*1b3f573fSAndroid Build Coastguard Worker
11628*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11629*1b3f573fSAndroid Build Coastguard Worker  if (_values[0] != nil) {
11630*1b3f573fSAndroid Build Coastguard Worker    block(@"false", _values[0]);
11631*1b3f573fSAndroid Build Coastguard Worker  }
11632*1b3f573fSAndroid Build Coastguard Worker  if ((_values[1] != nil)) {
11633*1b3f573fSAndroid Build Coastguard Worker    block(@"true", _values[1]);
11634*1b3f573fSAndroid Build Coastguard Worker  }
11635*1b3f573fSAndroid Build Coastguard Worker}
11636*1b3f573fSAndroid Build Coastguard Worker
11637*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:
11638*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, id object, BOOL *stop))block {
11639*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
11640*1b3f573fSAndroid Build Coastguard Worker  if (_values[0] != nil) {
11641*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11642*1b3f573fSAndroid Build Coastguard Worker  }
11643*1b3f573fSAndroid Build Coastguard Worker  if (!stop && (_values[1] != nil)) {
11644*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11645*1b3f573fSAndroid Build Coastguard Worker  }
11646*1b3f573fSAndroid Build Coastguard Worker}
11647*1b3f573fSAndroid Build Coastguard Worker
11648*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isInitialized {
11649*1b3f573fSAndroid Build Coastguard Worker  if (_values[0] && ![_values[0] isInitialized]) {
11650*1b3f573fSAndroid Build Coastguard Worker    return NO;
11651*1b3f573fSAndroid Build Coastguard Worker  }
11652*1b3f573fSAndroid Build Coastguard Worker  if (_values[1] && ![_values[1] isInitialized]) {
11653*1b3f573fSAndroid Build Coastguard Worker    return NO;
11654*1b3f573fSAndroid Build Coastguard Worker  }
11655*1b3f573fSAndroid Build Coastguard Worker  return YES;
11656*1b3f573fSAndroid Build Coastguard Worker}
11657*1b3f573fSAndroid Build Coastguard Worker
11658*1b3f573fSAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone {
11659*1b3f573fSAndroid Build Coastguard Worker  GPBBoolObjectDictionary *newDict =
11660*1b3f573fSAndroid Build Coastguard Worker      [[GPBBoolObjectDictionary alloc] init];
11661*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11662*1b3f573fSAndroid Build Coastguard Worker    if (_values[i] != nil) {
11663*1b3f573fSAndroid Build Coastguard Worker      newDict->_values[i] = [_values[i] copyWithZone:zone];
11664*1b3f573fSAndroid Build Coastguard Worker    }
11665*1b3f573fSAndroid Build Coastguard Worker  }
11666*1b3f573fSAndroid Build Coastguard Worker  return newDict;
11667*1b3f573fSAndroid Build Coastguard Worker}
11668*1b3f573fSAndroid Build Coastguard Worker
11669*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11670*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11671*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
11672*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
11673*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11674*1b3f573fSAndroid Build Coastguard Worker    if (_values[i] != nil) {
11675*1b3f573fSAndroid Build Coastguard Worker      ++count;
11676*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11677*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11678*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11679*1b3f573fSAndroid Build Coastguard Worker    }
11680*1b3f573fSAndroid Build Coastguard Worker  }
11681*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11682*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
11683*1b3f573fSAndroid Build Coastguard Worker  return result;
11684*1b3f573fSAndroid Build Coastguard Worker}
11685*1b3f573fSAndroid Build Coastguard Worker
11686*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11687*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11688*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11689*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11690*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11691*1b3f573fSAndroid Build Coastguard Worker    if (_values[i] != nil) {
11692*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
11693*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11694*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
11695*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11696*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11697*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11698*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
11699*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11700*1b3f573fSAndroid Build Coastguard Worker      WriteDictObjectField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11701*1b3f573fSAndroid Build Coastguard Worker    }
11702*1b3f573fSAndroid Build Coastguard Worker  }
11703*1b3f573fSAndroid Build Coastguard Worker}
11704*1b3f573fSAndroid Build Coastguard Worker
11705*1b3f573fSAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolObjectDictionary *)otherDictionary {
11706*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
11707*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11708*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_values[i] != nil) {
11709*1b3f573fSAndroid Build Coastguard Worker        [_values[i] release];
11710*1b3f573fSAndroid Build Coastguard Worker        _values[i] = [otherDictionary->_values[i] retain];
11711*1b3f573fSAndroid Build Coastguard Worker      }
11712*1b3f573fSAndroid Build Coastguard Worker    }
11713*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
11714*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
11715*1b3f573fSAndroid Build Coastguard Worker    }
11716*1b3f573fSAndroid Build Coastguard Worker  }
11717*1b3f573fSAndroid Build Coastguard Worker}
11718*1b3f573fSAndroid Build Coastguard Worker
11719*1b3f573fSAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(BOOL)key {
11720*1b3f573fSAndroid Build Coastguard Worker  if (!object) {
11721*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
11722*1b3f573fSAndroid Build Coastguard Worker                format:@"Attempting to add nil object to a Dictionary"];
11723*1b3f573fSAndroid Build Coastguard Worker  }
11724*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11725*1b3f573fSAndroid Build Coastguard Worker  [_values[idx] release];
11726*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = [object retain];
11727*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
11728*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
11729*1b3f573fSAndroid Build Coastguard Worker  }
11730*1b3f573fSAndroid Build Coastguard Worker}
11731*1b3f573fSAndroid Build Coastguard Worker
11732*1b3f573fSAndroid Build Coastguard Worker- (void)removeObjectForKey:(BOOL)aKey {
11733*1b3f573fSAndroid Build Coastguard Worker  int idx = (aKey ? 1 : 0);
11734*1b3f573fSAndroid Build Coastguard Worker  [_values[idx] release];
11735*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = nil;
11736*1b3f573fSAndroid Build Coastguard Worker}
11737*1b3f573fSAndroid Build Coastguard Worker
11738*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
11739*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11740*1b3f573fSAndroid Build Coastguard Worker    [_values[i] release];
11741*1b3f573fSAndroid Build Coastguard Worker    _values[i] = nil;
11742*1b3f573fSAndroid Build Coastguard Worker  }
11743*1b3f573fSAndroid Build Coastguard Worker}
11744*1b3f573fSAndroid Build Coastguard Worker
11745*1b3f573fSAndroid Build Coastguard Worker@end
11746*1b3f573fSAndroid Build Coastguard Worker
11747*1b3f573fSAndroid Build Coastguard Worker// clang-format on
11748*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (8 expansions)
11749*1b3f573fSAndroid Build Coastguard Worker
11750*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Enum
11751*1b3f573fSAndroid Build Coastguard Worker
11752*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolEnumDictionary {
11753*1b3f573fSAndroid Build Coastguard Worker @package
11754*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc _validationFunc;
11755*1b3f573fSAndroid Build Coastguard Worker  int32_t _values[2];
11756*1b3f573fSAndroid Build Coastguard Worker  BOOL _valueSet[2];
11757*1b3f573fSAndroid Build Coastguard Worker}
11758*1b3f573fSAndroid Build Coastguard Worker
11759*1b3f573fSAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc;
11760*1b3f573fSAndroid Build Coastguard Worker
11761*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init {
11762*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
11763*1b3f573fSAndroid Build Coastguard Worker}
11764*1b3f573fSAndroid Build Coastguard Worker
11765*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
11766*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
11767*1b3f573fSAndroid Build Coastguard Worker}
11768*1b3f573fSAndroid Build Coastguard Worker
11769*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
11770*1b3f573fSAndroid Build Coastguard Worker                                rawValues:(const int32_t [])rawValues
11771*1b3f573fSAndroid Build Coastguard Worker                                   forKeys:(const BOOL [])keys
11772*1b3f573fSAndroid Build Coastguard Worker                                     count:(NSUInteger)count {
11773*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
11774*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11775*1b3f573fSAndroid Build Coastguard Worker    _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
11776*1b3f573fSAndroid Build Coastguard Worker    for (NSUInteger i = 0; i < count; ++i) {
11777*1b3f573fSAndroid Build Coastguard Worker      int idx = keys[i] ? 1 : 0;
11778*1b3f573fSAndroid Build Coastguard Worker      _values[idx] = rawValues[i];
11779*1b3f573fSAndroid Build Coastguard Worker      _valueSet[idx] = YES;
11780*1b3f573fSAndroid Build Coastguard Worker    }
11781*1b3f573fSAndroid Build Coastguard Worker  }
11782*1b3f573fSAndroid Build Coastguard Worker  return self;
11783*1b3f573fSAndroid Build Coastguard Worker}
11784*1b3f573fSAndroid Build Coastguard Worker
11785*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolEnumDictionary *)dictionary {
11786*1b3f573fSAndroid Build Coastguard Worker  self = [self initWithValidationFunction:dictionary.validationFunc
11787*1b3f573fSAndroid Build Coastguard Worker                                rawValues:NULL
11788*1b3f573fSAndroid Build Coastguard Worker                                  forKeys:NULL
11789*1b3f573fSAndroid Build Coastguard Worker                                    count:0];
11790*1b3f573fSAndroid Build Coastguard Worker  if (self) {
11791*1b3f573fSAndroid Build Coastguard Worker    if (dictionary) {
11792*1b3f573fSAndroid Build Coastguard Worker      for (int i = 0; i < 2; ++i) {
11793*1b3f573fSAndroid Build Coastguard Worker        if (dictionary->_valueSet[i]) {
11794*1b3f573fSAndroid Build Coastguard Worker          _values[i] = dictionary->_values[i];
11795*1b3f573fSAndroid Build Coastguard Worker          _valueSet[i] = YES;
11796*1b3f573fSAndroid Build Coastguard Worker        }
11797*1b3f573fSAndroid Build Coastguard Worker      }
11798*1b3f573fSAndroid Build Coastguard Worker    }
11799*1b3f573fSAndroid Build Coastguard Worker  }
11800*1b3f573fSAndroid Build Coastguard Worker  return self;
11801*1b3f573fSAndroid Build Coastguard Worker}
11802*1b3f573fSAndroid Build Coastguard Worker
11803*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
11804*1b3f573fSAndroid Build Coastguard Worker                                  capacity:(NSUInteger)numItems {
11805*1b3f573fSAndroid Build Coastguard Worker#pragma unused(numItems)
11806*1b3f573fSAndroid Build Coastguard Worker  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
11807*1b3f573fSAndroid Build Coastguard Worker}
11808*1b3f573fSAndroid Build Coastguard Worker
11809*1b3f573fSAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS)
11810*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
11811*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
11812*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
11813*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
11814*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
11815*1b3f573fSAndroid Build Coastguard Worker}
11816*1b3f573fSAndroid Build Coastguard Worker#endif  // !defined(NS_BLOCK_ASSERTIONS)
11817*1b3f573fSAndroid Build Coastguard Worker
11818*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone {
11819*1b3f573fSAndroid Build Coastguard Worker  return [[GPBBoolEnumDictionary allocWithZone:zone] initWithDictionary:self];
11820*1b3f573fSAndroid Build Coastguard Worker}
11821*1b3f573fSAndroid Build Coastguard Worker
11822*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other {
11823*1b3f573fSAndroid Build Coastguard Worker  if (self == other) {
11824*1b3f573fSAndroid Build Coastguard Worker    return YES;
11825*1b3f573fSAndroid Build Coastguard Worker  }
11826*1b3f573fSAndroid Build Coastguard Worker  if (![other isKindOfClass:[GPBBoolEnumDictionary class]]) {
11827*1b3f573fSAndroid Build Coastguard Worker    return NO;
11828*1b3f573fSAndroid Build Coastguard Worker  }
11829*1b3f573fSAndroid Build Coastguard Worker  GPBBoolEnumDictionary *otherDictionary = other;
11830*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
11831*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] != otherDictionary->_valueSet[1])) {
11832*1b3f573fSAndroid Build Coastguard Worker    return NO;
11833*1b3f573fSAndroid Build Coastguard Worker  }
11834*1b3f573fSAndroid Build Coastguard Worker  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
11835*1b3f573fSAndroid Build Coastguard Worker      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
11836*1b3f573fSAndroid Build Coastguard Worker    return NO;
11837*1b3f573fSAndroid Build Coastguard Worker  }
11838*1b3f573fSAndroid Build Coastguard Worker  return YES;
11839*1b3f573fSAndroid Build Coastguard Worker}
11840*1b3f573fSAndroid Build Coastguard Worker
11841*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash {
11842*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11843*1b3f573fSAndroid Build Coastguard Worker}
11844*1b3f573fSAndroid Build Coastguard Worker
11845*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description {
11846*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self];
11847*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11848*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"NO: %d", _values[0]];
11849*1b3f573fSAndroid Build Coastguard Worker  }
11850*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
11851*1b3f573fSAndroid Build Coastguard Worker    [result appendFormat:@"YES: %d", _values[1]];
11852*1b3f573fSAndroid Build Coastguard Worker  }
11853*1b3f573fSAndroid Build Coastguard Worker  [result appendString:@" }"];
11854*1b3f573fSAndroid Build Coastguard Worker  return result;
11855*1b3f573fSAndroid Build Coastguard Worker}
11856*1b3f573fSAndroid Build Coastguard Worker
11857*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
11858*1b3f573fSAndroid Build Coastguard Worker  return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11859*1b3f573fSAndroid Build Coastguard Worker}
11860*1b3f573fSAndroid Build Coastguard Worker
11861*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t*)value forKey:(BOOL)key {
11862*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11863*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11864*1b3f573fSAndroid Build Coastguard Worker    if (value) {
11865*1b3f573fSAndroid Build Coastguard Worker      int32_t result = _values[idx];
11866*1b3f573fSAndroid Build Coastguard Worker      if (!_validationFunc(result)) {
11867*1b3f573fSAndroid Build Coastguard Worker        result = kGPBUnrecognizedEnumeratorValue;
11868*1b3f573fSAndroid Build Coastguard Worker      }
11869*1b3f573fSAndroid Build Coastguard Worker      *value = result;
11870*1b3f573fSAndroid Build Coastguard Worker    }
11871*1b3f573fSAndroid Build Coastguard Worker    return YES;
11872*1b3f573fSAndroid Build Coastguard Worker  }
11873*1b3f573fSAndroid Build Coastguard Worker  return NO;
11874*1b3f573fSAndroid Build Coastguard Worker}
11875*1b3f573fSAndroid Build Coastguard Worker
11876*1b3f573fSAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t*)rawValue forKey:(BOOL)key {
11877*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
11878*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[idx]) {
11879*1b3f573fSAndroid Build Coastguard Worker    if (rawValue) {
11880*1b3f573fSAndroid Build Coastguard Worker      *rawValue = _values[idx];
11881*1b3f573fSAndroid Build Coastguard Worker    }
11882*1b3f573fSAndroid Build Coastguard Worker    return YES;
11883*1b3f573fSAndroid Build Coastguard Worker  }
11884*1b3f573fSAndroid Build Coastguard Worker  return NO;
11885*1b3f573fSAndroid Build Coastguard Worker}
11886*1b3f573fSAndroid Build Coastguard Worker
11887*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock:
11888*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int32_t value, BOOL *stop))block {
11889*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
11890*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11891*1b3f573fSAndroid Build Coastguard Worker    block(NO, _values[0], &stop);
11892*1b3f573fSAndroid Build Coastguard Worker  }
11893*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11894*1b3f573fSAndroid Build Coastguard Worker    block(YES, _values[1], &stop);
11895*1b3f573fSAndroid Build Coastguard Worker  }
11896*1b3f573fSAndroid Build Coastguard Worker}
11897*1b3f573fSAndroid Build Coastguard Worker
11898*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock:
11899*1b3f573fSAndroid Build Coastguard Worker    (void (NS_NOESCAPE ^)(BOOL key, int32_t rawValue, BOOL *stop))block {
11900*1b3f573fSAndroid Build Coastguard Worker  BOOL stop = NO;
11901*1b3f573fSAndroid Build Coastguard Worker  GPBEnumValidationFunc func = _validationFunc;
11902*1b3f573fSAndroid Build Coastguard Worker  int32_t validatedValue;
11903*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11904*1b3f573fSAndroid Build Coastguard Worker    validatedValue = _values[0];
11905*1b3f573fSAndroid Build Coastguard Worker    if (!func(validatedValue)) {
11906*1b3f573fSAndroid Build Coastguard Worker      validatedValue = kGPBUnrecognizedEnumeratorValue;
11907*1b3f573fSAndroid Build Coastguard Worker    }
11908*1b3f573fSAndroid Build Coastguard Worker    block(NO, validatedValue, &stop);
11909*1b3f573fSAndroid Build Coastguard Worker  }
11910*1b3f573fSAndroid Build Coastguard Worker  if (!stop && _valueSet[1]) {
11911*1b3f573fSAndroid Build Coastguard Worker    validatedValue = _values[1];
11912*1b3f573fSAndroid Build Coastguard Worker    if (!func(validatedValue)) {
11913*1b3f573fSAndroid Build Coastguard Worker      validatedValue = kGPBUnrecognizedEnumeratorValue;
11914*1b3f573fSAndroid Build Coastguard Worker    }
11915*1b3f573fSAndroid Build Coastguard Worker    block(YES, validatedValue, &stop);
11916*1b3f573fSAndroid Build Coastguard Worker  }
11917*1b3f573fSAndroid Build Coastguard Worker}
11918*1b3f573fSAndroid Build Coastguard Worker
11919*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
11920*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
11921*1b3f573fSAndroid Build Coastguard Worker// clang-format off
11922*1b3f573fSAndroid Build Coastguard Worker
11923*1b3f573fSAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value
11924*1b3f573fSAndroid Build Coastguard Worker                                   forKey:(GPBGenericValue *)key
11925*1b3f573fSAndroid Build Coastguard Worker                              keyDataType:(GPBDataType)keyDataType {
11926*1b3f573fSAndroid Build Coastguard Worker  size_t msgSize = ComputeDictBoolFieldSize(key->valueBool, kMapKeyFieldNumber, keyDataType);
11927*1b3f573fSAndroid Build Coastguard Worker  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
11928*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
11929*1b3f573fSAndroid Build Coastguard Worker  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
11930*1b3f573fSAndroid Build Coastguard Worker  WriteDictBoolField(outputStream, key->valueBool, kMapKeyFieldNumber, keyDataType);
11931*1b3f573fSAndroid Build Coastguard Worker  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
11932*1b3f573fSAndroid Build Coastguard Worker  [outputStream release];
11933*1b3f573fSAndroid Build Coastguard Worker  return data;
11934*1b3f573fSAndroid Build Coastguard Worker}
11935*1b3f573fSAndroid Build Coastguard Worker
11936*1b3f573fSAndroid Build Coastguard Worker// clang-format on
11937*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
11938*1b3f573fSAndroid Build Coastguard Worker
11939*1b3f573fSAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11940*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11941*1b3f573fSAndroid Build Coastguard Worker  NSUInteger count = 0;
11942*1b3f573fSAndroid Build Coastguard Worker  size_t result = 0;
11943*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11944*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11945*1b3f573fSAndroid Build Coastguard Worker      ++count;
11946*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11947*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11948*1b3f573fSAndroid Build Coastguard Worker      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11949*1b3f573fSAndroid Build Coastguard Worker    }
11950*1b3f573fSAndroid Build Coastguard Worker  }
11951*1b3f573fSAndroid Build Coastguard Worker  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
11952*1b3f573fSAndroid Build Coastguard Worker  result += tagSize * count;
11953*1b3f573fSAndroid Build Coastguard Worker  return result;
11954*1b3f573fSAndroid Build Coastguard Worker}
11955*1b3f573fSAndroid Build Coastguard Worker
11956*1b3f573fSAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11957*1b3f573fSAndroid Build Coastguard Worker                         asField:(GPBFieldDescriptor *)field {
11958*1b3f573fSAndroid Build Coastguard Worker  GPBDataType valueDataType = GPBGetFieldDataType(field);
11959*1b3f573fSAndroid Build Coastguard Worker  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
11960*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < 2; ++i) {
11961*1b3f573fSAndroid Build Coastguard Worker    if (_valueSet[i]) {
11962*1b3f573fSAndroid Build Coastguard Worker      // Write the tag.
11963*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:tag];
11964*1b3f573fSAndroid Build Coastguard Worker      // Write the size of the message.
11965*1b3f573fSAndroid Build Coastguard Worker      size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11966*1b3f573fSAndroid Build Coastguard Worker      msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
11967*1b3f573fSAndroid Build Coastguard Worker      [outputStream writeInt32NoTag:(int32_t)msgSize];
11968*1b3f573fSAndroid Build Coastguard Worker      // Write the fields.
11969*1b3f573fSAndroid Build Coastguard Worker      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
11970*1b3f573fSAndroid Build Coastguard Worker      WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
11971*1b3f573fSAndroid Build Coastguard Worker    }
11972*1b3f573fSAndroid Build Coastguard Worker  }
11973*1b3f573fSAndroid Build Coastguard Worker}
11974*1b3f573fSAndroid Build Coastguard Worker
11975*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
11976*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[0]) {
11977*1b3f573fSAndroid Build Coastguard Worker    block(@"false", @(_values[0]));
11978*1b3f573fSAndroid Build Coastguard Worker  }
11979*1b3f573fSAndroid Build Coastguard Worker  if (_valueSet[1]) {
11980*1b3f573fSAndroid Build Coastguard Worker    block(@"true", @(_values[1]));
11981*1b3f573fSAndroid Build Coastguard Worker  }
11982*1b3f573fSAndroid Build Coastguard Worker}
11983*1b3f573fSAndroid Build Coastguard Worker
11984*1b3f573fSAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value
11985*1b3f573fSAndroid Build Coastguard Worker     forGPBGenericValueKey:(GPBGenericValue *)key {
11986*1b3f573fSAndroid Build Coastguard Worker  int idx = (key->valueBool ? 1 : 0);
11987*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value->valueInt32;
11988*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
11989*1b3f573fSAndroid Build Coastguard Worker}
11990*1b3f573fSAndroid Build Coastguard Worker
11991*1b3f573fSAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBBoolEnumDictionary *)otherDictionary {
11992*1b3f573fSAndroid Build Coastguard Worker  if (otherDictionary) {
11993*1b3f573fSAndroid Build Coastguard Worker    for (int i = 0; i < 2; ++i) {
11994*1b3f573fSAndroid Build Coastguard Worker      if (otherDictionary->_valueSet[i]) {
11995*1b3f573fSAndroid Build Coastguard Worker        _valueSet[i] = YES;
11996*1b3f573fSAndroid Build Coastguard Worker        _values[i] = otherDictionary->_values[i];
11997*1b3f573fSAndroid Build Coastguard Worker      }
11998*1b3f573fSAndroid Build Coastguard Worker    }
11999*1b3f573fSAndroid Build Coastguard Worker    if (_autocreator) {
12000*1b3f573fSAndroid Build Coastguard Worker      GPBAutocreatedDictionaryModified(_autocreator, self);
12001*1b3f573fSAndroid Build Coastguard Worker    }
12002*1b3f573fSAndroid Build Coastguard Worker  }
12003*1b3f573fSAndroid Build Coastguard Worker}
12004*1b3f573fSAndroid Build Coastguard Worker
12005*1b3f573fSAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(BOOL)key {
12006*1b3f573fSAndroid Build Coastguard Worker  if (!_validationFunc(value)) {
12007*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:NSInvalidArgumentException
12008*1b3f573fSAndroid Build Coastguard Worker                format:@"GPBBoolEnumDictionary: Attempt to set an unknown enum value (%d)",
12009*1b3f573fSAndroid Build Coastguard Worker     value];
12010*1b3f573fSAndroid Build Coastguard Worker  }
12011*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
12012*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = value;
12013*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
12014*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
12015*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12016*1b3f573fSAndroid Build Coastguard Worker  }
12017*1b3f573fSAndroid Build Coastguard Worker}
12018*1b3f573fSAndroid Build Coastguard Worker
12019*1b3f573fSAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)rawValue forKey:(BOOL)key {
12020*1b3f573fSAndroid Build Coastguard Worker  int idx = (key ? 1 : 0);
12021*1b3f573fSAndroid Build Coastguard Worker  _values[idx] = rawValue;
12022*1b3f573fSAndroid Build Coastguard Worker  _valueSet[idx] = YES;
12023*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
12024*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12025*1b3f573fSAndroid Build Coastguard Worker  }
12026*1b3f573fSAndroid Build Coastguard Worker}
12027*1b3f573fSAndroid Build Coastguard Worker
12028*1b3f573fSAndroid Build Coastguard Worker- (void)removeEnumForKey:(BOOL)aKey {
12029*1b3f573fSAndroid Build Coastguard Worker  _valueSet[aKey ? 1 : 0] = NO;
12030*1b3f573fSAndroid Build Coastguard Worker}
12031*1b3f573fSAndroid Build Coastguard Worker
12032*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll {
12033*1b3f573fSAndroid Build Coastguard Worker  _valueSet[0] = NO;
12034*1b3f573fSAndroid Build Coastguard Worker  _valueSet[1] = NO;
12035*1b3f573fSAndroid Build Coastguard Worker}
12036*1b3f573fSAndroid Build Coastguard Worker
12037*1b3f573fSAndroid Build Coastguard Worker@end
12038*1b3f573fSAndroid Build Coastguard Worker
12039*1b3f573fSAndroid Build Coastguard Worker#pragma mark - NSDictionary Subclass
12040*1b3f573fSAndroid Build Coastguard Worker
12041*1b3f573fSAndroid Build Coastguard Worker@implementation GPBAutocreatedDictionary {
12042*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *_dictionary;
12043*1b3f573fSAndroid Build Coastguard Worker}
12044*1b3f573fSAndroid Build Coastguard Worker
12045*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
12046*1b3f573fSAndroid Build Coastguard Worker  NSAssert(!_autocreator,
12047*1b3f573fSAndroid Build Coastguard Worker           @"%@: Autocreator must be cleared before release, autocreator: %@",
12048*1b3f573fSAndroid Build Coastguard Worker           [self class], _autocreator);
12049*1b3f573fSAndroid Build Coastguard Worker  [_dictionary release];
12050*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
12051*1b3f573fSAndroid Build Coastguard Worker}
12052*1b3f573fSAndroid Build Coastguard Worker
12053*1b3f573fSAndroid Build Coastguard Worker#pragma mark Required NSDictionary overrides
12054*1b3f573fSAndroid Build Coastguard Worker
12055*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects
12056*1b3f573fSAndroid Build Coastguard Worker                        forKeys:(const id<NSCopying> [])keys
12057*1b3f573fSAndroid Build Coastguard Worker                          count:(NSUInteger)count {
12058*1b3f573fSAndroid Build Coastguard Worker  self = [super init];
12059*1b3f573fSAndroid Build Coastguard Worker  if (self) {
12060*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] initWithObjects:objects
12061*1b3f573fSAndroid Build Coastguard Worker                                                       forKeys:keys
12062*1b3f573fSAndroid Build Coastguard Worker                                                         count:count];
12063*1b3f573fSAndroid Build Coastguard Worker  }
12064*1b3f573fSAndroid Build Coastguard Worker  return self;
12065*1b3f573fSAndroid Build Coastguard Worker}
12066*1b3f573fSAndroid Build Coastguard Worker
12067*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count {
12068*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary count];
12069*1b3f573fSAndroid Build Coastguard Worker}
12070*1b3f573fSAndroid Build Coastguard Worker
12071*1b3f573fSAndroid Build Coastguard Worker- (id)objectForKey:(id)aKey {
12072*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary objectForKey:aKey];
12073*1b3f573fSAndroid Build Coastguard Worker}
12074*1b3f573fSAndroid Build Coastguard Worker
12075*1b3f573fSAndroid Build Coastguard Worker- (NSEnumerator *)keyEnumerator {
12076*1b3f573fSAndroid Build Coastguard Worker  if (_dictionary == nil) {
12077*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
12078*1b3f573fSAndroid Build Coastguard Worker  }
12079*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary keyEnumerator];
12080*1b3f573fSAndroid Build Coastguard Worker}
12081*1b3f573fSAndroid Build Coastguard Worker
12082*1b3f573fSAndroid Build Coastguard Worker#pragma mark Required NSMutableDictionary overrides
12083*1b3f573fSAndroid Build Coastguard Worker
12084*1b3f573fSAndroid Build Coastguard Worker// Only need to call GPBAutocreatedDictionaryModified() when adding things
12085*1b3f573fSAndroid Build Coastguard Worker// since we only autocreate empty dictionaries.
12086*1b3f573fSAndroid Build Coastguard Worker
12087*1b3f573fSAndroid Build Coastguard Worker- (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey {
12088*1b3f573fSAndroid Build Coastguard Worker  if (_dictionary == nil) {
12089*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
12090*1b3f573fSAndroid Build Coastguard Worker  }
12091*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:anObject forKey:aKey];
12092*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
12093*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12094*1b3f573fSAndroid Build Coastguard Worker  }
12095*1b3f573fSAndroid Build Coastguard Worker}
12096*1b3f573fSAndroid Build Coastguard Worker
12097*1b3f573fSAndroid Build Coastguard Worker- (void)removeObjectForKey:(id)aKey {
12098*1b3f573fSAndroid Build Coastguard Worker  [_dictionary removeObjectForKey:aKey];
12099*1b3f573fSAndroid Build Coastguard Worker}
12100*1b3f573fSAndroid Build Coastguard Worker
12101*1b3f573fSAndroid Build Coastguard Worker#pragma mark Extra things hooked
12102*1b3f573fSAndroid Build Coastguard Worker
12103*1b3f573fSAndroid Build Coastguard Worker- (id)copyWithZone:(NSZone *)zone {
12104*1b3f573fSAndroid Build Coastguard Worker  if (_dictionary == nil) {
12105*1b3f573fSAndroid Build Coastguard Worker    return [[NSMutableDictionary allocWithZone:zone] init];
12106*1b3f573fSAndroid Build Coastguard Worker  }
12107*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary copyWithZone:zone];
12108*1b3f573fSAndroid Build Coastguard Worker}
12109*1b3f573fSAndroid Build Coastguard Worker
12110*1b3f573fSAndroid Build Coastguard Worker- (id)mutableCopyWithZone:(NSZone *)zone {
12111*1b3f573fSAndroid Build Coastguard Worker  if (_dictionary == nil) {
12112*1b3f573fSAndroid Build Coastguard Worker    return [[NSMutableDictionary allocWithZone:zone] init];
12113*1b3f573fSAndroid Build Coastguard Worker  }
12114*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary mutableCopyWithZone:zone];
12115*1b3f573fSAndroid Build Coastguard Worker}
12116*1b3f573fSAndroid Build Coastguard Worker
12117*1b3f573fSAndroid Build Coastguard Worker// Not really needed, but subscripting is likely common enough it doesn't hurt
12118*1b3f573fSAndroid Build Coastguard Worker// to ensure it goes directly to the real NSMutableDictionary.
12119*1b3f573fSAndroid Build Coastguard Worker- (id)objectForKeyedSubscript:(id)key {
12120*1b3f573fSAndroid Build Coastguard Worker  return [_dictionary objectForKeyedSubscript:key];
12121*1b3f573fSAndroid Build Coastguard Worker}
12122*1b3f573fSAndroid Build Coastguard Worker
12123*1b3f573fSAndroid Build Coastguard Worker// Not really needed, but subscripting is likely common enough it doesn't hurt
12124*1b3f573fSAndroid Build Coastguard Worker// to ensure it goes directly to the real NSMutableDictionary.
12125*1b3f573fSAndroid Build Coastguard Worker- (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key {
12126*1b3f573fSAndroid Build Coastguard Worker  if (_dictionary == nil) {
12127*1b3f573fSAndroid Build Coastguard Worker    _dictionary = [[NSMutableDictionary alloc] init];
12128*1b3f573fSAndroid Build Coastguard Worker  }
12129*1b3f573fSAndroid Build Coastguard Worker  [_dictionary setObject:obj forKeyedSubscript:key];
12130*1b3f573fSAndroid Build Coastguard Worker  if (_autocreator) {
12131*1b3f573fSAndroid Build Coastguard Worker    GPBAutocreatedDictionaryModified(_autocreator, self);
12132*1b3f573fSAndroid Build Coastguard Worker  }
12133*1b3f573fSAndroid Build Coastguard Worker}
12134*1b3f573fSAndroid Build Coastguard Worker
12135*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:(void (NS_NOESCAPE ^)(id key,
12136*1b3f573fSAndroid Build Coastguard Worker                                                    id obj,
12137*1b3f573fSAndroid Build Coastguard Worker                                                    BOOL *stop))block {
12138*1b3f573fSAndroid Build Coastguard Worker  [_dictionary enumerateKeysAndObjectsUsingBlock:block];
12139*1b3f573fSAndroid Build Coastguard Worker}
12140*1b3f573fSAndroid Build Coastguard Worker
12141*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts
12142*1b3f573fSAndroid Build Coastguard Worker                                usingBlock:(void (NS_NOESCAPE ^)(id key,
12143*1b3f573fSAndroid Build Coastguard Worker                                                     id obj,
12144*1b3f573fSAndroid Build Coastguard Worker                                                     BOOL *stop))block {
12145*1b3f573fSAndroid Build Coastguard Worker  [_dictionary enumerateKeysAndObjectsWithOptions:opts usingBlock:block];
12146*1b3f573fSAndroid Build Coastguard Worker}
12147*1b3f573fSAndroid Build Coastguard Worker
12148*1b3f573fSAndroid Build Coastguard Worker@end
12149*1b3f573fSAndroid Build Coastguard Worker
12150*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic pop
12151