1dcc329427
- Style fixups in the code. - map<> serialization fixes and more tests. - Autocreation of map<> fields (to match repeated fields). - @@protoc_insertion_point(global_scope|imports). - Fixup proto2 syntax extension support. - Move all startup code to +initialize so it happen on class usage and not app startup. - Have generated headers use forward declarations and move imports into generated code, reduces what is need at compile time to speed up compiled and avoid pointless rippling of rebuilds.
127 lines
5.4 KiB
Objective-C
127 lines
5.4 KiB
Objective-C
// Protocol Buffers - Google's data interchange format
|
|
// Copyright 2008 Google Inc. All rights reserved.
|
|
// https://developers.google.com/protocol-buffers/
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
// in the documentation and/or other materials provided with the
|
|
// distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
// This header is private to the ProtobolBuffers library and must NOT be
|
|
// included by any sources outside this library. The contents of this file are
|
|
// subject to change at any time without notice.
|
|
|
|
#import "GPBMessage.h"
|
|
|
|
#import <libkern/OSAtomic.h>
|
|
|
|
#import "GPBBootstrap.h"
|
|
|
|
typedef struct GPBMessage_Storage {
|
|
uint32_t _has_storage_[0];
|
|
} GPBMessage_Storage;
|
|
|
|
typedef struct GPBMessage_Storage *GPBMessage_StoragePtr;
|
|
|
|
@interface GPBMessage () {
|
|
@package
|
|
// NOTE: Because of the +allocWithZone code using NSAllocateObject(),
|
|
// this structure should ideally always be kept pointer aligned where the
|
|
// real storage starts is also pointer aligned. The compiler/runtime already
|
|
// do this, but it may not be documented.
|
|
|
|
// A pointer to the actual fields of the subclasses. The actual structure
|
|
// pointed to by this pointer will depend on the subclass.
|
|
// All of the actual structures will start the same as
|
|
// GPBMessage_Storage with _has_storage__ as the first field.
|
|
// Kept public because static functions need to access it.
|
|
GPBMessage_StoragePtr messageStorage_;
|
|
|
|
// A lock to provide mutual exclusion from internal data that can be modified
|
|
// by *read* operations such as getters (autocreation of message fields and
|
|
// message extensions, not setting of values). Used to guarantee thread safety
|
|
// for concurrent reads on the message.
|
|
OSSpinLock readOnlyMutex_;
|
|
}
|
|
|
|
// Gets an extension value without autocreating the result if not found. (i.e.
|
|
// returns nil if the extension is not set)
|
|
- (id)getExistingExtension:(GPBExtensionField *)extension;
|
|
|
|
// Returns an array of GPBExtensionField* for all the extensions currently
|
|
// in use on the message. They are sorted by field number.
|
|
- (NSArray *)sortedExtensionsInUse;
|
|
|
|
// Parses a message of this type from the input and merges it with this
|
|
// message.
|
|
//
|
|
// Warning: This does not verify that all required fields are present in
|
|
// the input message.
|
|
// Note: The caller should call
|
|
// -[CodedInputStream checkLastTagWas:] after calling this to
|
|
// verify that the last tag seen was the appropriate end-group tag,
|
|
// or zero for EOF.
|
|
// NOTE: This will throw if there is an error while parsing.
|
|
- (void)mergeFromCodedInputStream:(GPBCodedInputStream *)input
|
|
extensionRegistry:(GPBExtensionRegistry *)extensionRegistry;
|
|
|
|
// Parses the next delimited message of this type from the input and merges it
|
|
// with this message.
|
|
- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
|
|
extensionRegistry:
|
|
(GPBExtensionRegistry *)extensionRegistry;
|
|
|
|
- (void)addUnknownMapEntry:(int32_t)fieldNum value:(NSData *)data;
|
|
|
|
@end
|
|
|
|
CF_EXTERN_C_BEGIN
|
|
|
|
// Returns a new instance that was automatically created by |autocreator| for
|
|
// its field |field|.
|
|
GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass,
|
|
GPBMessage *autocreator,
|
|
GPBFieldDescriptor *field)
|
|
__attribute__((ns_returns_retained));
|
|
|
|
// Returns whether |message| autocreated this message. This is NO if the message
|
|
// was not autocreated by |message| or if it has been mutated since
|
|
// autocreation.
|
|
BOOL GPBWasMessageAutocreatedBy(GPBMessage *message, GPBMessage *parent);
|
|
|
|
// Call this when you mutate a message. It will cause the message to become
|
|
// visible to its autocreator.
|
|
void GPBBecomeVisibleToAutocreator(GPBMessage *self);
|
|
|
|
// Call this when an array/dictionary is mutated so the parent message that
|
|
// autocreated it can react.
|
|
void GPBAutocreatedArrayModified(GPBMessage *self, id array);
|
|
void GPBAutocreatedDictionaryModified(GPBMessage *self, id dictionary);
|
|
|
|
// Clear the autocreator, if any. Asserts if the autocreator still has an
|
|
// autocreated reference to this message.
|
|
void GPBClearMessageAutocreator(GPBMessage *self);
|
|
|
|
CF_EXTERN_C_END
|