Affix
view release on metacpan or search on metacpan
infix/include/infix/infix.h view on Meta::CPAN
*
* @param[in] registry The registry to clone.
* @return A pointer to the new registry, or `nullptr` on failure.
*/
INFIX_API INFIX_NODISCARD infix_registry_t * infix_registry_clone(const infix_registry_t *);
/**
* @brief Destroys a type registry and frees all associated memory.
*
* This includes freeing the registry handle itself, its internal hash table, and
* all `infix_type` objects that were created as part of a definition.
*
* @param[in] registry The registry to destroy. Safe to call with `nullptr`.
*/
INFIX_API void infix_registry_destroy(infix_registry_t *);
/**
* @brief Parses a string of type definitions and adds them to a registry.
*
* This is the primary way to populate a registry. Definitions are separated by
* semicolons. The parser supports forward declarations (`@Name;`) and out-of-order
* definitions, making it easy to define mutually recursive types.
*
* @param[in] registry The registry to populate.
* @param[in] definitions A semicolon-separated string of definitions.
* @return `INFIX_SUCCESS` on success, or an error code on failure.
* @code
* const char* my_types =
* "@Point = { x: double, y: double };" // Define a struct
* "@Node;" // Forward-declare Node
* "@List = { head: *@Node };" // Use the forward declaration
* "@Node = { value: int, next: *@Node };" // Define the recursive struct
* ;
* infix_register_types(registry, my_types);
* @endcode
*/
INFIX_API INFIX_NODISCARD infix_status infix_register_types(infix_registry_t *, const char *);
/** @} */ // end of registry_api group
/**
* @defgroup registry_introspection_api Registry Introspection API
* @brief APIs for inspecting and serializing the contents of a named type registry.
* @ingroup high_level_api
* @{
*/
/**
* @struct infix_registry_iterator_t
* @brief An iterator for traversing a type registry.
* @details This struct holds the complete state needed to traverse the registry's
* internal hash table, including the current bucket and the current entry within
* that bucket's linked list.
*
* The fields in this struct are implementation details and should not be accessed directly.
*/
typedef struct infix_registry_iterator_t {
const infix_registry_t * registry; /**< The registry being iterated. */
size_t _bucket_index; /**< Internal: current hash bucket. */
void * _current_entry; /**< Internal: opaque pointer to current entry. */
} infix_registry_iterator_t;
/**
* @brief Serializes all defined types within a registry into a single, human-readable string.
*
* The output format is a sequence of definitions (e.g., `@Name = { ... };`) separated
* by newlines, suitable for logging, debugging, or saving to a file. This function
* will not print forward declarations that have not been fully defined.
*
* @param[out] buffer The output buffer to write the string into.
* @param[in] buffer_size The size of the output buffer.
* @param[in] registry The registry to serialize.
* @return `INFIX_SUCCESS` on success, or `INFIX_ERROR_INVALID_ARGUMENT` if the buffer is too small.
*/
INFIX_API INFIX_NODISCARD infix_status infix_registry_print(char *, size_t, const infix_registry_t *);
/**
* @brief Initializes an iterator for traversing the types in a registry.
*
* @param[in] registry The registry to iterate over.
* @return An initialized iterator. If the registry is empty, the first call to
* `infix_registry_iterator_next` on this iterator will return `false`.
*/
INFIX_API INFIX_NODISCARD infix_registry_iterator_t infix_registry_iterator_begin(const infix_registry_t *);
/**
* @brief Advances the iterator to the next defined type in the registry.
*
* @param[in,out] iterator The iterator to advance.
* @return `true` if the iterator was advanced to a valid type, or `false` if there are no more types.
*/
INFIX_API INFIX_NODISCARD bool infix_registry_iterator_next(infix_registry_iterator_t *);
/**
* @brief Gets the name of the type at the iterator's current position.
*
* @param[in] iterator The iterator.
* @return The name of the type (e.g., "MyStruct"), or `nullptr` if the iterator is invalid or at the end.
*/
INFIX_API INFIX_NODISCARD const char * infix_registry_iterator_get_name(const infix_registry_iterator_t *);
/**
* @brief Gets the `infix_type` object of the type at the iterator's current position.
*
* @param[in] iterator The iterator.
* @return A pointer to the canonical `infix_type` object, or `nullptr` if the iterator is invalid or at the end.
*/
INFIX_API INFIX_NODISCARD const infix_type * infix_registry_iterator_get_type(const infix_registry_iterator_t *);
/**
* @brief Checks if a type with the given name is fully defined in the registry.
*
* This function will return `false` for names that are only forward-declared but
* have not been given a definition.
*
* @param[in] registry The registry to search.
* @param[in] name The name of the type to check (e.g., "MyStruct").
* @return `true` if a complete definition for the name exists, `false` otherwise.
*/
INFIX_API INFIX_NODISCARD bool infix_registry_is_defined(const infix_registry_t *, const char *);
/**
* @brief Retrieves the canonical `infix_type` object for a given name from the registry.
*
* @param[in] registry The registry to search.
* @param[in] name The name of the type to retrieve.
* @return A pointer to the canonical `infix_type` object if found and fully defined.
* Returns `nullptr` if the name is not found or is only a forward declaration.
* The returned pointer is owned by the registry and is valid for its lifetime.
*/
INFIX_API INFIX_NODISCARD const infix_type * infix_registry_lookup_type(const infix_registry_t *, const char *);
/**
* @brief Creates a new named type registry that allocates from a user-provided arena.
( run in 0.841 second using v1.01-cache-2.11-cpan-39bf76dae61 )