GCC Code Coverage Report


Directory: ./
File: src/deserializers/object_deserializer.cpp
Date: 2024-07-09 12:21:25
Exec Total Coverage
Lines: 74 81 91.4%
Functions: 2 2 100.0%
Branches: 64 114 56.1%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2024 Muhammad Nawaz
3 * Licensed under the MIT License. See LICENSE file for more information.
4 */
5 // [ END OF LICENSE c6bd0f49d040fca8d8a9cb05868e66aa63f0e2e0 ]
6
7 #include "deserializers/object_deserializer.hpp"
8
9 165 ObjectDeserializer::ObjectDeserializer(const std::string& param_name, char start, bool skip_name, char kv_separator,
10 165 char vk_separator, bool is_deep_obj, const ObjKTMap& kt_map)
11 : BaseDeserializer(param_name, start, skip_name)
12 165 , kv_separator_(kv_separator)
13 165 , vk_separator_(vk_separator)
14 165 , is_deep_obj_(is_deep_obj)
15
1/2
✓ Branch 2 taken 165 times.
✗ Branch 3 not taken.
165 , kt_map_(kt_map)
16 {
17 165 }
18
19 38 std::string ObjectDeserializer::Deserialize(const char* beg, const char* const end)
20 {
21 38 const char* cursor = beg;
22
23
2/2
✓ Branch 1 taken 37 times.
✓ Branch 2 taken 1 times.
38 CheckNSkipStart(cursor);
24
25
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 1 times.
37 if (skip_name_ && !is_deep_obj_) {
26
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 CheckNSkipName(cursor, end);
27
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 CheckNSkipChar(cursor, end, '=');
28 }
29
30
1/2
✓ Branch 1 taken 37 times.
✗ Branch 2 not taken.
37 CheckData(cursor, end);
31
32 37 std::string ret;
33
1/2
✓ Branch 1 taken 37 times.
✗ Branch 2 not taken.
37 ret.reserve(static_cast<size_t>(end - beg + 128));
34
35
1/2
✓ Branch 1 taken 37 times.
✗ Branch 2 not taken.
37 ret.push_back('{');
36
37 37 std::string key;
38
1/2
✓ Branch 1 taken 37 times.
✗ Branch 2 not taken.
37 key.reserve(128);
39
40
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 35 times.
37 if (is_deep_obj_) {
41
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 times.
12 while (cursor < end) {
42
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 CheckNSkipName(cursor, end);
43
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 CheckNSkipChar(cursor, end, '[');
44 10 key.clear();
45
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 DeserializeKey(cursor, end, ']', key);
46
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 CheckNSkipChar(cursor, end, '=');
47 try {
48
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 auto param_type = kt_map_.at(key);
49
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 ret.append(key);
50
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 ret.push_back(':');
51
4/5
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
10 switch (param_type) {
52 4 case PrimitiveType::BOOLEAN:
53
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 DeserializeBoolean(cursor, end, ret);
54 4 break;
55
56 2 case PrimitiveType::INTEGER:
57
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 DeserializeInteger(cursor, end, ret);
58 2 break;
59
60 2 case PrimitiveType::NUMBER:
61
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 DeserializeNumber(cursor, end, ret);
62 2 break;
63
64 2 case PrimitiveType::STRING:
65
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 DeserializeString(cursor, end, vk_separator_, ret);
66 2 break;
67 default:
68 throw DeserializationException("Invalid primitive type for '" + param_name_ + "'");
69 }
70
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
10 if (*cursor == vk_separator_) {
71
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 ret.push_back(',');
72 8 ++cursor;
73 }
74 } catch (const std::out_of_range&) {
75 throw DeserializationException("Invalid format for '" + param_name_ + "'");
76 }
77 }
78 } else {
79
2/2
✓ Branch 0 taken 113 times.
✓ Branch 1 taken 24 times.
137 while (cursor < end) {
80 113 key.clear();
81
1/2
✓ Branch 1 taken 113 times.
✗ Branch 2 not taken.
113 DeserializeKey(cursor, end, kv_separator_, key);
82 try {
83
2/2
✓ Branch 1 taken 107 times.
✓ Branch 2 taken 6 times.
113 auto param_type = kt_map_.at(key);
84
1/2
✓ Branch 1 taken 107 times.
✗ Branch 2 not taken.
107 ret.append(key);
85
1/2
✓ Branch 1 taken 107 times.
✗ Branch 2 not taken.
107 ret.push_back(':');
86
4/5
✓ Branch 0 taken 37 times.
✓ Branch 1 taken 28 times.
✓ Branch 2 taken 17 times.
✓ Branch 3 taken 25 times.
✗ Branch 4 not taken.
107 switch (param_type) {
87 37 case PrimitiveType::BOOLEAN:
88
2/2
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 1 times.
37 DeserializeBoolean(cursor, end, ret);
89 36 break;
90
91 28 case PrimitiveType::INTEGER:
92
2/2
✓ Branch 1 taken 26 times.
✓ Branch 2 taken 2 times.
28 DeserializeInteger(cursor, end, ret);
93 26 break;
94
95 17 case PrimitiveType::NUMBER:
96
2/2
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 1 times.
17 DeserializeNumber(cursor, end, ret);
97 16 break;
98
99 25 case PrimitiveType::STRING:
100
2/2
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 1 times.
25 DeserializeString(cursor, end, vk_separator_, ret);
101 24 break;
102 default:
103 throw DeserializationException("Invalid primitive type for '" + param_name_ + "'");
104 }
105
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 24 times.
102 if (*cursor == vk_separator_) {
106
1/2
✓ Branch 1 taken 78 times.
✗ Branch 2 not taken.
78 ret.push_back(',');
107 78 ++cursor;
108 }
109
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 6 times.
11 } catch (const std::out_of_range&) {
110
3/6
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
6 throw DeserializationException("Invalid format for '" + param_name_ + "'");
111 6 }
112 }
113 }
114
115
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
26 CheckEnd(cursor, end);
116
117
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
26 ret.push_back('}');
118 52 return ret;
119 48 }
120