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_MINI_TABLE_EXTENSION_REGISTRY_H_ 29 #define UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ 30 31 #include "upb/mem/arena.h" 32 #include "upb/mini_table/types.h" 33 34 // Must be last. 35 #include "upb/port/def.inc" 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 /* Extension registry: a dynamic data structure that stores a map of: 42 * (upb_MiniTable, number) -> extension info 43 * 44 * upb_decode() uses upb_ExtensionRegistry to look up extensions while parsing 45 * binary format. 46 * 47 * upb_ExtensionRegistry is part of the mini-table (msglayout) family of 48 * objects. Like all mini-table objects, it is suitable for reflection-less 49 * builds that do not want to expose names into the binary. 50 * 51 * Unlike most mini-table types, upb_ExtensionRegistry requires dynamic memory 52 * allocation and dynamic initialization: 53 * * If reflection is being used, then upb_DefPool will construct an appropriate 54 * upb_ExtensionRegistry automatically. 55 * * For a mini-table only build, the user must manually construct the 56 * upb_ExtensionRegistry and populate it with all of the extensions the user 57 * cares about. 58 * * A third alternative is to manually unpack relevant extensions after the 59 * main parse is complete, similar to how Any works. This is perhaps the 60 * nicest solution from the perspective of reducing dependencies, avoiding 61 * dynamic memory allocation, and avoiding the need to parse uninteresting 62 * extensions. The downsides are: 63 * (1) parse errors are not caught during the main parse 64 * (2) the CPU hit of parsing comes during access, which could cause an 65 * undesirable stutter in application performance. 66 * 67 * Users cannot directly get or put into this map. Users can only add the 68 * extensions from a generated module and pass the extension registry to the 69 * binary decoder. 70 * 71 * A upb_DefPool provides a upb_ExtensionRegistry, so any users who use 72 * reflection do not need to populate a upb_ExtensionRegistry directly. 73 */ 74 75 typedef struct upb_ExtensionRegistry upb_ExtensionRegistry; 76 77 // Creates a upb_ExtensionRegistry in the given arena. 78 // The arena must outlive any use of the extreg. 79 UPB_API upb_ExtensionRegistry* upb_ExtensionRegistry_New(upb_Arena* arena); 80 81 UPB_API bool upb_ExtensionRegistry_Add(upb_ExtensionRegistry* r, 82 const upb_MiniTableExtension* e); 83 84 // Adds the given extension info for the array |e| of size |count| into the 85 // registry. If there are any errors, the entire array is backed out. 86 // The extensions must outlive the registry. 87 // Possible errors include OOM or an extension number that already exists. 88 // TODO(salo): There is currently no way to know the exact reason for failure. 89 bool upb_ExtensionRegistry_AddArray(upb_ExtensionRegistry* r, 90 const upb_MiniTableExtension** e, 91 size_t count); 92 93 // Looks up the extension (if any) defined for message type |t| and field 94 // number |num|. Returns the extension if found, otherwise NULL. 95 UPB_API const upb_MiniTableExtension* upb_ExtensionRegistry_Lookup( 96 const upb_ExtensionRegistry* r, const upb_MiniTable* t, uint32_t num); 97 98 #ifdef __cplusplus 99 } /* extern "C" */ 100 #endif 101 102 #include "upb/port/undef.inc" 103 104 #endif /* UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ */ 105