123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 |
- // Protocol Buffers - Google's data interchange format
- // Copyright 2008 Google Inc. All rights reserved.
- //
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file or at
- // https://developers.google.com/open-source/licenses/bsd
- #import "GPBUnknownField.h"
- #import "GPBUnknownField_PackagePrivate.h"
- #import "GPBArray.h"
- #import "GPBCodedOutputStream.h"
- #import "GPBCodedOutputStream_PackagePrivate.h"
- #import "GPBUnknownFieldSet.h"
- #import "GPBUnknownFields.h"
- #import "GPBUnknownFields_PackagePrivate.h"
- #import "GPBWireFormat.h"
- #define ASSERT_FIELD_TYPE(type) \
- if (type_ != type) { \
- [NSException raise:NSInternalInconsistencyException \
- format:@"GPBUnknownField is the wrong type"]; \
- }
- @implementation GPBUnknownField
- @synthesize number = number_;
- @synthesize type = type_;
- - (instancetype)initWithNumber:(int32_t)number {
- if ((self = [super init])) {
- number_ = number;
- type_ = GPBUnknownFieldTypeLegacy;
- }
- return self;
- }
- - (instancetype)initWithNumber:(int32_t)number varint:(uint64_t)varint {
- if ((self = [super init])) {
- number_ = number;
- type_ = GPBUnknownFieldTypeVarint;
- storage_.intValue = varint;
- }
- return self;
- }
- - (instancetype)initWithNumber:(int32_t)number fixed32:(uint32_t)fixed32 {
- if ((self = [super init])) {
- number_ = number;
- type_ = GPBUnknownFieldTypeFixed32;
- storage_.intValue = fixed32;
- }
- return self;
- }
- - (instancetype)initWithNumber:(int32_t)number fixed64:(uint64_t)fixed64 {
- if ((self = [super init])) {
- number_ = number;
- type_ = GPBUnknownFieldTypeFixed64;
- storage_.intValue = fixed64;
- }
- return self;
- }
- - (instancetype)initWithNumber:(int32_t)number lengthDelimited:(nonnull NSData *)data {
- if ((self = [super init])) {
- number_ = number;
- type_ = GPBUnknownFieldTypeLengthDelimited;
- storage_.lengthDelimited = [data copy];
- }
- return self;
- }
- - (instancetype)initWithNumber:(int32_t)number group:(nonnull GPBUnknownFields *)group {
- if ((self = [super init])) {
- number_ = number;
- type_ = GPBUnknownFieldTypeGroup;
- // Taking ownership of the group; so retain, not copy.
- storage_.group = [group retain];
- }
- return self;
- }
- - (void)dealloc {
- switch (type_) {
- case GPBUnknownFieldTypeVarint:
- case GPBUnknownFieldTypeFixed32:
- case GPBUnknownFieldTypeFixed64:
- break;
- case GPBUnknownFieldTypeLengthDelimited:
- [storage_.lengthDelimited release];
- break;
- case GPBUnknownFieldTypeGroup:
- [storage_.group release];
- break;
- case GPBUnknownFieldTypeLegacy:
- [storage_.legacy.mutableVarintList release];
- [storage_.legacy.mutableFixed32List release];
- [storage_.legacy.mutableFixed64List release];
- [storage_.legacy.mutableLengthDelimitedList release];
- [storage_.legacy.mutableGroupList release];
- break;
- }
- [super dealloc];
- }
- // Direct access is use for speed, to avoid even internally declaring things
- // read/write, etc. The warning is enabled in the project to ensure code calling
- // protos can turn on -Wdirect-ivar-access without issues.
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdirect-ivar-access"
- - (uint64_t)varint {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeVarint);
- return storage_.intValue;
- }
- - (uint32_t)fixed32 {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeFixed32);
- return (uint32_t)storage_.intValue;
- }
- - (uint64_t)fixed64 {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeFixed64);
- return storage_.intValue;
- }
- - (NSData *)lengthDelimited {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLengthDelimited);
- return storage_.lengthDelimited;
- }
- - (GPBUnknownFields *)group {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeGroup);
- return storage_.group;
- }
- - (GPBUInt64Array *)varintList {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- return storage_.legacy.mutableVarintList;
- }
- - (GPBUInt32Array *)fixed32List {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- return storage_.legacy.mutableFixed32List;
- }
- - (GPBUInt64Array *)fixed64List {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- return storage_.legacy.mutableFixed64List;
- }
- - (NSArray<NSData *> *)lengthDelimitedList {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- return storage_.legacy.mutableLengthDelimitedList;
- }
- - (NSArray<GPBUnknownFieldSet *> *)groupList {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- return storage_.legacy.mutableGroupList;
- }
- - (id)copyWithZone:(NSZone *)zone {
- switch (type_) {
- case GPBUnknownFieldTypeVarint:
- case GPBUnknownFieldTypeFixed32:
- case GPBUnknownFieldTypeFixed64:
- case GPBUnknownFieldTypeLengthDelimited:
- // In these modes, the object isn't mutable, so just return self.
- return [self retain];
- case GPBUnknownFieldTypeGroup: {
- // The `GPBUnknownFields` for the group is mutable, so a new instance of this object and
- // the group is needed.
- GPBUnknownFields *copyGroup = [storage_.group copyWithZone:zone];
- GPBUnknownField *copy = [[GPBUnknownField allocWithZone:zone] initWithNumber:number_
- group:copyGroup];
- [copyGroup release];
- return copy;
- }
- case GPBUnknownFieldTypeLegacy: {
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- GPBUnknownField *result = [[GPBUnknownField allocWithZone:zone] initWithNumber:number_];
- result->storage_.legacy.mutableFixed32List =
- [storage_.legacy.mutableFixed32List copyWithZone:zone];
- result->storage_.legacy.mutableFixed64List =
- [storage_.legacy.mutableFixed64List copyWithZone:zone];
- result->storage_.legacy.mutableLengthDelimitedList =
- [storage_.legacy.mutableLengthDelimitedList mutableCopyWithZone:zone];
- result->storage_.legacy.mutableVarintList =
- [storage_.legacy.mutableVarintList copyWithZone:zone];
- if (storage_.legacy.mutableGroupList.count) {
- result->storage_.legacy.mutableGroupList = [[NSMutableArray allocWithZone:zone]
- initWithCapacity:storage_.legacy.mutableGroupList.count];
- for (GPBUnknownFieldSet *group in storage_.legacy.mutableGroupList) {
- GPBUnknownFieldSet *copied = [group copyWithZone:zone];
- [result->storage_.legacy.mutableGroupList addObject:copied];
- [copied release];
- }
- }
- #pragma clang diagnostic pop
- return result;
- }
- }
- }
- - (BOOL)isEqual:(id)object {
- if (self == object) return YES;
- if (![object isKindOfClass:[GPBUnknownField class]]) return NO;
- GPBUnknownField *field = (GPBUnknownField *)object;
- if (number_ != field->number_) return NO;
- if (type_ != field->type_) return NO;
- switch (type_) {
- case GPBUnknownFieldTypeVarint:
- case GPBUnknownFieldTypeFixed32:
- case GPBUnknownFieldTypeFixed64:
- return storage_.intValue == field->storage_.intValue;
- case GPBUnknownFieldTypeLengthDelimited:
- return [storage_.lengthDelimited isEqual:field->storage_.lengthDelimited];
- case GPBUnknownFieldTypeGroup:
- return [storage_.group isEqual:field->storage_.group];
- case GPBUnknownFieldTypeLegacy: {
- BOOL equalVarint =
- (storage_.legacy.mutableVarintList.count == 0 &&
- field->storage_.legacy.mutableVarintList.count == 0) ||
- [storage_.legacy.mutableVarintList isEqual:field->storage_.legacy.mutableVarintList];
- if (!equalVarint) return NO;
- BOOL equalFixed32 =
- (storage_.legacy.mutableFixed32List.count == 0 &&
- field->storage_.legacy.mutableFixed32List.count == 0) ||
- [storage_.legacy.mutableFixed32List isEqual:field->storage_.legacy.mutableFixed32List];
- if (!equalFixed32) return NO;
- BOOL equalFixed64 =
- (storage_.legacy.mutableFixed64List.count == 0 &&
- field->storage_.legacy.mutableFixed64List.count == 0) ||
- [storage_.legacy.mutableFixed64List isEqual:field->storage_.legacy.mutableFixed64List];
- if (!equalFixed64) return NO;
- BOOL equalLDList = (storage_.legacy.mutableLengthDelimitedList.count == 0 &&
- field->storage_.legacy.mutableLengthDelimitedList.count == 0) ||
- [storage_.legacy.mutableLengthDelimitedList
- isEqual:field->storage_.legacy.mutableLengthDelimitedList];
- if (!equalLDList) return NO;
- BOOL equalGroupList =
- (storage_.legacy.mutableGroupList.count == 0 &&
- field->storage_.legacy.mutableGroupList.count == 0) ||
- [storage_.legacy.mutableGroupList isEqual:field->storage_.legacy.mutableGroupList];
- if (!equalGroupList) return NO;
- return YES;
- }
- }
- }
- - (NSUInteger)hash {
- const int prime = 31;
- NSUInteger result = prime * number_ + type_;
- switch (type_) {
- case GPBUnknownFieldTypeVarint:
- case GPBUnknownFieldTypeFixed32:
- case GPBUnknownFieldTypeFixed64:
- result = prime * result + (NSUInteger)storage_.intValue;
- break;
- case GPBUnknownFieldTypeLengthDelimited:
- result = prime * result + [storage_.lengthDelimited hash];
- break;
- case GPBUnknownFieldTypeGroup:
- result = prime * result + [storage_.group hash];
- case GPBUnknownFieldTypeLegacy:
- result = prime * result + [storage_.legacy.mutableVarintList hash];
- result = prime * result + [storage_.legacy.mutableFixed32List hash];
- result = prime * result + [storage_.legacy.mutableFixed64List hash];
- result = prime * result + [storage_.legacy.mutableLengthDelimitedList hash];
- result = prime * result + [storage_.legacy.mutableGroupList hash];
- break;
- }
- return result;
- }
- - (void)writeToOutput:(GPBCodedOutputStream *)output {
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- NSUInteger count = storage_.legacy.mutableVarintList.count;
- if (count > 0) {
- [output writeUInt64Array:number_ values:storage_.legacy.mutableVarintList tag:0];
- }
- count = storage_.legacy.mutableFixed32List.count;
- if (count > 0) {
- [output writeFixed32Array:number_ values:storage_.legacy.mutableFixed32List tag:0];
- }
- count = storage_.legacy.mutableFixed64List.count;
- if (count > 0) {
- [output writeFixed64Array:number_ values:storage_.legacy.mutableFixed64List tag:0];
- }
- count = storage_.legacy.mutableLengthDelimitedList.count;
- if (count > 0) {
- [output writeBytesArray:number_ values:storage_.legacy.mutableLengthDelimitedList];
- }
- count = storage_.legacy.mutableGroupList.count;
- if (count > 0) {
- [output writeUnknownGroupArray:number_ values:storage_.legacy.mutableGroupList];
- }
- #pragma clang diagnostic pop
- }
- - (size_t)serializedSize {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- __block size_t result = 0;
- int32_t number = number_;
- [storage_.legacy.mutableVarintList
- enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
- result += GPBComputeUInt64Size(number, value);
- }];
- [storage_.legacy.mutableFixed32List
- enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
- result += GPBComputeFixed32Size(number, value);
- }];
- [storage_.legacy.mutableFixed64List
- enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
- result += GPBComputeFixed64Size(number, value);
- }];
- for (NSData *data in storage_.legacy.mutableLengthDelimitedList) {
- result += GPBComputeBytesSize(number, data);
- }
- for (GPBUnknownFieldSet *set in storage_.legacy.mutableGroupList) {
- result += GPBComputeUnknownGroupSize(number, set);
- }
- #pragma clang diagnostic pop
- return result;
- }
- - (void)writeAsMessageSetExtensionToOutput:(GPBCodedOutputStream *)output {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- for (NSData *data in storage_.legacy.mutableLengthDelimitedList) {
- [output writeRawMessageSetExtension:number_ value:data];
- }
- }
- - (size_t)serializedSizeAsMessageSetExtension {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- size_t result = 0;
- for (NSData *data in storage_.legacy.mutableLengthDelimitedList) {
- result += GPBComputeRawMessageSetExtensionSize(number_, data);
- }
- return result;
- }
- - (NSString *)description {
- NSMutableString *description =
- [NSMutableString stringWithFormat:@"<%@ %p>: Field: %d", [self class], self, number_];
- switch (type_) {
- case GPBUnknownFieldTypeVarint:
- [description appendFormat:@" varint: %llu", storage_.intValue];
- break;
- case GPBUnknownFieldTypeFixed32:
- [description appendFormat:@" fixed32: %u", (uint32_t)storage_.intValue];
- break;
- case GPBUnknownFieldTypeFixed64:
- [description appendFormat:@" fixed64: %llu", storage_.intValue];
- break;
- case GPBUnknownFieldTypeLengthDelimited:
- [description appendFormat:@" fixed64: %@", storage_.lengthDelimited];
- break;
- case GPBUnknownFieldTypeGroup:
- [description appendFormat:@" group: %@", storage_.group];
- break;
- case GPBUnknownFieldTypeLegacy:
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [description appendString:@" {\n"];
- [storage_.legacy.mutableVarintList
- enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
- [description appendFormat:@"\t%llu\n", value];
- }];
- [storage_.legacy.mutableFixed32List
- enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
- [description appendFormat:@"\t%u\n", value];
- }];
- [storage_.legacy.mutableFixed64List
- enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
- [description appendFormat:@"\t%llu\n", value];
- }];
- for (NSData *data in storage_.legacy.mutableLengthDelimitedList) {
- [description appendFormat:@"\t%@\n", data];
- }
- for (GPBUnknownFieldSet *set in storage_.legacy.mutableGroupList) {
- [description appendFormat:@"\t%@\n", set];
- }
- [description appendString:@"}"];
- #pragma clang diagnostic pop
- break;
- }
- return description;
- }
- - (void)mergeFromField:(GPBUnknownField *)other {
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- GPBUInt64Array *otherVarintList = other.varintList;
- if (otherVarintList.count > 0) {
- if (storage_.legacy.mutableVarintList == nil) {
- storage_.legacy.mutableVarintList = [otherVarintList copy];
- } else {
- [storage_.legacy.mutableVarintList addValuesFromArray:otherVarintList];
- }
- }
- GPBUInt32Array *otherFixed32List = other.fixed32List;
- if (otherFixed32List.count > 0) {
- if (storage_.legacy.mutableFixed32List == nil) {
- storage_.legacy.mutableFixed32List = [otherFixed32List copy];
- } else {
- [storage_.legacy.mutableFixed32List addValuesFromArray:otherFixed32List];
- }
- }
- GPBUInt64Array *otherFixed64List = other.fixed64List;
- if (otherFixed64List.count > 0) {
- if (storage_.legacy.mutableFixed64List == nil) {
- storage_.legacy.mutableFixed64List = [otherFixed64List copy];
- } else {
- [storage_.legacy.mutableFixed64List addValuesFromArray:otherFixed64List];
- }
- }
- NSArray *otherLengthDelimitedList = other.lengthDelimitedList;
- if (otherLengthDelimitedList.count > 0) {
- if (storage_.legacy.mutableLengthDelimitedList == nil) {
- storage_.legacy.mutableLengthDelimitedList = [otherLengthDelimitedList mutableCopy];
- } else {
- [storage_.legacy.mutableLengthDelimitedList addObjectsFromArray:otherLengthDelimitedList];
- }
- }
- NSArray *otherGroupList = other.groupList;
- if (otherGroupList.count > 0) {
- if (storage_.legacy.mutableGroupList == nil) {
- storage_.legacy.mutableGroupList =
- [[NSMutableArray alloc] initWithCapacity:otherGroupList.count];
- }
- // Make our own mutable copies.
- for (GPBUnknownFieldSet *group in otherGroupList) {
- GPBUnknownFieldSet *copied = [group copy];
- [storage_.legacy.mutableGroupList addObject:copied];
- [copied release];
- }
- }
- #pragma clang diagnostic pop
- }
- - (void)addVarint:(uint64_t)value {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- if (storage_.legacy.mutableVarintList == nil) {
- storage_.legacy.mutableVarintList = [[GPBUInt64Array alloc] initWithValues:&value count:1];
- } else {
- [storage_.legacy.mutableVarintList addValue:value];
- }
- }
- - (void)addFixed32:(uint32_t)value {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- if (storage_.legacy.mutableFixed32List == nil) {
- storage_.legacy.mutableFixed32List = [[GPBUInt32Array alloc] initWithValues:&value count:1];
- } else {
- [storage_.legacy.mutableFixed32List addValue:value];
- }
- }
- - (void)addFixed64:(uint64_t)value {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- if (storage_.legacy.mutableFixed64List == nil) {
- storage_.legacy.mutableFixed64List = [[GPBUInt64Array alloc] initWithValues:&value count:1];
- } else {
- [storage_.legacy.mutableFixed64List addValue:value];
- }
- }
- - (void)addLengthDelimited:(NSData *)value {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- if (storage_.legacy.mutableLengthDelimitedList == nil) {
- storage_.legacy.mutableLengthDelimitedList = [[NSMutableArray alloc] initWithObjects:&value
- count:1];
- } else {
- [storage_.legacy.mutableLengthDelimitedList addObject:value];
- }
- }
- - (void)addGroup:(GPBUnknownFieldSet *)value {
- ASSERT_FIELD_TYPE(GPBUnknownFieldTypeLegacy);
- if (storage_.legacy.mutableGroupList == nil) {
- storage_.legacy.mutableGroupList = [[NSMutableArray alloc] initWithObjects:&value count:1];
- } else {
- [storage_.legacy.mutableGroupList addObject:value];
- }
- }
- #pragma clang diagnostic pop
- @end
|