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_INTS_H
9#define LIBCBOR_INTS_H
10
11#include "cbor/cbor_export.h"
12#include "cbor/common.h"
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/*
19 * ============================================================================
20 * Integer (uints and negints) manipulation
21 * ============================================================================
22 */
23
24/** Extracts the integer value
25 *
26 * @param item[borrow] positive or negative integer
27 * @return the value
28 */
29_CBOR_NODISCARD CBOR_EXPORT uint8_t cbor_get_uint8(const cbor_item_t *item);
30
31/** Extracts the integer value
32 *
33 * @param item[borrow] positive or negative integer
34 * @return the value
35 */
36_CBOR_NODISCARD CBOR_EXPORT uint16_t cbor_get_uint16(const cbor_item_t *item);
37
38/** Extracts the integer value
39 *
40 * @param item[borrow] positive or negative integer
41 * @return the value
42 */
43_CBOR_NODISCARD CBOR_EXPORT uint32_t cbor_get_uint32(const cbor_item_t *item);
44
45/** Extracts the integer value
46 *
47 * @param item[borrow] positive or negative integer
48 * @return the value
49 */
50_CBOR_NODISCARD CBOR_EXPORT uint64_t cbor_get_uint64(const cbor_item_t *item);
51
52/** Extracts the integer value
53 *
54 * @param item[borrow] positive or negative integer
55 * @return the value, extended to `uint64_t`
56 */
57_CBOR_NODISCARD CBOR_EXPORT uint64_t cbor_get_int(const cbor_item_t *item);
58
59/** Assigns the integer value
60 *
61 * @param item[borrow] positive or negative integer item
62 * @param value the value to assign. For negative integer, the logical value is
63 * `-value - 1`
64 */
65CBOR_EXPORT void cbor_set_uint8(cbor_item_t *item, uint8_t value);
66
67/** Assigns the integer value
68 *
69 * @param item[borrow] positive or negative integer item
70 * @param value the value to assign. For negative integer, the logical value is
71 * `-value - 1`
72 */
73CBOR_EXPORT void cbor_set_uint16(cbor_item_t *item, uint16_t value);
74
75/** Assigns the integer value
76 *
77 * @param item[borrow] positive or negative integer item
78 * @param value the value to assign. For negative integer, the logical value is
79 * `-value - 1`
80 */
81CBOR_EXPORT void cbor_set_uint32(cbor_item_t *item, uint32_t value);
82
83/** Assigns the integer value
84 *
85 * @param item[borrow] positive or negative integer item
86 * @param value the value to assign. For negative integer, the logical value is
87 * `-value - 1`
88 */
89CBOR_EXPORT void cbor_set_uint64(cbor_item_t *item, uint64_t value);
90
91/** Queries the integer width
92 *
93 *  @param item[borrow] positive or negative integer item
94 *  @return the width
95 */
96_CBOR_NODISCARD CBOR_EXPORT cbor_int_width
97cbor_int_get_width(const cbor_item_t *item);
98
99/** Marks the integer item as a positive integer
100 *
101 * The data value is not changed
102 *
103 * @param item[borrow] positive or negative integer item
104 */
105CBOR_EXPORT void cbor_mark_uint(cbor_item_t *item);
106
107/** Marks the integer item as a negative integer
108 *
109 * The data value is not changed
110 *
111 * @param item[borrow] positive or negative integer item
112 */
113CBOR_EXPORT void cbor_mark_negint(cbor_item_t *item);
114
115/** Allocates new integer with 1B width
116 *
117 * The width cannot be changed once allocated
118 *
119 * @return **new** positive integer or `NULL` on memory allocation failure. The
120 * value is not initialized
121 */
122_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_int8(void);
123
124/** Allocates new integer with 2B width
125 *
126 * The width cannot be changed once allocated
127 *
128 * @return **new** positive integer or `NULL` on memory allocation failure. The
129 * value is not initialized
130 */
131_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_int16(void);
132
133/** Allocates new integer with 4B width
134 *
135 * The width cannot be changed once allocated
136 *
137 * @return **new** positive integer or `NULL` on memory allocation failure. The
138 * value is not initialized
139 */
140_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_int32(void);
141
142/** Allocates new integer with 8B width
143 *
144 * The width cannot be changed once allocated
145 *
146 * @return **new** positive integer or `NULL` on memory allocation failure. The
147 * value is not initialized
148 */
149_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_new_int64(void);
150
151/** Constructs a new positive integer
152 *
153 * @param value the value to use
154 * @return **new** positive integer or `NULL` on memory allocation failure
155 */
156_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_uint8(uint8_t value);
157
158/** Constructs a new positive integer
159 *
160 * @param value the value to use
161 * @return **new** positive integer or `NULL` on memory allocation failure
162 */
163_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_uint16(uint16_t value);
164
165/** Constructs a new positive integer
166 *
167 * @param value the value to use
168 * @return **new** positive integer or `NULL` on memory allocation failure
169 */
170_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_uint32(uint32_t value);
171
172/** Constructs a new positive integer
173 *
174 * @param value the value to use
175 * @return **new** positive integer or `NULL` on memory allocation failure
176 */
177_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_uint64(uint64_t value);
178
179/** Constructs a new negative integer
180 *
181 * @param value the value to use
182 * @return **new** negative integer or `NULL` on memory allocation failure
183 */
184_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_negint8(uint8_t value);
185
186/** Constructs a new negative integer
187 *
188 * @param value the value to use
189 * @return **new** negative integer or `NULL` on memory allocation failure
190 */
191_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_negint16(uint16_t value);
192
193/** Constructs a new negative integer
194 *
195 * @param value the value to use
196 * @return **new** negative integer or `NULL` on memory allocation failure
197 */
198_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_negint32(uint32_t value);
199
200/** Constructs a new negative integer
201 *
202 * @param value the value to use
203 * @return **new** negative integer or `NULL` on memory allocation failure
204 */
205_CBOR_NODISCARD CBOR_EXPORT cbor_item_t *cbor_build_negint64(uint64_t value);
206
207#ifdef __cplusplus
208}
209#endif
210
211#endif  // LIBCBOR_INTS_H
212