YAC 3.20.0
Yet Another Coupler
Loading...
Searching...
No Matches
param_distance.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_distance.h"
6#include "param_dble.h"
7#include "param_internal.h"
8#include "geometry.h"
9#include "yac_assert.h"
10#include <stdlib.h>
11#include <string.h>
12#include <math.h>
13#include <limits.h>
14
19
20static enum yac_param_type
22 const struct yac_param *param) {
23 UNUSED(param);
25}
26
28 const struct yac_param *param) {
29 const struct yac_param_distance *self =
30 (const struct yac_param_distance *)param;
31 return yac_param_is_default(self->dble_param);
32}
33
34static const char *yac_param_distance_get_name(
35 const struct yac_param *param) {
36 const struct yac_param_distance *self =
37 (const struct yac_param_distance *)param;
38 return yac_param_get_name(self->dble_param);
39}
40
42 struct yac_param *param) {
43 struct yac_param_distance *self =
44 (struct yac_param_distance *)param;
46 free(self);
47}
48
50 struct yac_param *param, double value) {
51 struct yac_param_distance *self =
52 (struct yac_param_distance *)param;
54 self->dble_param, value);
55}
56
58 struct yac_param *param, const char *value_str) {
59 double value;
62 value_str, yac_param_get_name(param), &value,
63 &unit)) return 1;
64 if (unit == YAC_PARAM_ANGLE_UNIT_DEG) {
66 }
67 return
69 param, value);
70}
71
73 const struct yac_param *param, double *value) {
74 const struct yac_param_distance *self =
75 (const struct yac_param_distance *)param;
77 self->dble_param, value);
78 if (rc) return rc;
79 return 0;
80}
81
83 const struct yac_param *param, char *buf, size_t buflen) {
84 double value;
85 int rc =
87 param, &value);
88 if (rc) return rc;
91 buf, buflen, value, "distance value",
92 yac_param_get_name(param));
93}
94
96 struct yac_param *param, int value) {
97 return yac_param_distance_set_scalar_dble(param, (double)value);
98}
99
101 const struct yac_param *param, int *value) {
102 double dval;
103 int ret = yac_param_distance_get_scalar_dble(param, &dval);
104 if (!ret) {
106 (fmod(dval, 1.0) == 0.0) &&
107 (dval >= (double)INT_MIN) && (dval <= (double)INT_MAX),
108 "distance value %g cannot be converted to integer without loss "
109 "for parameter '%s'",
110 dval, yac_param_get_name(param));
111 *value = (int)dval;
112 }
113 return ret;
114}
115
116static const struct yac_param_vtable
119 .is_default = yac_param_distance_is_default,
120 .get_name = yac_param_distance_get_name,
122 .get_sub_count = NULL,
123 .get_sub_by_name = NULL,
124 .get_sub_by_index = NULL,
125 .append = NULL,
126 .set_scalar = yac_param_distance_set_scalar,
127 .get_scalar = yac_param_distance_get_scalar,
128 .set_scalar_int = yac_param_distance_set_scalar_int,
129 .set_scalar_dble = yac_param_distance_set_scalar_dble,
130 .get_scalar_int = yac_param_distance_get_scalar_int,
131 .get_scalar_dble = yac_param_distance_get_scalar_dble
132};
133
134struct yac_param *
136 const char *name, double *value_ptr, double default_value,
137 double value_min, double value_max, int has_default, int is_defined) {
138
141 !isnan(value_min) && isfinite(value_min),
142 "value_min (%g) is not finite for parameter '%s'",
143 value_min, name);
145 !isnan(value_max) && isfinite(value_max),
146 "value_max (%g) is not finite for parameter '%s'",
147 value_max, name);
149 value_min >= 0.0, "value_min (%g) < 0 for parameter '%s'", value_min, name);
151 value_max <= M_PI, "value_max (%g) > M_PI for parameter '%s'",
152 value_max, name);
154 !has_default || (!isnan(default_value) && !isinf(default_value)),
155 "default_value (%g) is not finite for parameter '%s' (has_default is true)",
156 default_value, name);
158 value_min <= value_max,
159 "value_min (%g) is greater than value_max (%g) for parameter '%s'",
160 value_min, value_max, name);
161 struct yac_param_distance *self =
162 malloc(sizeof(*self));
165 name, value_ptr, default_value, value_min, value_max, 0, 0, has_default,
166 is_defined);
167 return (struct yac_param *)self;
168}
#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:191
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:161
void yac_param_delete(struct yac_param *param)
Definition param.c:291
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:372
double yac_rad_to_deg(double rad, char const *param_name)
Definition param.c:385
int yac_param_format_scalar_dble(char *buf, size_t buflen, double value, const char *value_desc, const char *param_name)
Definition param.c:247
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:143
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:170
@ YAC_PARAM_TYPE_SCALAR
Single typed value (e.g., int, double, string, enum)
Definition param.h:176
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:157
static int yac_param_distance_set_scalar_dble(struct yac_param *param, double value)
struct yac_param * yac_param_distance_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int has_default, int is_defined)
Create a distance parameter (stored in radians)
static int yac_param_distance_get_scalar(const struct yac_param *param, char *buf, size_t buflen)
static int yac_param_distance_set_scalar(struct yac_param *param, const char *value_str)
static const char * yac_param_distance_get_name(const struct yac_param *param)
static int yac_param_distance_set_scalar_int(struct yac_param *param, int value)
static int yac_param_distance_get_scalar_dble(const struct yac_param *param, double *value)
static const struct yac_param_vtable yac_param_distance_vtable
static enum yac_param_type yac_param_distance_get_type(const struct yac_param *param)
static int yac_param_distance_get_scalar_int(const struct yac_param *param, int *value)
static void yac_param_distance_delete(struct yac_param *param)
static int yac_param_distance_is_default(const struct yac_param *param)
yac_param_angle_unit
@ YAC_PARAM_ANGLE_UNIT_DEG
#define YAC_PARAM_ASSERT(COND,...)
#define YAC_PARAM_CHECK_BASIC()
const struct yac_param_vtable * vtable
struct yac_param * dble_param
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