1 /* 2 * Copyright (c) 2009-2021, Google LLC 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * * Neither the name of Google LLC nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef UPB_MESSAGE_EXTENSION_INTERNAL_H_ 29 #define UPB_MESSAGE_EXTENSION_INTERNAL_H_ 30 31 #include "upb/base/descriptor_constants.h" 32 #include "upb/base/string_view.h" 33 #include "upb/mem/arena.h" 34 #include "upb/message/message.h" 35 #include "upb/mini_table/extension_internal.h" 36 37 // Must be last. 38 #include "upb/port/def.inc" 39 40 // The internal representation of an extension is self-describing: it contains 41 // enough information that we can serialize it to binary format without needing 42 // to look it up in a upb_ExtensionRegistry. 43 // 44 // This representation allocates 16 bytes to data on 64-bit platforms. 45 // This is rather wasteful for scalars (in the extreme case of bool, 46 // it wastes 15 bytes). We accept this because we expect messages to be 47 // the most common extension type. 48 typedef struct { 49 const upb_MiniTableExtension* ext; 50 union { 51 upb_StringView str; 52 void* ptr; 53 char scalar_data[8]; 54 } data; 55 } upb_Message_Extension; 56 57 #ifdef __cplusplus 58 extern "C" { 59 #endif 60 61 // Adds the given extension data to the given message. 62 // |ext| is copied into the message instance. 63 // This logically replaces any previously-added extension with this number. 64 upb_Message_Extension* _upb_Message_GetOrCreateExtension( 65 upb_Message* msg, const upb_MiniTableExtension* ext, upb_Arena* arena); 66 67 // Returns an array of extensions for this message. 68 // Note: the array is ordered in reverse relative to the order of creation. 69 const upb_Message_Extension* _upb_Message_Getexts(const upb_Message* msg, 70 size_t* count); 71 72 // Returns an extension for the given field number, or NULL if no extension 73 // exists for this field number. 74 const upb_Message_Extension* _upb_Message_Getext( 75 const upb_Message* msg, const upb_MiniTableExtension* ext); 76 77 #ifdef __cplusplus 78 } /* extern "C" */ 79 #endif 80 81 #include "upb/port/undef.inc" 82 83 #endif /* UPB_MESSAGE_EXTENSION_INTERNAL_H_ */ 84