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