WPILibC++ 2027.0.0-alpha-3
Loading...
Searching...
No Matches
message.h
Go to the documentation of this file.
1// Protocol Buffers - Google's data interchange format
2// Copyright 2023 Google LLC. All rights reserved.
3//
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file or at
6// https://developers.google.com/open-source/licenses/bsd
7
8// Public APIs for message operations that do not depend on the schema.
9//
10// MiniTable-based accessors live in accessors.h.
11
12#ifndef UPB_MESSAGE_MESSAGE_H_
13#define UPB_MESSAGE_MESSAGE_H_
14
15#include <stddef.h>
16#include <stdint.h>
17
19#include "upb/mem/arena.h"
20#include "upb/message/array.h"
26
27// Must be last.
28#include "upb/port/def.inc"
29
30typedef struct upb_Message upb_Message;
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36// Creates a new message with the given mini_table on the given arena.
38
39//
40// Unknown data may be stored non-contiguously. Each segment stores a block of
41// unknown fields. To iterate over segments:
42//
43// uintptr_t iter = kUpb_Message_UnknownBegin;
44// upb_StringView data;
45// while (upb_Message_NextUnknown(msg, &data, &iter)) {
46// // Use data
47// }
48// Iterates in the order unknown fields were parsed.
49
50#define kUpb_Message_UnknownBegin 0
51#define kUpb_Message_ExtensionBegin 0
52
54 upb_StringView* data, uintptr_t* iter);
55
57
58// Removes a segment of unknown data from the message, advancing to the next
59// segment. Returns false if the removed segment was at the end of the last
60// chunk.
61//
62// This must be done while iterating:
63//
64// uintptr_t iter = kUpb_Message_UnknownBegin;
65// upb_StringView data;
66// // Iterate chunks
67// while (upb_Message_NextUnknown(msg, &data, &iter)) {
68// // Iterate within a chunk, deleting ranges
69// while (ShouldDeleteSubSegment(&data)) {
70// // Data now points to the region to be deleted
71// switch (upb_Message_DeleteUnknown(msg, &data, &iter)) {
72// case kUpb_Message_DeleteUnknown_DeletedLast: return ok;
73// case kUpb_Message_DeleteUnknown_IterUpdated: break;
74// // If DeleteUnknown returned kUpb_Message_DeleteUnknown_IterUpdated,
75// // then data now points to the remaining unknown fields after the
76// // region that was just deleted.
77// case kUpb_Message_DeleteUnknown_AllocFail: return err;
78// }
79// }
80// }
81//
82// The range given in `data` must be contained inside the most recently
83// returned region.
90 upb_StringView* data,
91 uintptr_t* iter,
92 upb_Arena* arena);
93
94// Returns the number of extensions present in this message.
96
97// Iterates extensions in wire order
99 const upb_MiniTableExtension** out_e,
100 upb_MessageValue* out_v,
101 uintptr_t* iter);
102
103// Iterates extensions in reverse wire order
105 const struct upb_Message* msg, const upb_MiniTableExtension** out_e,
106 upb_MessageValue* out_v, uintptr_t* iter);
107
108// Mark a message and all of its descendents as frozen/immutable.
110
111// Returns whether a message has been frozen.
113
114#ifdef UPB_TRACING_ENABLED
115UPB_API void upb_Message_LogNewMessage(const upb_MiniTable* m,
116 const upb_Arena* arena);
117
118UPB_API void upb_Message_SetNewMessageTraceHandler(
119 void (*handler)(const upb_MiniTable* m, const upb_Arena* arena));
120#endif // UPB_TRACING_ENABLED
121
122#ifdef __cplusplus
123} /* extern "C" */
124#endif
125
126#include "upb/port/undef.inc"
127
128#endif /* UPB_MESSAGE_MESSAGE_H_ */
#define UPB_API_INLINE
Definition def.inc:163
#define UPB_PRIVATE(x)
Definition def.inc:393
#define UPB_INLINE
Definition def.inc:144
#define UPB_API
Definition def.inc:162
UPB_INLINE bool upb_Message_HasUnknown(const struct upb_Message *msg)
Definition message.h:227
UPB_INLINE bool upb_Message_NextExtension(const struct upb_Message *msg, const upb_MiniTableExtension **out_e, upb_MessageValue *out_v, uintptr_t *iter)
Definition message.h:233
UPB_INLINE bool UPB_PRIVATE _upb_Message_NextExtensionReverse(const struct upb_Message *msg, const upb_MiniTableExtension **out_e, upb_MessageValue *out_v, uintptr_t *iter)
Definition message.h:260
UPB_INLINE bool upb_Message_NextUnknown(const struct upb_Message *msg, upb_StringView *data, uintptr_t *iter)
Definition message.h:207
upb_Message_DeleteUnknownStatus
Definition message.h:84
@ kUpb_DeleteUnknown_DeletedLast
Definition message.h:85
@ kUpb_DeleteUnknown_AllocFail
Definition message.h:87
@ kUpb_DeleteUnknown_IterUpdated
Definition message.h:86
upb_Message_DeleteUnknownStatus upb_Message_DeleteUnknown(upb_Message *msg, upb_StringView *data, uintptr_t *iter, upb_Arena *arena)
size_t upb_Message_ExtensionCount(const upb_Message *msg)
UPB_API void upb_Message_Freeze(upb_Message *msg, const upb_MiniTable *m)
UPB_API upb_Message * upb_Message_New(const upb_MiniTable *m, upb_Arena *arena)
Definition arena.h:29
Definition types.h:18
Definition extension.h:21
Definition message.h:54
Definition string_view.h:23
Definition value.h:27
UPB_API_INLINE bool upb_Message_IsFrozen(const struct upb_Message *msg)
Definition types.h:34