Skip to content

Commit f124777

Browse files
SGilbert-bpmartinjaeger
authored andcommitted
refactored to improve performance
1 parent d3338c7 commit f124777

File tree

2 files changed

+108
-89
lines changed

2 files changed

+108
-89
lines changed

src/thingset_bin.c

Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -694,70 +694,79 @@ static int bin_deserialize_value(struct thingset_context *ts,
694694
bin_deserialize_simple_value(ts, object->data, object->type, object->detail, check_only);
695695

696696
if (err == -THINGSET_ERR_UNSUPPORTED_FORMAT) {
697-
if (object->type == THINGSET_TYPE_ARRAY) {
698-
struct thingset_array *array = object->data.array;
699-
bool success;
697+
bool success;
700698

701-
success = zcbor_list_start_decode(ts->decoder);
702-
if (!success) {
703-
return -THINGSET_ERR_UNSUPPORTED_FORMAT;
704-
}
705-
706-
size_t type_size = thingset_type_size(array->element_type);
707-
int index = 0;
708-
do {
709-
/* using uint8_t pointer for byte-wise pointer arithmetics */
710-
union thingset_data_pointer data = { .u8 = array->elements.u8 + index * type_size };
699+
switch (object->type) {
700+
case THINGSET_TYPE_ARRAY:
701+
struct thingset_array *array = object->data.array;
711702

712-
err = bin_deserialize_simple_value(ts, data, array->element_type, array->decimals,
713-
check_only);
714-
if (err != 0) {
703+
success = zcbor_list_start_decode(ts->decoder);
704+
if (!success) {
705+
err = -THINGSET_ERR_UNSUPPORTED_FORMAT;
715706
break;
716707
}
717-
index++;
718-
} while (index < array->max_elements);
719708

720-
if (!check_only) {
721-
array->num_elements = index;
722-
}
709+
size_t type_size = thingset_type_size(array->element_type);
710+
int index = 0;
711+
do {
712+
/* using uint8_t pointer for byte-wise pointer arithmetics */
713+
union thingset_data_pointer data = { .u8 = array->elements.u8 + index * type_size };
723714

724-
success = zcbor_list_end_decode(ts->decoder);
725-
if (success) {
726-
err = 0;
727-
}
728-
}
729-
else if (object->type == THINGSET_TYPE_RECORDS) {
730-
struct thingset_records *records = object->data.records;
731-
uint32_t id;
732-
bool success;
733-
734-
success = zcbor_list_start_decode(ts->decoder);
735-
for (unsigned int i = 0; i < records->num_records; i++) {
736-
success = zcbor_map_start_decode(ts->decoder);
737-
if (!success) {
738-
return -THINGSET_ERR_UNSUPPORTED_FORMAT;
715+
err = bin_deserialize_simple_value(ts, data, array->element_type, array->decimals,
716+
check_only);
717+
if (err != 0) {
718+
break;
719+
}
720+
index++;
721+
} while (index < array->max_elements);
722+
723+
if (!check_only) {
724+
array->num_elements = index;
739725
}
740726

741-
while (zcbor_uint32_decode(ts->decoder, &id) && id < UINT16_MAX) {
742-
struct thingset_data_object *element = thingset_get_object_by_id(ts, id);
743-
if (element == NULL) {
744-
zcbor_any_skip(ts->decoder, NULL);
745-
continue;
727+
success = zcbor_list_end_decode(ts->decoder);
728+
if (success) {
729+
err = 0;
730+
}
731+
break;
732+
733+
case THINGSET_TYPE_RECORDS:
734+
struct thingset_records *records = object->data.records;
735+
uint32_t id;
736+
737+
success = zcbor_list_start_decode(ts->decoder);
738+
for (unsigned int i = 0; i < records->num_records; i++) {
739+
success = zcbor_map_start_decode(ts->decoder);
740+
if (!success) {
741+
err = -THINGSET_ERR_UNSUPPORTED_FORMAT;
742+
break;
743+
}
744+
745+
while (zcbor_uint32_decode(ts->decoder, &id) && id < UINT16_MAX) {
746+
struct thingset_data_object *element = thingset_get_object_by_id(ts, id);
747+
if (element == NULL) {
748+
zcbor_any_skip(ts->decoder, NULL);
749+
continue;
750+
}
751+
union thingset_data_pointer data = { .u8 = ((uint8_t *)records->records)
752+
+ (i * records->record_size)
753+
+ element->data.offset };
754+
err = bin_deserialize_simple_value(ts, data, element->type, element->detail,
755+
check_only);
746756
}
747-
union thingset_data_pointer data = { .u8 = ((uint8_t *)records->records)
748-
+ (i * records->record_size)
749-
+ element->data.offset };
750-
err = bin_deserialize_simple_value(ts, data, element->type, element->detail,
751-
check_only);
757+
758+
success = zcbor_map_end_decode(ts->decoder);
752759
}
753760

754-
success = zcbor_map_end_decode(ts->decoder);
755-
}
761+
success = zcbor_list_end_decode(ts->decoder);
762+
if (success) {
763+
err = 0;
764+
}
765+
break;
756766

757-
success = zcbor_list_end_decode(ts->decoder);
758-
if (success) {
759-
err = 0;
760-
}
767+
default:
768+
err = -THINGSET_ERR_UNSUPPORTED_FORMAT;
769+
break;
761770
}
762771
}
763772

src/thingset_common.c

Lines changed: 47 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -53,44 +53,54 @@ int thingset_common_prepare_record_element(struct thingset_context *ts,
5353
uint8_t *record_ptr,
5454
thingset_common_record_element_action callback)
5555
{
56-
int err;
57-
if (item->type == THINGSET_TYPE_ARRAY) {
58-
struct thingset_array *arr = item->data.array;
59-
struct thingset_array arr_offset = {
60-
{ .u8 = record_ptr + arr->elements.offset },
61-
arr->element_type,
62-
arr->decimals,
63-
arr->max_elements,
64-
arr->num_elements,
65-
};
66-
struct thingset_data_object item_offset = {
67-
item->parent_id, item->id, item->name,
68-
{ .array = &arr_offset }, item->type, item->detail,
69-
};
70-
err = callback(ts, &item_offset);
71-
}
72-
else if (item->type == THINGSET_TYPE_RECORDS) {
73-
struct thingset_records *rec = item->data.records;
74-
struct thingset_records rec_offset = {
75-
record_ptr + (size_t)rec->records,
76-
rec->record_size,
77-
rec->max_records,
78-
rec->num_records,
79-
rec->callback,
80-
};
81-
struct thingset_data_object item_offset = {
82-
item->parent_id, item->id, item->name, { .records = &rec_offset },
83-
item->type, item->detail,
84-
};
85-
err = callback(ts, &item_offset);
86-
}
87-
else {
88-
struct thingset_data_object item_offset = {
89-
item->parent_id, item->id, item->name, { .u8 = record_ptr + item->data.offset },
90-
item->type, item->detail,
91-
};
92-
err = callback(ts, &item_offset);
56+
int err = -EINVAL;
57+
58+
switch (item->type)
59+
{
60+
case THINGSET_TYPE_ARRAY:
61+
struct thingset_array *arr = item->data.array;
62+
struct thingset_array arr_offset = {
63+
{ .u8 = record_ptr + arr->elements.offset },
64+
arr->element_type,
65+
arr->decimals,
66+
arr->max_elements,
67+
arr->num_elements,
68+
};
69+
struct thingset_data_object array_item_offset = {
70+
item->parent_id, item->id, item->name,
71+
{ .array = &arr_offset }, item->type, item->detail,
72+
};
73+
err = callback(ts, &array_item_offset);
74+
break;
75+
76+
77+
case THINGSET_TYPE_RECORDS:
78+
struct thingset_records *rec = item->data.records;
79+
struct thingset_records rec_offset = {
80+
record_ptr + (size_t)rec->records,
81+
rec->record_size,
82+
rec->max_records,
83+
rec->num_records,
84+
rec->callback,
85+
};
86+
struct thingset_data_object record_item_offset = {
87+
item->parent_id, item->id, item->name, { .records = &rec_offset },
88+
item->type, item->detail,
89+
};
90+
err = callback(ts, &record_item_offset);
91+
break;
92+
93+
94+
default:
95+
struct thingset_data_object default_item_offset = {
96+
item->parent_id, item->id, item->name, { .u8 = record_ptr + item->data.offset },
97+
item->type, item->detail,
98+
};
99+
err = callback(ts, &default_item_offset);
100+
break;
101+
93102
}
103+
94104
return err;
95105
}
96106

0 commit comments

Comments
 (0)