rapidyaml  0.7.2
parse and emit YAML, and do it fast
parse.hpp
Go to the documentation of this file.
1 #ifndef _C4_YML_PARSE_HPP_
2 #define _C4_YML_PARSE_HPP_
3 
4 #ifndef _C4_YML_COMMON_HPP_
5 #include "c4/yml/common.hpp"
6 #endif
7 
8 namespace c4 {
9 namespace yml {
10 
11 class Tree;
12 class NodeRef;
13 template<class EventHandler> class ParseEngine;
14 struct EventHandlerTree;
16 
17 
18 /** @addtogroup doc_parse
19  * @{ */
20 
21 /** This is the main ryml parser, where the parser events are handled
22  * to create a ryml tree.
23  *
24  * @warning Because the ryml @ref Tree does not accept containers as
25  * keys, this class cannot successfully parse YAML source with this
26  * feature. See @ref ParseEngine for more details.
27  *
28  * @see ParserOptions
29  * @see ParseEngine
30  * @see EventHandlerTree
31  * */
32 using Parser = RYML_EXPORT ParseEngine<EventHandlerTree>;
33 
34 
35 //-----------------------------------------------------------------------------
36 
37 /** @defgroup doc_parse_in_place__with_existing_parser Parse in place with existing parser
38  *
39  * @brief parse a mutable YAML source buffer. Scalars requiring
40  * filtering are mutated in place (except in the rare cases where the
41  * filtered scalar is longer than the original scalar, or where
42  * filtering was disabled before the call). These overloads accept an
43  * existing parser object, and provide the opportunity to use special
44  * parser options.
45  *
46  * @see ParserOptions
47  *
48  * @{
49  */
50 
51 // this is vertically aligned to highlight the parameter differences.
52 
53 RYML_EXPORT void parse_in_place(Parser *parser, csubstr filename, substr yaml, Tree *t, id_type node_id); /**< (1) parse YAML into an existing tree node.
54  *
55  * The filename will be used in any error messages
56  * arising during the parse. The callbacks in the
57  * tree are kept, and used to allocate
58  * the tree members, if any allocation is required. */
59 RYML_EXPORT void parse_in_place(Parser *parser, substr yaml, Tree *t, id_type node_id); /**< (2) like (1) but no filename will be reported */
60 RYML_EXPORT void parse_in_place(Parser *parser, csubstr filename, substr yaml, Tree *t ); /**< (3) parse YAML into an existing tree, into its root node.
61  *
62  * The filename will be used in any error messages
63  * arising during the parse. The callbacks in the
64  * tree are kept, and used to allocate
65  * the tree members, if any allocation is required. */
66 RYML_EXPORT void parse_in_place(Parser *parser, substr yaml, Tree *t ); /**< (4) like (3) but no filename will be reported */
67 RYML_EXPORT void parse_in_place(Parser *parser, csubstr filename, substr yaml, NodeRef node ); /**< (5) like (1) but the node is given as a NodeRef */
68 RYML_EXPORT void parse_in_place(Parser *parser, substr yaml, NodeRef node ); /**< (6) like (5) but no filename will be reported */
69 RYML_EXPORT Tree parse_in_place(Parser *parser, csubstr filename, substr yaml ); /**< (7) create a new tree, and parse YAML into its root node.
70  *
71  * The filename will be used in any error messages
72  * arising during the parse. The tree is created with
73  * the callbacks currently in the parser.
74  */
75 RYML_EXPORT Tree parse_in_place(Parser *parser, substr yaml ); /**< (8) like (7) but no filename will be reported */
76 
77 
78 // this is vertically aligned to highlight the parameter differences.
79 RYML_EXPORT void parse_json_in_place(Parser *parser, csubstr filename, substr json, Tree *t, id_type node_id); ///< (1) parse JSON into an existing tree node. The filename will be used in any error messages arising during the parse.
80 RYML_EXPORT void parse_json_in_place(Parser *parser, substr json, Tree *t, id_type node_id); ///< (2) like (1) but no filename will be reported
81 RYML_EXPORT void parse_json_in_place(Parser *parser, csubstr filename, substr json, Tree *t ); ///< (3) parse JSON into an existing tree, into its root node.
82 RYML_EXPORT void parse_json_in_place(Parser *parser, substr json, Tree *t ); ///< (4) like (3) but no filename will be reported
83 RYML_EXPORT void parse_json_in_place(Parser *parser, csubstr filename, substr json, NodeRef node ); ///< (5) like (1) but the node is given as a NodeRef
84 RYML_EXPORT void parse_json_in_place(Parser *parser, substr json, NodeRef node ); ///< (6) like (5) but no filename will be reported
85 RYML_EXPORT Tree parse_json_in_place(Parser *parser, csubstr filename, substr json ); ///< (7) create a new tree, and parse JSON into its root node.
86 RYML_EXPORT Tree parse_json_in_place(Parser *parser, substr json ); ///< (8) like (7) but no filename will be reported
87 
88 /** @} */
89 
90 
91 //-----------------------------------------------------------------------------
92 
93 /** @defgroup doc_parse_in_place___with_temporary_parser Parse in place with temporary parser
94  *
95  * @brief parse a mutable YAML source buffer. Scalars requiring
96  * filtering are mutated in place (except in the rare cases where the
97  * filtered scalar is longer than the original scalar).
98  *
99  * @note These freestanding functions use a temporary parser object,
100  * and are convenience functions to enable the user to easily parse
101  * YAML without the need to explicitly instantiate a parser and event
102  * handler. Note that some properties (notably node locations in the
103  * original source code) are only available through the parser
104  * class. If you need access to any of these properties, use
105  * the appropriate overload from @ref doc_parse_in_place__with_existing_parser
106  *
107  * @{
108  */
109 
110 // this is vertically aligned to highlight the parameter differences.
111 RYML_EXPORT void parse_in_place(csubstr filename, substr yaml, Tree *t, id_type node_id); ///< (1) parse YAML into an existing tree node. The filename will be used in any error messages arising during the parse.
112 RYML_EXPORT void parse_in_place( substr yaml, Tree *t, id_type node_id); ///< (2) like (1) but no filename will be reported
113 RYML_EXPORT void parse_in_place(csubstr filename, substr yaml, Tree *t ); ///< (3) parse YAML into an existing tree, into its root node.
114 RYML_EXPORT void parse_in_place( substr yaml, Tree *t ); ///< (4) like (3) but no filename will be reported
115 RYML_EXPORT void parse_in_place(csubstr filename, substr yaml, NodeRef node ); ///< (5) like (1) but the node is given as a NodeRef
116 RYML_EXPORT void parse_in_place( substr yaml, NodeRef node ); ///< (6) like (5) but no filename will be reported
117 RYML_EXPORT Tree parse_in_place(csubstr filename, substr yaml ); ///< (7) create a new tree, and parse YAML into its root node.
118 RYML_EXPORT Tree parse_in_place( substr yaml ); ///< (8) like (7) but no filename will be reported
119 
120 // this is vertically aligned to highlight the parameter differences.
121 RYML_EXPORT void parse_json_in_place(csubstr filename, substr json, Tree *t, id_type node_id); ///< (1) parse JSON into an existing tree node. The filename will be used in any error messages arising during the parse.
122 RYML_EXPORT void parse_json_in_place( substr json, Tree *t, id_type node_id); ///< (2) like (1) but no filename will be reported
123 RYML_EXPORT void parse_json_in_place(csubstr filename, substr json, Tree *t ); ///< (3) parse JSON into an existing tree, into its root node.
124 RYML_EXPORT void parse_json_in_place( substr json, Tree *t ); ///< (4) like (3) but no filename will be reported
125 RYML_EXPORT void parse_json_in_place(csubstr filename, substr json, NodeRef node ); ///< (5) like (1) but the node is given as a NodeRef
126 RYML_EXPORT void parse_json_in_place( substr json, NodeRef node ); ///< (6) like (5) but no filename will be reported
127 RYML_EXPORT Tree parse_json_in_place(csubstr filename, substr json ); ///< (7) create a new tree, and parse JSON into its root node.
128 RYML_EXPORT Tree parse_json_in_place( substr json ); ///< (8) like (7) but no filename will be reported
129 
130 /** @} */
131 
132 
133 //-----------------------------------------------------------------------------
134 
135 
136 /** @defgroup doc_parse_in_arena__with_existing_parser Parse in arena with existing parser
137  *
138  * @brief parse a read-only (immutable) YAML source buffer. This is
139  * achieved by first copying the contents of the buffer to the tree's
140  * arena, and then calling @ref parse_in_arena() . All the resulting
141  * scalars will be filtered in the arena. These overloads accept an
142  * existing parser object, and provide the opportunity to use special
143  * parser options.
144  *
145  * @see ParserOptions
146  *
147  *
148  * @note These freestanding functions use a temporary parser object,
149  * and are convenience functions to easily parse YAML without the need
150  * to instantiate a separate parser. Note that some properties
151  * (notably node locations in the original source code) are only
152  * available through the parser class. If you need access to any of
153  * these properties, use the appropriate overload from @ref
154  * doc_parse_in_arena__with_existing_parser
155  *
156  * @warning overloads receiving a substr YAML buffer are intentionally
157  * left undefined, such that calling parse_in_arena() with a substr
158  * will cause a linker error. This is to prevent an accidental copy of
159  * the source buffer to the tree's arena, because substr (which is
160  * mutable) is implicitly convertible to csubstr (which is
161  * immutable). If you really intend to parse a mutable buffer in the
162  * tree's arena, convert it first to immutable by assigning the substr
163  * to a csubstr prior to calling parse_in_arena(). This is not needed
164  * for parse_in_place() because csubstr is not implicitly convertible
165  * to substr. To be clear:
166  * ```c++
167  * substr mutable_buffer = ...;
168  * parser.parse_in_arena(mutable_buffer); // linker error
169  *
170  * csubstr immutable_buffer = ...;
171  * parser.parse_in_arena(immutable_buffer); // ok
172  * ```
173  *
174  * @{
175  */
176 
177 #define RYML_DONT_PARSE_SUBSTR_IN_ARENA "" \
178  "Do not pass a (mutable) substr to parse_in_arena(); " \
179  "if you have a substr, it should be parsed in place. " \
180  "Consider using parse_in_place() instead, or convert " \
181  "the buffer to csubstr prior to calling. This function " \
182  " is deliberately left undefined, so that calling it " \
183  "will cause a linker error."
184 
185 // this is vertically aligned to highlight the parameter differences.
186 RYML_EXPORT void parse_in_arena(Parser *parser, csubstr filename, csubstr yaml, Tree *t, id_type node_id); ///< (1) parse YAML into an existing tree node. The filename will be used in any error messages arising during the parse.
187 RYML_EXPORT void parse_in_arena(Parser *parser, csubstr yaml, Tree *t, id_type node_id); ///< (2) like (1) but no filename will be reported
188 RYML_EXPORT void parse_in_arena(Parser *parser, csubstr filename, csubstr yaml, Tree *t ); ///< (3) parse YAML into an existing tree, into its root node.
189 RYML_EXPORT void parse_in_arena(Parser *parser, csubstr yaml, Tree *t ); ///< (4) like (3) but no filename will be reported
190 RYML_EXPORT void parse_in_arena(Parser *parser, csubstr filename, csubstr yaml, NodeRef node ); ///< (5) like (1) but the node is given as a NodeRef
191 RYML_EXPORT void parse_in_arena(Parser *parser, csubstr yaml, NodeRef node ); ///< (6) like (5) but no filename will be reported
192 RYML_EXPORT Tree parse_in_arena(Parser *parser, csubstr filename, csubstr yaml ); ///< (7) create a new tree, and parse YAML into its root node.
193 RYML_EXPORT Tree parse_in_arena(Parser *parser, csubstr yaml ); ///< (8) like (7) but no filename will be reported
194 
195 // this is vertically aligned to highlight the parameter differences.
196 RYML_EXPORT void parse_json_in_arena(Parser *parser, csubstr filename, csubstr json, Tree *t, id_type node_id); ///< (1) parse JSON into an existing tree node. The filename will be used in any error messages arising during the parse.
197 RYML_EXPORT void parse_json_in_arena(Parser *parser, csubstr json, Tree *t, id_type node_id); ///< (2) like (1) but no filename will be reported
198 RYML_EXPORT void parse_json_in_arena(Parser *parser, csubstr filename, csubstr json, Tree *t ); ///< (3) parse JSON into an existing tree, into its root node.
199 RYML_EXPORT void parse_json_in_arena(Parser *parser, csubstr json, Tree *t ); ///< (4) like (3) but no filename will be reported
200 RYML_EXPORT void parse_json_in_arena(Parser *parser, csubstr filename, csubstr json, NodeRef node ); ///< (5) like (1) but the node is given as a NodeRef
201 RYML_EXPORT void parse_json_in_arena(Parser *parser, csubstr json, NodeRef node ); ///< (6) like (5) but no filename will be reported
202 RYML_EXPORT Tree parse_json_in_arena(Parser *parser, csubstr filename, csubstr json ); ///< (7) create a new tree, and parse JSON into its root node.
203 RYML_EXPORT Tree parse_json_in_arena(Parser *parser, csubstr json ); ///< (8) like (7) but no filename will be reported
204 
205 /* READ THE DEPRECATION NOTE!
206  *
207  * All of the functions below are intentionally left undefined, to
208  * prevent them being used.
209  *
210  */
211 /** @cond dev */
212 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(Parser *parser, substr yaml, Tree *t, id_type node_id);
213 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(Parser *parser, csubstr filename, substr yaml, Tree *t, id_type node_id);
214 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(Parser *parser, substr yaml, Tree *t );
215 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(Parser *parser, csubstr filename, substr yaml, Tree *t );
216 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(Parser *parser, substr yaml, NodeRef node );
217 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(Parser *parser, csubstr filename, substr yaml, NodeRef node );
218 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_in_arena(Parser *parser, substr yaml );
219 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_in_arena(Parser *parser, csubstr filename, substr yaml );
220 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(Parser *parser, substr json, Tree *t, id_type node_id);
221 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(Parser *parser, csubstr filename, substr json, Tree *t, id_type node_id);
222 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(Parser *parser, substr json, Tree *t );
223 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(Parser *parser, csubstr filename, substr json, Tree *t );
224 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(Parser *parser, substr json, NodeRef node );
225 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(Parser *parser, csubstr filename, substr json, NodeRef node );
226 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_json_in_arena(Parser *parser, substr json );
227 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_json_in_arena(Parser *parser, csubstr filename, substr json );
228 /** @endcond */
229 
230 /** @} */
231 
232 
233 //-----------------------------------------------------------------------------
234 
235 
236 /** @defgroup doc_parse_in_arena__with_temporary_parser Parse in arena with temporary parser
237  *
238  * @brief parse a read-only (immutable) YAML source buffer. This is
239  * achieved by first copying the contents of the buffer to the tree's
240  * arena, and then calling @ref parse_in_arena() .
241  *
242  * @note These freestanding functions use a temporary parser object,
243  * and are convenience functions to easily one-off parse YAML without
244  * the need to instantiate a separate parser. Note that some
245  * properties (notably node locations in the original source code) are
246  * only available through the parser class. If you need access to any
247  * of these properties, use the appropriate overload from @ref
248  * doc_parse_in_arena__with_existing_parser
249  *
250  * @warning overloads receiving a substr YAML buffer are intentionally
251  * left undefined, such that calling parse_in_arena() with a substr
252  * will cause a linker error. This is to prevent an accidental copy of
253  * the source buffer to the tree's arena, because substr (which is
254  * mutable) is implicitly convertible to csubstr (which is
255  * immutable). If you really intend to parse a mutable buffer in the
256  * tree's arena, convert it first to immutable by assigning the substr
257  * to a csubstr prior to calling parse_in_arena(). This is not needed
258  * for parse_in_place() because csubstr is not implicitly convertible
259  * to substr. To be clear:
260  * ```c++
261  * substr mutable_buffer = ...;
262  * parser.parse_in_arena(mutable_buffer); // linker error
263  *
264  * csubstr immutable_buffer = ...;
265  * parser.parse_in_arena(immutable_buffer); // ok
266  * ```
267  *
268  * @{
269  */
270 
271 // this is vertically aligned to highlight the parameter differences.
272 RYML_EXPORT void parse_in_arena(csubstr filename, csubstr yaml, Tree *t, id_type node_id); ///< (1) parse YAML into an existing tree node. The filename will be used in any error messages arising during the parse.
273 RYML_EXPORT void parse_in_arena( csubstr yaml, Tree *t, id_type node_id); ///< (2) like (1) but no filename will be reported
274 RYML_EXPORT void parse_in_arena(csubstr filename, csubstr yaml, Tree *t ); ///< (3) parse YAML into an existing tree, into its root node.
275 RYML_EXPORT void parse_in_arena( csubstr yaml, Tree *t ); ///< (4) like (3) but no filename will be reported
276 RYML_EXPORT void parse_in_arena(csubstr filename, csubstr yaml, NodeRef node ); ///< (5) like (1) but the node is given as a NodeRef
277 RYML_EXPORT void parse_in_arena( csubstr yaml, NodeRef node ); ///< (6) like (5) but no filename will be reported
278 RYML_EXPORT Tree parse_in_arena(csubstr filename, csubstr yaml ); ///< (7) create a new tree, and parse YAML into its root node.
279 RYML_EXPORT Tree parse_in_arena( csubstr yaml ); ///< (8) like (7) but no filename will be reported
280 
281 // this is vertically aligned to highlight the parameter differences.
282 RYML_EXPORT void parse_json_in_arena(csubstr filename, csubstr json, Tree *t, id_type node_id); ///< (1) parse JSON into an existing tree node. The filename will be used in any error messages arising during the parse.
283 RYML_EXPORT void parse_json_in_arena( csubstr json, Tree *t, id_type node_id); ///< (2) like (1) but no filename will be reported
284 RYML_EXPORT void parse_json_in_arena(csubstr filename, csubstr json, Tree *t ); ///< (3) parse JSON into an existing tree, into its root node.
285 RYML_EXPORT void parse_json_in_arena( csubstr json, Tree *t ); ///< (4) like (3) but no filename will be reported
286 RYML_EXPORT void parse_json_in_arena(csubstr filename, csubstr json, NodeRef node ); ///< (5) like (1) but the node is given as a NodeRef
287 RYML_EXPORT void parse_json_in_arena( csubstr json, NodeRef node ); ///< (6) like (5) but no filename will be reported
288 RYML_EXPORT Tree parse_json_in_arena(csubstr filename, csubstr json ); ///< (7) create a new tree, and parse JSON into its root node.
289 RYML_EXPORT Tree parse_json_in_arena( csubstr json ); ///< (8) like (7) but no filename will be reported
290 
291 /* READ THE DEPRECATION NOTE!
292  *
293  * All of the functions below are intentionally left undefined, to
294  * prevent them being used.
295  */
296 /** @cond dev */
297 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena( substr yaml, Tree *t, id_type node_id);
298 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(csubstr filename, substr yaml, Tree *t, id_type node_id);
299 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena( substr yaml, Tree *t );
300 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(csubstr filename, substr yaml, Tree *t );
301 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena( substr yaml, NodeRef node );
302 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_in_arena(csubstr filename, substr yaml, NodeRef node );
303 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_in_arena( substr yaml );
304 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_in_arena(csubstr filename, substr yaml );
305 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena( substr json, Tree *t, id_type node_id);
306 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(csubstr filename, substr json, Tree *t, id_type node_id);
307 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena( substr json, Tree *t );
308 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(csubstr filename, substr json, Tree *t );
309 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena( substr json, NodeRef node );
310 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) void parse_json_in_arena(csubstr filename, substr json, NodeRef node );
311 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_json_in_arena( substr json );
312 RYML_DEPRECATED(RYML_DONT_PARSE_SUBSTR_IN_ARENA) Tree parse_json_in_arena(csubstr filename, substr json );
313 /** @endcond */
314 
315 /** @} */
316 /** @} */
317 
318 } // namespace yml
319 } // namespace c4
320 
321 #endif /* _C4_YML_PARSE_HPP_ */
Common utilities and infrastructure used by ryml.
#define RYML_EXPORT
Definition: export.hpp:15
void parse_in_arena(Parser *parser, csubstr filename, csubstr yaml, Tree *t, id_type node_id)
(1) parse YAML into an existing tree node. The filename will be used in any error messages arising du...
Definition: parse.cpp:91
#define RYML_DONT_PARSE_SUBSTR_IN_ARENA
Definition: parse.hpp:177
void parse_json_in_arena(Parser *parser, csubstr filename, csubstr json, Tree *t, id_type node_id)
(1) parse JSON into an existing tree node. The filename will be used in any error messages arising du...
Definition: parse.cpp:112
void parse_json_in_place(Parser *parser, csubstr filename, substr json, Tree *t, id_type node_id)
(1) parse JSON into an existing tree node. The filename will be used in any error messages arising du...
Definition: parse.cpp:43
void parse_in_place(Parser *parser, csubstr filename, substr yaml, Tree *t, id_type node_id)
(1) parse YAML into an existing tree node.
Definition: parse.cpp:37
ParseEngine< EventHandlerTree > Parser
This is the main ryml parser, where the parser events are handled to create a ryml tree.
Definition: fwd.hpp:19
id_type estimate_tree_capacity(csubstr src)
Quickly inspect the source to estimate the number of nodes the resulting tree is likely have.
Definition: parse.cpp:152
RYML_ID_TYPE id_type
The type of a node id in the YAML tree; to override the default type, define the macro RYML_ID_TYPE t...
Definition: common.hpp:252
Definition: common.cpp:12