2 * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
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.
8 #include "floats_ctrls.h"
12 cbor_float_width cbor_float_get_width(const cbor_item_t *item) {
13 CBOR_ASSERT(cbor_isa_float_ctrl(item));
14 return item->metadata.float_ctrl_metadata.width;
17 uint8_t cbor_ctrl_value(const cbor_item_t *item) {
18 CBOR_ASSERT(cbor_isa_float_ctrl(item));
19 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_0);
20 return item->metadata.float_ctrl_metadata.ctrl;
23 bool cbor_float_ctrl_is_ctrl(const cbor_item_t *item) {
24 CBOR_ASSERT(cbor_isa_float_ctrl(item));
25 return cbor_float_get_width(item) == CBOR_FLOAT_0;
28 float cbor_float_get_float2(const cbor_item_t *item) {
29 CBOR_ASSERT(cbor_is_float(item));
30 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_16);
31 return *(float *)item->data;
34 float cbor_float_get_float4(const cbor_item_t *item) {
35 CBOR_ASSERT(cbor_is_float(item));
36 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_32);
37 return *(float *)item->data;
40 double cbor_float_get_float8(const cbor_item_t *item) {
41 CBOR_ASSERT(cbor_is_float(item));
42 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_64);
43 return *(double *)item->data;
46 double cbor_float_get_float(const cbor_item_t *item) {
47 CBOR_ASSERT(cbor_is_float(item));
48 // cppcheck-suppress missingReturn
49 switch (cbor_float_get_width(item)) {
53 return cbor_float_get_float2(item);
55 return cbor_float_get_float4(item);
57 return cbor_float_get_float8(item);
61 bool cbor_get_bool(const cbor_item_t *item) {
62 CBOR_ASSERT(cbor_is_bool(item));
63 return item->metadata.float_ctrl_metadata.ctrl == CBOR_CTRL_TRUE;
66 void cbor_set_float2(cbor_item_t *item, float value) {
67 CBOR_ASSERT(cbor_is_float(item));
68 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_16);
69 *((float *)item->data) = value;
72 void cbor_set_float4(cbor_item_t *item, float value) {
73 CBOR_ASSERT(cbor_is_float(item));
74 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_32);
75 *((float *)item->data) = value;
78 void cbor_set_float8(cbor_item_t *item, double value) {
79 CBOR_ASSERT(cbor_is_float(item));
80 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_64);
81 *((double *)item->data) = value;
84 void cbor_set_ctrl(cbor_item_t *item, uint8_t value) {
85 CBOR_ASSERT(cbor_isa_float_ctrl(item));
86 CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_0);
87 item->metadata.float_ctrl_metadata.ctrl = value;
90 void cbor_set_bool(cbor_item_t *item, bool value) {
91 CBOR_ASSERT(cbor_is_bool(item));
92 item->metadata.float_ctrl_metadata.ctrl =
93 value ? CBOR_CTRL_TRUE : CBOR_CTRL_FALSE;
96 cbor_item_t *cbor_new_ctrl(void) {
97 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t));
100 *item = (cbor_item_t){
101 .type = CBOR_TYPE_FLOAT_CTRL,
104 .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_0,
105 .ctrl = CBOR_CTRL_NONE}}};
109 cbor_item_t *cbor_new_float2(void) {
110 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 4);
113 *item = (cbor_item_t){
114 .type = CBOR_TYPE_FLOAT_CTRL,
115 .data = (unsigned char *)item + sizeof(cbor_item_t),
117 .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_16}}};
121 cbor_item_t *cbor_new_float4(void) {
122 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 4);
125 *item = (cbor_item_t){
126 .type = CBOR_TYPE_FLOAT_CTRL,
127 .data = (unsigned char *)item + sizeof(cbor_item_t),
129 .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_32}}};
133 cbor_item_t *cbor_new_float8(void) {
134 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 8);
137 *item = (cbor_item_t){
138 .type = CBOR_TYPE_FLOAT_CTRL,
139 .data = (unsigned char *)item + sizeof(cbor_item_t),
141 .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_64}}};
145 cbor_item_t *cbor_new_null(void) {
146 cbor_item_t *item = cbor_new_ctrl();
148 cbor_set_ctrl(item, CBOR_CTRL_NULL);
152 cbor_item_t *cbor_new_undef(void) {
153 cbor_item_t *item = cbor_new_ctrl();
155 cbor_set_ctrl(item, CBOR_CTRL_UNDEF);
159 cbor_item_t *cbor_build_bool(bool value) {
160 return cbor_build_ctrl(value ? CBOR_CTRL_TRUE : CBOR_CTRL_FALSE);
163 cbor_item_t *cbor_build_float2(float value) {
164 cbor_item_t *item = cbor_new_float2();
166 cbor_set_float2(item, value);
170 cbor_item_t *cbor_build_float4(float value) {
171 cbor_item_t *item = cbor_new_float4();
173 cbor_set_float4(item, value);
177 cbor_item_t *cbor_build_float8(double value) {
178 cbor_item_t *item = cbor_new_float8();
180 cbor_set_float8(item, value);
184 cbor_item_t *cbor_build_ctrl(uint8_t value) {
185 cbor_item_t *item = cbor_new_ctrl();
187 cbor_set_ctrl(item, value);