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