YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
param_angle.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 <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8#include <math.h>
9#include <limits.h>
10
11#include "param_angle.h"
12#include "param_dble.h"
13#include "param_internal.h"
14#include "utils_common.h"
15#include "ppm/core.h"
16#include "yac_assert.h"
17
22
23static enum yac_param_type
25 const struct yac_param *param) {
26 UNUSED(param);
28}
29
31 const struct yac_param *param) {
32 const struct yac_param_angle *self =
33 (const struct yac_param_angle *)param;
34 return yac_param_is_default(self->dble_param);
35}
36
37static const char *yac_param_angle_get_name(
38 const struct yac_param *param) {
39 const struct yac_param_angle *self =
40 (const struct yac_param_angle *)param;
41 return yac_param_get_name(self->dble_param);
42}
43
45 struct yac_param *param) {
46 struct yac_param_angle *self =
47 (struct yac_param_angle *)param;
49 free(self);
50}
51
53 struct yac_param *param, double value) {
54 struct yac_param_angle *self =
55 (struct yac_param_angle *)param;
56 char const * param_name = yac_param_get_name(param);
57
58 value = yac_wrap_rad(value, param_name);
59
61 self->dble_param, value);
62}
63
65 struct yac_param *param, const char *value_str) {
66 double value;
69 value_str, yac_param_get_name(param), &value,
70 &unit)) return 1;
71 if (unit == YAC_PARAM_ANGLE_UNIT_DEG) {
73 }
74 return
76}
77
79 const struct yac_param *param, double *value) {
80 const struct yac_param_angle *self =
81 (const struct yac_param_angle *)param;
83 self->dble_param, value);
84}
85
87 const struct yac_param *param, char *buf, size_t buflen) {
88 double value;
89 int ret = yac_param_angle_get_scalar_dble(param, &value);
90 if (!ret) {
92 ret =
94 buf, buflen, value, "angle value",
95 yac_param_get_name(param));
96 }
97 return ret;
98}
99
101 const struct yac_param *param,
102 enum yac_param_scalar_kind *scalar_kind) {
103 const struct yac_param_angle *self =
104 (const struct yac_param_angle *)param;
105 return yac_param_get_scalar_kind(self->dble_param, scalar_kind);
106}
107
109 struct yac_param *param, int value) {
110 return yac_param_angle_set_scalar_dble(param, (double)value);
111}
112
114 const struct yac_param *param, int *value) {
115 double dval;
116 int ret = yac_param_angle_get_scalar_dble(param, &dval);
117 if (!ret) {
119 (fmod(dval, 1.0) == 0.0) &&
120 (dval >= (double)INT_MIN) && (dval <= (double)INT_MAX),
121 "angle value %g cannot be converted to integer without loss "
122 "for parameter '%s'",
123 dval, yac_param_get_name(param));
124 *value = (int)dval;
125 }
126 return ret;
127}
128
129static const struct yac_param_vtable
132 .is_default = yac_param_angle_is_default,
133 .get_name = yac_param_angle_get_name,
134 .delete = yac_param_angle_delete,
135 .get_sub_count = NULL,
136 .get_sub_by_name = NULL,
137 .get_sub_by_index = NULL,
138 .append = NULL,
139 .set_scalar = yac_param_angle_set_scalar,
140 .get_scalar = yac_param_angle_get_scalar,
141 .get_scalar_kind = yac_param_angle_get_scalar_kind,
142 .set_scalar_int = yac_param_angle_set_scalar_int,
143 .set_scalar_dble = yac_param_angle_set_scalar_dble,
144 .get_scalar_int = yac_param_angle_get_scalar_int,
145 .get_scalar_dble = yac_param_angle_get_scalar_dble
146};
147
149 const char *name, double *value_ptr, double default_value,
150 double value_min, double value_max, int has_default, int is_defined) {
151
154 is_defined || (!isnan(*value_ptr) && !isinf(*value_ptr)),
155 "initial value (%g) is not finite for parameter '%s'",
156 *value_ptr, name);
158 !isnan(value_min) && isfinite(value_min),
159 "value_min (%g) is not finite for parameter '%s'",
160 value_min, name);
162 !isnan(value_max) && isfinite(value_max),
163 "value_max (%g) is not finite for parameter '%s'",
164 value_max, name);
166 !has_default || (!isnan(default_value) && !isinf(default_value)),
167 "default_value (%g) is not finite for parameter '%s' (has_default is true)",
168 default_value, name);
170 value_min <= value_max,
171 "value_min (%g) is greater than value_max (%g) for parameter '%s'",
172 value_min, value_max, name);
173
174 if (has_default) default_value = yac_wrap_rad(default_value, name);
175
176 if (is_defined) *value_ptr = yac_wrap_rad(*value_ptr, name);
177
178 struct yac_param_angle *self = xmalloc(sizeof(*self));
180 self->dble_param =
182 name, value_ptr, default_value, value_min, value_max, 0, 0, has_default,
183 is_defined);
184 return (struct yac_param *)self;
185}
#define UNUSED(x)
Definition core.h:72
struct @23::@24 value
int yac_param_parse_dble_with_unit(const char *value_str, const char *param_name, double *value, enum yac_param_angle_unit *unit)
Definition param.c:204
int yac_param_get_scalar_dble(const struct yac_param *param, double *value)
Get the value of a scalar parameter as a double.
Definition param.c:174
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
double yac_deg_to_rad(double deg, char const *param_name)
Definition param.c:385
double yac_wrap_rad(double value, char const *param_name)
Definition param.c:319
int yac_param_get_scalar_kind(const struct yac_param *param, enum yac_param_scalar_kind *scalar_kind)
Get the storage kind of a scalar parameter.
Definition param.c:134
double yac_rad_to_deg(double rad, char const *param_name)
Definition param.c:398
int yac_param_format_scalar_dble(char *buf, size_t buflen, double value, const char *value_desc, const char *param_name)
Definition param.c:260
int yac_param_set_scalar_dble(struct yac_param *param, double value)
Set the value of a scalar parameter as a double.
Definition param.c:156
const char * yac_param_get_name(const struct yac_param *param)
Get the name of the current parameter.
Definition param.c:50
yac_param_scalar_kind
Scalar parameter storage kind.
Definition param.h:185
yac_param_type
Parameter type for generic configuration interface.
Definition param.h:171
@ YAC_PARAM_TYPE_SCALAR
Single typed value (e.g., int, double, string, enum)
Definition param.h:177
struct yac_param * yac_param_angle_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int has_default, int is_defined)
Create an angle parameter (stored in radians)
static void yac_param_angle_delete(struct yac_param *param)
Definition param_angle.c:44
static enum yac_param_type yac_param_angle_get_type(const struct yac_param *param)
Definition param_angle.c:24
static int yac_param_angle_get_scalar_dble(const struct yac_param *param, double *value)
Definition param_angle.c:78
static int yac_param_angle_set_scalar_dble(struct yac_param *param, double value)
Definition param_angle.c:52
static int yac_param_angle_set_scalar_int(struct yac_param *param, int value)
static int yac_param_angle_is_default(const struct yac_param *param)
Definition param_angle.c:30
static int yac_param_angle_get_scalar_int(const struct yac_param *param, int *value)
static const struct yac_param_vtable yac_param_angle_vtable
static const char * yac_param_angle_get_name(const struct yac_param *param)
Definition param_angle.c:37
static int yac_param_angle_get_scalar_kind(const struct yac_param *param, enum yac_param_scalar_kind *scalar_kind)
static int yac_param_angle_get_scalar(const struct yac_param *param, char *buf, size_t buflen)
Definition param_angle.c:86
static int yac_param_angle_set_scalar(struct yac_param *param, const char *value_str)
Definition param_angle.c:64
struct yac_param * yac_param_dble_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int allow_nan, int allow_inf, int has_default, int is_defined)
Create a double parameter.
Definition param_dble.c:166
yac_param_angle_unit
@ YAC_PARAM_ANGLE_UNIT_DEG
#define YAC_PARAM_ASSERT(COND,...)
#define YAC_PARAM_CHECK_BASIC()
#define xmalloc(size)
Definition ppm_xfuncs.h:66
struct yac_param * dble_param
Definition param_angle.c:20
const struct yac_param_vtable * vtable
Definition param_angle.c:19
enum yac_param_type(* get_type)(const struct yac_param *param)
char const * name
Definition toy_scrip.c:114
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:39