xref: /openbsd-src/lib/libcbor/src/cbor/floats_ctrls.h (revision 4dcc46c4d04180142eda526ce521dfb137776d05)
1da0d961cSdjm /*
2d3425be1Sdjm  * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
3da0d961cSdjm  *
4da0d961cSdjm  * libcbor is free software; you can redistribute it and/or modify
5da0d961cSdjm  * it under the terms of the MIT license. See LICENSE for details.
6da0d961cSdjm  */
7da0d961cSdjm 
8da0d961cSdjm #ifndef LIBCBOR_FLOATS_CTRLS_H
9da0d961cSdjm #define LIBCBOR_FLOATS_CTRLS_H
10da0d961cSdjm 
11*4dcc46c4Sdjm #include "cbor/cbor_export.h"
12da0d961cSdjm #include "cbor/common.h"
13da0d961cSdjm 
14da0d961cSdjm #ifdef __cplusplus
15da0d961cSdjm extern "C" {
16da0d961cSdjm #endif
17da0d961cSdjm 
18da0d961cSdjm /*
19da0d961cSdjm  * ============================================================================
20da0d961cSdjm  * Float manipulation
21da0d961cSdjm  * ============================================================================
22da0d961cSdjm  */
23da0d961cSdjm 
24da0d961cSdjm /** Is this a ctrl value?
25da0d961cSdjm  *
26da0d961cSdjm  * @param item[borrow] A float or ctrl item
27da0d961cSdjm  * @return Is this a ctrl value?
28da0d961cSdjm  */
29*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT bool cbor_float_ctrl_is_ctrl(
30*4dcc46c4Sdjm     const cbor_item_t *item);
31da0d961cSdjm 
32da0d961cSdjm /** Get the float width
33da0d961cSdjm  *
34da0d961cSdjm  * @param item[borrow] A float or ctrl item
35da0d961cSdjm  * @return The width.
36da0d961cSdjm  */
37*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_float_width
38*4dcc46c4Sdjm cbor_float_get_width(const cbor_item_t *item);
39da0d961cSdjm 
40da0d961cSdjm /** Get a half precision float
41da0d961cSdjm  *
42da0d961cSdjm  * The item must have the corresponding width
43da0d961cSdjm  *
44da0d961cSdjm  * @param[borrow] A half precision float
45da0d961cSdjm  * @return half precision value
46da0d961cSdjm  */
47*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT float cbor_float_get_float2(
48*4dcc46c4Sdjm     const cbor_item_t *item);
49da0d961cSdjm 
50da0d961cSdjm /** Get a single precision float
51da0d961cSdjm  *
52da0d961cSdjm  * The item must have the corresponding width
53da0d961cSdjm  *
54*4dcc46c4Sdjm  * @param[borrow] A single precision float
55da0d961cSdjm  * @return single precision value
56da0d961cSdjm  */
57*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT float cbor_float_get_float4(
58*4dcc46c4Sdjm     const cbor_item_t *item);
59da0d961cSdjm 
60da0d961cSdjm /** Get a double precision float
61da0d961cSdjm  *
62da0d961cSdjm  * The item must have the corresponding width
63da0d961cSdjm  *
64da0d961cSdjm  * @param[borrow] A double precision float
65da0d961cSdjm  * @return double precision value
66da0d961cSdjm  */
67*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT double cbor_float_get_float8(
68*4dcc46c4Sdjm     const cbor_item_t *item);
69da0d961cSdjm 
70da0d961cSdjm /** Get the float value represented as double
71da0d961cSdjm  *
72da0d961cSdjm  * Can be used regardless of the width.
73da0d961cSdjm  *
74da0d961cSdjm  * @param[borrow] Any float
75da0d961cSdjm  * @return double precision value
76da0d961cSdjm  */
77*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT double cbor_float_get_float(
78*4dcc46c4Sdjm     const cbor_item_t *item);
79da0d961cSdjm 
80d3425be1Sdjm /** Get value from a boolean ctrl item
81d3425be1Sdjm  *
82d3425be1Sdjm  * @param item[borrow] A ctrl item
83d3425be1Sdjm  * @return boolean value
84d3425be1Sdjm  */
85*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT bool cbor_get_bool(const cbor_item_t *item);
86d3425be1Sdjm 
87da0d961cSdjm /** Constructs a new ctrl item
88da0d961cSdjm  *
89da0d961cSdjm  * The width cannot be changed once the item is created
90da0d961cSdjm  *
919e5c2ddcSdjm  * @return **new** 1B ctrl or `NULL` upon memory allocation failure
92da0d961cSdjm  */
93*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_ctrl(void);
94da0d961cSdjm 
95da0d961cSdjm /** Constructs a new float item
96da0d961cSdjm  *
97da0d961cSdjm  * The width cannot be changed once the item is created
98da0d961cSdjm  *
999e5c2ddcSdjm  * @return **new** 2B float or `NULL` upon memory allocation failure
100da0d961cSdjm  */
101*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_float2(void);
102da0d961cSdjm 
103da0d961cSdjm /** Constructs a new float item
104da0d961cSdjm  *
105da0d961cSdjm  * The width cannot be changed once the item is created
106da0d961cSdjm  *
1079e5c2ddcSdjm  * @return **new** 4B float or `NULL` upon memory allocation failure
108da0d961cSdjm  */
109*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_float4(void);
110da0d961cSdjm 
111da0d961cSdjm /** Constructs a new float item
112da0d961cSdjm  *
113da0d961cSdjm  * The width cannot be changed once the item is created
114da0d961cSdjm  *
1159e5c2ddcSdjm  * @return **new** 8B float or `NULL` upon memory allocation failure
116da0d961cSdjm  */
117*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_float8(void);
118da0d961cSdjm 
119da0d961cSdjm /** Constructs new null ctrl item
120da0d961cSdjm  *
1219e5c2ddcSdjm  * @return **new** null ctrl item or `NULL` upon memory allocation failure
122da0d961cSdjm  */
123*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_null(void);
124da0d961cSdjm 
1259e5c2ddcSdjm /** Constructs new undef ctrl item
126da0d961cSdjm  *
1279e5c2ddcSdjm  * @return **new** undef ctrl item or `NULL` upon memory allocation failure
128da0d961cSdjm  */
129*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_undef(void);
130da0d961cSdjm 
131da0d961cSdjm /** Constructs new boolean ctrl item
132da0d961cSdjm  *
133da0d961cSdjm  * @param value The value to use
1342c53affbSjmc  * @return **new** boolean ctrl item or `NULL` upon memory allocation failure
135da0d961cSdjm  */
136*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_bool(bool value);
137da0d961cSdjm 
138da0d961cSdjm /** Assign a control value
139da0d961cSdjm  *
140da0d961cSdjm  * \rst
1419e5c2ddcSdjm  * .. warning:: It is possible to produce an invalid CBOR value by assigning a
1429e5c2ddcSdjm  *  invalid value using this mechanism. Please consult the standard before use.
143da0d961cSdjm  * \endrst
144da0d961cSdjm  *
145da0d961cSdjm  * @param item[borrow] A ctrl item
1469e5c2ddcSdjm  * @param value The simple value to assign. Please consult the standard for
1479e5c2ddcSdjm  * 	allowed values
148da0d961cSdjm  */
149*4dcc46c4Sdjm CBOR_EXPORT void cbor_set_ctrl(cbor_item_t *item, uint8_t value);
150da0d961cSdjm 
151d3425be1Sdjm /** Assign a boolean value to a boolean ctrl item
152d3425be1Sdjm  *
153d3425be1Sdjm  * @param item[borrow] A ctrl item
154d3425be1Sdjm  * @param value The simple value to assign.
155d3425be1Sdjm  */
156*4dcc46c4Sdjm CBOR_EXPORT void cbor_set_bool(cbor_item_t *item, bool value);
157d3425be1Sdjm 
158da0d961cSdjm /** Assigns a float value
159da0d961cSdjm  *
160da0d961cSdjm  * @param item[borrow] A half precision float
161da0d961cSdjm  * @param value The value to assign
162da0d961cSdjm  */
163*4dcc46c4Sdjm CBOR_EXPORT void cbor_set_float2(cbor_item_t *item, float value);
164da0d961cSdjm 
165da0d961cSdjm /** Assigns a float value
166da0d961cSdjm  *
167da0d961cSdjm  * @param item[borrow] A single precision float
168da0d961cSdjm  * @param value The value to assign
169da0d961cSdjm  */
170*4dcc46c4Sdjm CBOR_EXPORT void cbor_set_float4(cbor_item_t *item, float value);
171da0d961cSdjm 
172da0d961cSdjm /** Assigns a float value
173da0d961cSdjm  *
174da0d961cSdjm  * @param item[borrow] A double precision float
175da0d961cSdjm  * @param value The value to assign
176da0d961cSdjm  */
177*4dcc46c4Sdjm CBOR_EXPORT void cbor_set_float8(cbor_item_t *item, double value);
178da0d961cSdjm 
179da0d961cSdjm /** Reads the control value
180da0d961cSdjm  *
181da0d961cSdjm  * @param item[borrow] A ctrl item
182da0d961cSdjm  * @return the simple value
183da0d961cSdjm  */
184*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT uint8_t cbor_ctrl_value(const cbor_item_t *item);
185da0d961cSdjm 
186da0d961cSdjm /** Constructs a new float
187da0d961cSdjm  *
188da0d961cSdjm  * @param value the value to use
189da0d961cSdjm  * @return **new** float
190da0d961cSdjm  */
191*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_float2(float value);
192da0d961cSdjm 
193da0d961cSdjm /** Constructs a new float
194da0d961cSdjm  *
195da0d961cSdjm  * @param value the value to use
1969e5c2ddcSdjm  * @return **new** float or `NULL` upon memory allocation failure
197da0d961cSdjm  */
198*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_float4(float value);
199da0d961cSdjm 
200da0d961cSdjm /** Constructs a new float
201da0d961cSdjm  *
202da0d961cSdjm  * @param value the value to use
2039e5c2ddcSdjm  * @return **new** float or `NULL` upon memory allocation failure
204da0d961cSdjm  */
205*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_float8(double value);
206da0d961cSdjm 
207da0d961cSdjm /** Constructs a ctrl item
208da0d961cSdjm  *
209da0d961cSdjm  * @param value the value to use
2109e5c2ddcSdjm  * @return **new** ctrl item or `NULL` upon memory allocation failure
211da0d961cSdjm  */
212*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_ctrl(uint8_t value);
213da0d961cSdjm 
214da0d961cSdjm #ifdef __cplusplus
215da0d961cSdjm }
216da0d961cSdjm #endif
217da0d961cSdjm 
218da0d961cSdjm #endif  // LIBCBOR_FLOATS_CTRLS_H
219