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