YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
param_oneof.c
Go to the documentation of this file.
1// Copyright (c) 2026 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include "param_oneof.h"
6#include "param_internal.h"
7#include "utils_common.h"
8#include <stdlib.h>
9#include <string.h>
10#include <stddef.h>
11#include <stdint.h>
12
14 const struct yac_param_vtable *vtable;
15 char *name;
16 void **obj; // user object for the subparameter
19 int is_defined; // 0 if not set, 1 if set
21};
22
23static enum yac_param_type
25 const struct yac_param *param) {
26
27 UNUSED(param);
29}
30
32 const struct yac_param *param) {
33
34 const struct yac_param_oneof *self =
35 (const struct yac_param_oneof *)param;
36 return (!self->is_defined) ||
37 (self->is_default &&
39}
40
41static const char *yac_param_oneof_get_name(
42 const struct yac_param *param) {
43 const struct yac_param_oneof *self =
44 (const struct yac_param_oneof *)param;
45 return self->name;
46}
47
49 const struct yac_param *param, size_t *count) {
50 UNUSED(param);
51 YAC_ASSERT(count, "count is NULL");
52 *count = 1;
53 return 0;
54}
55
57 struct yac_param *param, size_t idx,
58 struct yac_param **sub_param) {
59
60 struct yac_param_oneof *self =
61 (struct yac_param_oneof *)param;
62 YAC_ASSERT(sub_param, "sub_param is NULL");
63
64 *sub_param = NULL;
65
67 idx == 0,
68 "idx out of bounds for oneof parameter");
69
70 if (!self->is_defined) {
71 int err = self->default_factory(
72 NULL, self->obj, &self->subparam, &self->is_default);
74 err == 0, "failed to create default oneof subparameter");
75 self->is_defined = 1;
76 }
77
78 *sub_param = self->subparam;
79 return 0;
80}
81
83 const struct yac_param *param, const char *name,
84 struct yac_param **sub_param)
85{
86 struct yac_param_oneof *self =
87 (struct yac_param_oneof *)param;
88 YAC_ASSERT(name, "name is NULL");
89 YAC_ASSERT(sub_param, "sub_param is NULL");
90 // Only allow setting once
91 if (self->is_defined) {
92
94 strcmp(name, yac_param_get_name(self->subparam)) == 0,
95 "oneof parameter '%s' already set to '%s', cannot set to '%s'",
96 self->name, yac_param_get_name(self->subparam),
97 name);
98 } else {
99
100 // Not set yet, use factory to create subparam for the given name
101 int err =
102 self->default_factory(
103 name, self->obj, &self->subparam, &self->is_default);
104
106 err == 0,
107 "dynamic subparam with name '%s' creation failed for "
108 "paramter name '%s'", name, self->name);
109 self->is_defined = 1;
110 }
111 *sub_param = self->subparam;
112 return 0;
113}
114
116 struct yac_param *param) {
117
118 struct yac_param_oneof *self =
119 (struct yac_param_oneof *)param;
120 if (self->subparam)
122 free(self->name);
123 free(param);
124}
125
126static const struct yac_param_vtable
129 .is_default = yac_param_oneof_is_default,
130 .get_name = yac_param_oneof_get_name,
131 .delete = yac_param_oneof_delete,
132 .get_sub_count = yac_param_oneof_get_sub_count,
133 .get_sub_by_name = yac_param_oneof_get_sub_by_name,
134 .get_sub_by_index = yac_param_oneof_get_sub_by_index,
135 .append = NULL,
136 .set_scalar = NULL,
137 .get_scalar = NULL,
138 .get_scalar_kind = NULL,
139 .set_scalar_int = NULL,
140 .set_scalar_dble = NULL,
141 .get_scalar_int = NULL,
142 .get_scalar_dble = NULL
143};
144
146 const char *name,
147 yac_param_oneof_factory_ptr default_factory,
148 void **value_ptr, struct yac_param *subparam,
149 int subparam_is_default) {
150
152 YAC_ASSERT(default_factory, "default_factory is NULL");
154 ((*value_ptr == NULL) && (subparam == NULL)) ||
155 ((*value_ptr != NULL) && (subparam != NULL)),
156 "subparam must be NULL if and only if *out_obj is NULL");
157
158 struct yac_param_oneof *self =
159 xmalloc(1 * sizeof(*self));
161 self->name = xstrdup(name);
162 self->obj = value_ptr;
163 self->subparam = subparam;
164 self->is_default = (*value_ptr != NULL) ? subparam_is_default : 0;
165 self->is_defined = (*value_ptr != NULL);
167 return (struct yac_param *)self;
168}
#define YAC_ASSERT(exp, msg)
#define UNUSED(x)
Definition core.h:72
void yac_param_delete(struct yac_param *param)
Definition param.c:304
int yac_param_is_default(const struct yac_param *param)
Check whether a parameter is at its default value.
Definition param.c:37
const char * yac_param_get_name(const struct yac_param *param)
Get the name of the current parameter.
Definition param.c:50
yac_param_type
Parameter type for generic configuration interface.
Definition param.h:171
@ YAC_PARAM_TYPE_STRUCT
Named, fixed set of subparameters.
Definition param.h:179
#define YAC_PARAM_ASSERT(COND,...)
#define YAC_PARAM_CHECK_BASIC()
static void yac_param_oneof_delete(struct yac_param *param)
static int yac_param_oneof_get_sub_count(const struct yac_param *param, size_t *count)
Definition param_oneof.c:48
static int yac_param_oneof_get_sub_by_name(const struct yac_param *param, const char *name, struct yac_param **sub_param)
Definition param_oneof.c:82
static int yac_param_oneof_get_sub_by_index(struct yac_param *param, size_t idx, struct yac_param **sub_param)
Definition param_oneof.c:56
static const char * yac_param_oneof_get_name(const struct yac_param *param)
Definition param_oneof.c:41
struct yac_param * yac_param_oneof_new(const char *name, yac_param_oneof_factory_ptr default_factory, void **value_ptr, struct yac_param *subparam, int subparam_is_default)
Create a new one-of struct parameter with a given name and a default_factory.
static enum yac_param_type yac_param_oneof_get_type(const struct yac_param *param)
Definition param_oneof.c:24
static int yac_param_oneof_is_default(const struct yac_param *param)
Definition param_oneof.c:31
static const struct yac_param_vtable yac_param_oneof_vtable
int(* yac_param_oneof_factory_ptr)(const char *name, void **obj, struct yac_param **param, int *is_default)
Function pointer type for creating a default subparameter and associated object for a oneof parameter...
Definition param_oneof.h:27
#define xstrdup(s)
Definition ppm_xfuncs.h:84
#define xmalloc(size)
Definition ppm_xfuncs.h:66
struct yac_param * subparam
Definition param_oneof.c:17
const struct yac_param_vtable * vtable
Definition param_oneof.c:14
yac_param_oneof_factory_ptr default_factory
Definition param_oneof.c:20
enum yac_param_type(* get_type)(const struct yac_param *param)
char const * name
Definition toy_scrip.c:114