xref: /aosp_15_r20/external/protobuf/objectivec/GPBMessage_PackagePrivate.h (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format
2*1b3f573fSAndroid Build Coastguard Worker // Copyright 2008 Google Inc.  All rights reserved.
3*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/
4*1b3f573fSAndroid Build Coastguard Worker //
5*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
6*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
7*1b3f573fSAndroid Build Coastguard Worker // met:
8*1b3f573fSAndroid Build Coastguard Worker //
9*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
10*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
11*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
13*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
14*1b3f573fSAndroid Build Coastguard Worker // distribution.
15*1b3f573fSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
16*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
17*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission.
18*1b3f573fSAndroid Build Coastguard Worker //
19*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*1b3f573fSAndroid Build Coastguard Worker 
31*1b3f573fSAndroid Build Coastguard Worker // This header is private to the ProtobolBuffers library and must NOT be
32*1b3f573fSAndroid Build Coastguard Worker // included by any sources outside this library. The contents of this file are
33*1b3f573fSAndroid Build Coastguard Worker // subject to change at any time without notice.
34*1b3f573fSAndroid Build Coastguard Worker 
35*1b3f573fSAndroid Build Coastguard Worker #import "GPBMessage.h"
36*1b3f573fSAndroid Build Coastguard Worker 
37*1b3f573fSAndroid Build Coastguard Worker // TODO: Remove this import. Older generated code use the OSAtomic* apis,
38*1b3f573fSAndroid Build Coastguard Worker // so anyone that hasn't regenerated says building by having this. After
39*1b3f573fSAndroid Build Coastguard Worker // enough time has passed, this likely can be removed as folks should have
40*1b3f573fSAndroid Build Coastguard Worker // regenerated.
41*1b3f573fSAndroid Build Coastguard Worker #import <libkern/OSAtomic.h>
42*1b3f573fSAndroid Build Coastguard Worker 
43*1b3f573fSAndroid Build Coastguard Worker #import "GPBBootstrap.h"
44*1b3f573fSAndroid Build Coastguard Worker 
45*1b3f573fSAndroid Build Coastguard Worker typedef struct GPBMessage_Storage {
46*1b3f573fSAndroid Build Coastguard Worker   uint32_t _has_storage_[0];
47*1b3f573fSAndroid Build Coastguard Worker } GPBMessage_Storage;
48*1b3f573fSAndroid Build Coastguard Worker 
49*1b3f573fSAndroid Build Coastguard Worker typedef struct GPBMessage_Storage *GPBMessage_StoragePtr;
50*1b3f573fSAndroid Build Coastguard Worker 
GPBMessage()51*1b3f573fSAndroid Build Coastguard Worker @interface GPBMessage () {
52*1b3f573fSAndroid Build Coastguard Worker  @package
53*1b3f573fSAndroid Build Coastguard Worker   // NOTE: Because of the +allocWithZone code using NSAllocateObject(),
54*1b3f573fSAndroid Build Coastguard Worker   // this structure should ideally always be kept pointer aligned where the
55*1b3f573fSAndroid Build Coastguard Worker   // real storage starts is also pointer aligned. The compiler/runtime already
56*1b3f573fSAndroid Build Coastguard Worker   // do this, but it may not be documented.
57*1b3f573fSAndroid Build Coastguard Worker 
58*1b3f573fSAndroid Build Coastguard Worker   // A pointer to the actual fields of the subclasses. The actual structure
59*1b3f573fSAndroid Build Coastguard Worker   // pointed to by this pointer will depend on the subclass.
60*1b3f573fSAndroid Build Coastguard Worker   // All of the actual structures will start the same as
61*1b3f573fSAndroid Build Coastguard Worker   // GPBMessage_Storage with _has_storage__ as the first field.
62*1b3f573fSAndroid Build Coastguard Worker   // Kept public because static functions need to access it.
63*1b3f573fSAndroid Build Coastguard Worker   GPBMessage_StoragePtr messageStorage_;
64*1b3f573fSAndroid Build Coastguard Worker }
65*1b3f573fSAndroid Build Coastguard Worker 
66*1b3f573fSAndroid Build Coastguard Worker // Gets an extension value without autocreating the result if not found. (i.e.
67*1b3f573fSAndroid Build Coastguard Worker // returns nil if the extension is not set)
68*1b3f573fSAndroid Build Coastguard Worker - (id)getExistingExtension:(GPBExtensionDescriptor *)extension;
69*1b3f573fSAndroid Build Coastguard Worker 
70*1b3f573fSAndroid Build Coastguard Worker // Parses a message of this type from the input and merges it with this
71*1b3f573fSAndroid Build Coastguard Worker // message.
72*1b3f573fSAndroid Build Coastguard Worker //
73*1b3f573fSAndroid Build Coastguard Worker // Warning:  This does not verify that all required fields are present in
74*1b3f573fSAndroid Build Coastguard Worker // the input message.
75*1b3f573fSAndroid Build Coastguard Worker // Note:  The caller should call
76*1b3f573fSAndroid Build Coastguard Worker // -[CodedInputStream checkLastTagWas:] after calling this to
77*1b3f573fSAndroid Build Coastguard Worker // verify that the last tag seen was the appropriate end-group tag,
78*1b3f573fSAndroid Build Coastguard Worker // or zero for EOF.
79*1b3f573fSAndroid Build Coastguard Worker // NOTE: This will throw if there is an error while parsing.
80*1b3f573fSAndroid Build Coastguard Worker - (void)mergeFromCodedInputStream:(GPBCodedInputStream *)input
81*1b3f573fSAndroid Build Coastguard Worker                 extensionRegistry:(GPBExtensionRegistry *)extensionRegistry;
82*1b3f573fSAndroid Build Coastguard Worker 
83*1b3f573fSAndroid Build Coastguard Worker // Parses the next delimited message of this type from the input and merges it
84*1b3f573fSAndroid Build Coastguard Worker // with this message.
85*1b3f573fSAndroid Build Coastguard Worker - (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
86*1b3f573fSAndroid Build Coastguard Worker                          extensionRegistry:
87*1b3f573fSAndroid Build Coastguard Worker                              (GPBExtensionRegistry *)extensionRegistry;
88*1b3f573fSAndroid Build Coastguard Worker 
89*1b3f573fSAndroid Build Coastguard Worker - (void)addUnknownMapEntry:(int32_t)fieldNum value:(NSData *)data;
90*1b3f573fSAndroid Build Coastguard Worker 
91*1b3f573fSAndroid Build Coastguard Worker @end
92*1b3f573fSAndroid Build Coastguard Worker 
93*1b3f573fSAndroid Build Coastguard Worker CF_EXTERN_C_BEGIN
94*1b3f573fSAndroid Build Coastguard Worker 
95*1b3f573fSAndroid Build Coastguard Worker 
96*1b3f573fSAndroid Build Coastguard Worker // Call this before using the readOnlySemaphore_. This ensures it is created only once.
97*1b3f573fSAndroid Build Coastguard Worker void GPBPrepareReadOnlySemaphore(GPBMessage *self);
98*1b3f573fSAndroid Build Coastguard Worker 
99*1b3f573fSAndroid Build Coastguard Worker // Returns a new instance that was automatically created by |autocreator| for
100*1b3f573fSAndroid Build Coastguard Worker // its field |field|.
101*1b3f573fSAndroid Build Coastguard Worker GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass,
102*1b3f573fSAndroid Build Coastguard Worker                                             GPBMessage *autocreator,
103*1b3f573fSAndroid Build Coastguard Worker                                             GPBFieldDescriptor *field)
104*1b3f573fSAndroid Build Coastguard Worker     __attribute__((ns_returns_retained));
105*1b3f573fSAndroid Build Coastguard Worker 
106*1b3f573fSAndroid Build Coastguard Worker // Returns whether |message| autocreated this message. This is NO if the message
107*1b3f573fSAndroid Build Coastguard Worker // was not autocreated by |message| or if it has been mutated since
108*1b3f573fSAndroid Build Coastguard Worker // autocreation.
109*1b3f573fSAndroid Build Coastguard Worker BOOL GPBWasMessageAutocreatedBy(GPBMessage *message, GPBMessage *parent);
110*1b3f573fSAndroid Build Coastguard Worker 
111*1b3f573fSAndroid Build Coastguard Worker // Call this when you mutate a message. It will cause the message to become
112*1b3f573fSAndroid Build Coastguard Worker // visible to its autocreator.
113*1b3f573fSAndroid Build Coastguard Worker void GPBBecomeVisibleToAutocreator(GPBMessage *self);
114*1b3f573fSAndroid Build Coastguard Worker 
115*1b3f573fSAndroid Build Coastguard Worker // Call this when an array/dictionary is mutated so the parent message that
116*1b3f573fSAndroid Build Coastguard Worker // autocreated it can react.
117*1b3f573fSAndroid Build Coastguard Worker void GPBAutocreatedArrayModified(GPBMessage *self, id array);
118*1b3f573fSAndroid Build Coastguard Worker void GPBAutocreatedDictionaryModified(GPBMessage *self, id dictionary);
119*1b3f573fSAndroid Build Coastguard Worker 
120*1b3f573fSAndroid Build Coastguard Worker // Clear the autocreator, if any. Asserts if the autocreator still has an
121*1b3f573fSAndroid Build Coastguard Worker // autocreated reference to this message.
122*1b3f573fSAndroid Build Coastguard Worker void GPBClearMessageAutocreator(GPBMessage *self);
123*1b3f573fSAndroid Build Coastguard Worker 
124*1b3f573fSAndroid Build Coastguard Worker CF_EXTERN_C_END
125