• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

igor-krechetov / hsmcpp / 4421697580

pending completion
4421697580

push

github

igor-krechetov
[0.30.1][r] added documentation for dispatchers and minor fixes

108 of 108 new or added lines in 6 files covered. (100.0%)

1781 of 2189 relevant lines covered (81.36%)

2447.75 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

49.6
/src/variant.cpp
1
// Copyright (C) 2021 Igor Krechetov
2
// Distributed under MIT license. See file LICENSE for details
3

4
#include "hsmcpp/variant.hpp"
5

6
#include <cstring>
7

8
namespace hsmcpp {
9

10
Variant Variant::make(const int8_t v) {
30✔
11
    return Variant(new int8_t(v), Type::BYTE_1);
30✔
12
}
13
Variant Variant::make(const int16_t v) {
30✔
14
    return Variant(new int16_t(v), Type::BYTE_2);
30✔
15
}
16
Variant Variant::make(const int32_t v) {
510✔
17
    return Variant(new int32_t(v), Type::BYTE_4);
510✔
18
}
19
Variant Variant::make(const int64_t v) {
30✔
20
    return Variant(new int64_t(v), Type::BYTE_8);
30✔
21
}
22
Variant Variant::make(const uint8_t v) {
30✔
23
    return Variant(new uint8_t(v), Type::UBYTE_1);
30✔
24
}
25
Variant Variant::make(const uint16_t v) {
30✔
26
    return Variant(new uint16_t(v), Type::UBYTE_2);
30✔
27
}
28
Variant Variant::make(const uint32_t v) {
30✔
29
    return Variant(new uint32_t(v), Type::UBYTE_4);
30✔
30
}
31
Variant Variant::make(const uint64_t v) {
30✔
32
    return Variant(new uint64_t(v), Type::UBYTE_8);
30✔
33
}
34
Variant Variant::make(const double v) {
70✔
35
    return Variant(new double(v), Type::DOUBLE);
70✔
36
}
37
Variant Variant::make(const bool v) {
190✔
38
    return Variant(new bool(v), Type::BOOL);
190✔
39
}
40
Variant Variant::make(const std::string& v) {
310✔
41
    return Variant(new std::string(v), Type::STRING);
620✔
42
}
43
Variant Variant::make(const char* v) {
190✔
44
    return make(std::string(v));
380✔
45
}
46
Variant Variant::make(const std::vector<char>& v) {
10✔
47
    return Variant(new std::vector<char>(v), Type::BYTEARRAY);
10✔
48
}
49
Variant Variant::make(const char* binaryData, const size_t bytesCount) {
10✔
50
    return Variant(new std::vector<char>(binaryData, &binaryData[bytesCount]), Type::BYTEARRAY);
10✔
51
}
52
Variant Variant::make(const VariantVector_t& v) {
30✔
53
    return Variant(new std::vector<Variant>(v), Type::VECTOR);
30✔
54
}
55
Variant Variant::make(const VariantList_t& v) {
40✔
56
    return Variant(new std::list<Variant>(v), Type::LIST);
40✔
57
}
58
Variant Variant::make(const VariantDict_t& v) {
30✔
59
    return Variant(new VariantDict_t(v), Type::DICTIONARY);
30✔
60
}
61
Variant Variant::make(const Variant& first, const Variant& second) {
×
62
    return Variant(new VariantPair_t(first, second), Type::PAIR);
×
63
}
64
Variant Variant::make(const Variant& v) {
×
65
    return v;
×
66
}
67

68
Variant::Variant(void* d, const Type t)
1,480✔
69
    : data(d)
1,480✔
70
    , type(t) {}
1,480✔
71

72
Variant::~Variant() {
6,610✔
73
    freeMemory();
6,610✔
74
}
6,610✔
75

76
Variant::Variant(const Variant& v) {
3,510✔
77
    *this = v;
3,510✔
78
}
3,510✔
79

80
Variant::Variant(Variant&& v) {
1,290✔
81
    data = v.data;
1,290✔
82
    type = v.type;
1,290✔
83

84
    v.data = nullptr;
1,290✔
85
    v.type = Type::UNKNOWN;
1,290✔
86
}
1,290✔
87

88
Variant::Variant(const char* v)
70✔
89
// NOTE: false-positive. thinks that ':' is arithmetic operation
90
// cppcheck-suppress misra-c2012-10.4
91
    : Variant(std::string(v)) {}
140✔
92

93
Variant::Variant(const char* binaryData, const size_t bytesCount)
10✔
94
// NOTE: false-positive. thinks that ':' is arithmetic operation
95
// cppcheck-suppress misra-c2012-10.4
96
    : Variant(std::vector<char>(binaryData, &binaryData[bytesCount])) {}
30✔
97

98
Variant& Variant::operator=(const Variant& v) {
3,550✔
99
    if (false == isSameObject(v)) {
3,550✔
100
        switch (v.type) {
3,550✔
101
            case Type::BYTE_1:
80✔
102
                *this = *v.value<int8_t>();
80✔
103
                break;
80✔
104
            case Type::BYTE_2:
60✔
105
                *this = *v.value<int16_t>();
60✔
106
                break;
60✔
107
            case Type::BYTE_4:
1,760✔
108
                *this = *v.value<int32_t>();
1,760✔
109
                break;
1,760✔
110
            case Type::BYTE_8:
40✔
111
                *this = *v.value<int64_t>();
40✔
112
                break;
40✔
113

114
            case Type::UBYTE_1:
20✔
115
                *this = *v.value<uint8_t>();
20✔
116
                break;
20✔
117
            case Type::UBYTE_2:
20✔
118
                *this = *v.value<uint16_t>();
20✔
119
                break;
20✔
120
            case Type::UBYTE_4:
20✔
121
                *this = *v.value<uint32_t>();
20✔
122
                break;
20✔
123
            case Type::UBYTE_8:
20✔
124
                *this = *v.value<uint64_t>();
20✔
125
                break;
20✔
126

127
            case Type::DOUBLE:
110✔
128
                *this = *v.value<double>();
110✔
129
                break;
110✔
130
            case Type::BOOL:
440✔
131
                *this = *v.value<bool>();
440✔
132
                break;
440✔
133

134
            case Type::STRING:
980✔
135
                *this = *v.value<std::string>();
980✔
136
                break;
137

138
            case Type::BYTEARRAY:
×
139
                *this = *v.value<std::vector<char>>();
×
140
                break;
141

142
            case Type::VECTOR:
×
143
                *this = *v.value<std::vector<Variant>>();
×
144
                break;
×
145

146
            case Type::LIST:
×
147
                *this = *v.value<std::list<Variant>>();
×
148
                break;
×
149

150
            case Type::DICTIONARY:
×
151
                *this = *v.value<VariantDict_t>();
×
152
                break;
153

154
            case Type::PAIR:
×
155
                *this = *v.value<VariantPair_t>();
×
156
                break;
×
157

158
            default:
×
159
                freeMemory();
×
160
                break;
×
161
        }
162
    }
163

164
    return *this;
3,550✔
165
}
166

167
Variant& Variant::operator=(Variant&& v) {
×
168
    data = v.data;
×
169
    type = v.type;
×
170

171
    v.data = nullptr;
×
172
    v.type = Type::UNKNOWN;
×
173

174
    return *this;
×
175
}
176

177
Variant::operator bool() const {
×
178
    return ((nullptr != data) && (Type::UNKNOWN != type));
×
179
}
180

181
bool Variant::operator!=(const Variant& val) const {
110✔
182
    return !(*this == val);
110✔
183
}
184

185
bool Variant::operator>(const Variant& val) const {
110✔
186
    bool isGreater = false;
110✔
187

188
    if (isNumeric() && val.isNumeric()) {
110✔
189
        if ((Type::DOUBLE == type) || (Type::DOUBLE == val.type)) {
110✔
190
            isGreater = toDouble() > val.toDouble();
×
191
        } else if (isUnsignedNumeric() || val.isUnsignedNumeric()) {
110✔
192
            isGreater = toUInt64() > val.toUInt64();
×
193
        } else {
194
            isGreater = toInt64() > val.toInt64();
110✔
195
        }
196
    } else if ((Type::STRING == type) || (Type::STRING == val.type)) {
×
197
        isGreater = (*value<std::string>() > *(val.value<std::string>()));
×
198
    } else if ((Type::BYTEARRAY == type) || (Type::BYTEARRAY == val.type)) {
×
199
        std::vector<char>* left = value<std::vector<char>>();
×
200
        std::vector<char>* right = val.value<std::vector<char>>();
×
201

202
        isGreater = (left->size() > right->size());
×
203
    } else if (Type::VECTOR == val.type) {
×
204
        std::vector<Variant>* left = value<std::vector<Variant>>();
×
205
        std::vector<Variant>* right = val.value<std::vector<Variant>>();
×
206

207
        isGreater = (left->size() > right->size());
×
208
    } else if (Type::LIST == val.type) {
×
209
        std::list<Variant>* left = value<std::list<Variant>>();
×
210
        std::list<Variant>* right = val.value<std::list<Variant>>();
×
211

212
        isGreater = (left->size() > right->size());
×
213
    } else if ((Type::BOOL == type) || (Type::BOOL == val.type)) {
×
214
        isGreater = (*value<bool>() > *(val.value<bool>()));
×
215
    } else {
216
        // NOTE: ignore
217
    }
218

219
    return isGreater;
110✔
220
}
221

222
bool Variant::operator>=(const Variant& val) const {
×
223
    return (*this == val) || (*this > val);
×
224
}
225

226
bool Variant::operator<(const Variant& val) const {
110✔
227
    return (*this != val) && !(*this > val);
110✔
228
}
229

230
bool Variant::operator<=(const Variant& val) const {
×
231
    return (*this == val) || !(*this > val);
×
232
}
233

234
bool Variant::operator==(const Variant& val) const {
270✔
235
    bool equal = false;
270✔
236

237
    if (val.type == type) {
270✔
238
        switch (type) {
270✔
239
            case Type::BYTE_1:
×
240
                equal = (*value<int8_t>() == *val.value<int8_t>());
×
241
                break;
×
242
            case Type::BYTE_2:
×
243
                equal = (*value<int16_t>() == *val.value<int16_t>());
×
244
                break;
×
245
            case Type::BYTE_4:
190✔
246
                equal = (*value<int32_t>() == *val.value<int32_t>());
190✔
247
                break;
190✔
248
            case Type::BYTE_8:
×
249
                equal = (*value<int64_t>() == *val.value<int64_t>());
×
250
                break;
×
251

252
            case Type::UBYTE_1:
×
253
                equal = (*value<uint8_t>() == *val.value<uint8_t>());
×
254
                break;
×
255
            case Type::UBYTE_2:
×
256
                equal = (*value<uint16_t>() == *val.value<uint16_t>());
×
257
                break;
×
258
            case Type::UBYTE_4:
×
259
                equal = (*value<uint32_t>() == *val.value<uint32_t>());
×
260
                break;
×
261
            case Type::UBYTE_8:
×
262
                equal = (*value<uint64_t>() == *val.value<uint64_t>());
×
263
                break;
×
264

265
            case Type::DOUBLE:
×
266
                equal = (*value<double>() == *val.value<double>());
×
267
                break;
×
268
            case Type::BOOL:
×
269
                equal = (*value<bool>() == *val.value<bool>());
×
270
                break;
×
271

272
            case Type::STRING:
80✔
273
                equal = (*value<std::string>() == *val.value<std::string>());
80✔
274
                break;
80✔
275

276
            case Type::BYTEARRAY:
×
277
                equal = (*value<std::vector<char>>() == *val.value<std::vector<char>>());
×
278
                break;
×
279

280
            case Type::VECTOR:
×
281
                equal = (*value<std::vector<Variant>>() == *val.value<std::vector<Variant>>());
×
282
                break;
×
283

284
            case Type::LIST:
×
285
                equal = (*value<std::list<Variant>>() == *val.value<std::list<Variant>>());
×
286
                break;
×
287

288
            case Type::DICTIONARY: {
×
289
                VariantDict_t* left = value<VariantDict_t>();
×
290
                VariantDict_t* right = val.value<VariantDict_t>();
×
291

292
                if (left->size() == right->size()) {
×
293
                    equal = true;
×
294

295
                    for (auto itLeft = left->begin(); (itLeft != left->end()) && (true == equal); ++itLeft) {
×
296
                        auto itRight = right->find(itLeft->first);
×
297

298
                        if (right->end() != itRight) {
×
299
                            equal = (itLeft->second == itRight->second);
×
300
                        } else {
301
                            equal = false;
302
                        }
303
                    }
304
                }
305
                break;
306
            }
307

308
            case Type::PAIR: {
×
309
                VariantPair_t* left = value<VariantPair_t>();
×
310
                VariantPair_t* right = val.value<VariantPair_t>();
×
311

312
                equal = ((left->first == right->first) && (left->second == right->second));
×
313
                break;
314
            }
315

316
            case Type::UNKNOWN:
×
317
                equal = true;
×
318
                break;
×
319

320
            default:
321
                break;
322
        }
323
    }
324

325
    return equal;
270✔
326
}
327

328
bool Variant::isString() const {
190✔
329
    return (type == Type::STRING);
190✔
330
}
331

332
bool Variant::isByteArray() const {
40✔
333
    return (type == Type::BYTEARRAY);
40✔
334
}
335

336
bool Variant::isVector() const {
90✔
337
    return (type == Type::VECTOR);
90✔
338
}
339

340
bool Variant::isList() const {
110✔
341
    return (type == Type::LIST);
110✔
342
}
343

344
bool Variant::isDictionary() const {
50✔
345
    return (type == Type::DICTIONARY);
50✔
346
}
347

348
bool Variant::isPair() const {
×
349
    return (type == Type::PAIR);
×
350
}
351

352
bool Variant::isNumeric() const {
780✔
353
    bool numeric = false;
780✔
354

355
    switch (type) {
780✔
356
        case Type::BYTE_1:
357
        case Type::BYTE_2:
358
        case Type::BYTE_4:
359
        case Type::BYTE_8:
360
        case Type::UBYTE_1:
361
        case Type::UBYTE_2:
362
        case Type::UBYTE_4:
363
        case Type::UBYTE_8:
364
        case Type::DOUBLE:
365
            numeric = true;
366
            break;
367

368
        case Type::BOOL:
60✔
369
        case Type::STRING:
60✔
370
        case Type::BYTEARRAY:
60✔
371
        case Type::VECTOR:
60✔
372
        case Type::LIST:
60✔
373
        case Type::DICTIONARY:
60✔
374
        case Type::PAIR:
60✔
375
        default:
60✔
376
            numeric = false;
60✔
377
            break;
60✔
378
    }
379

380
    return numeric;
780✔
381
}
382

383
bool Variant::isSignedNumeric() const {
120✔
384
    bool isSigned = false;
120✔
385

386
    switch (type) {
120✔
387
        case Type::BYTE_1:
388
        case Type::BYTE_2:
389
        case Type::BYTE_4:
390
        case Type::BYTE_8:
391
        case Type::DOUBLE:
392
            isSigned = true;
393
            break;
394

395
        default:
×
396
            isSigned = false;
×
397
            break;
×
398
    }
399

400
    return isSigned;
120✔
401
}
402

403
bool Variant::isUnsignedNumeric() const {
340✔
404
    bool isUnsigned = false;
340✔
405

406
    switch (type) {
340✔
407
        case Type::UBYTE_1:
408
        case Type::UBYTE_2:
409
        case Type::UBYTE_4:
410
        case Type::UBYTE_8:
411
            isUnsigned = true;
412
            break;
413

414
        default:
220✔
415
            isUnsigned = false;
220✔
416
            break;
220✔
417
    }
418

419
    return isUnsigned;
340✔
420
}
421

422
bool Variant::isBool() const {
380✔
423
    return (type == Type::BOOL) || (true == isNumeric());
380✔
424
}
425

426
std::string Variant::toString() const {
260✔
427
    std::string result;
260✔
428

429
    switch (getType()) {
260✔
430
        case Type::BYTE_1:
×
431
            result = std::to_string(*(value<int8_t>()));
×
432
            break;
×
433
        case Type::BYTE_2:
×
434
            result = std::to_string(*(value<int16_t>()));
×
435
            break;
×
436
        case Type::BYTE_4:
×
437
            result = std::to_string(*(value<int32_t>()));
×
438
            break;
×
439
        case Type::BYTE_8:
×
440
            result = std::to_string(*(value<int64_t>()));
×
441
            break;
×
442
        case Type::UBYTE_1:
×
443
            result = std::to_string(*(value<uint8_t>()));
×
444
            break;
×
445
        case Type::UBYTE_2:
×
446
            result = std::to_string(*(value<uint16_t>()));
×
447
            break;
×
448
        case Type::UBYTE_4:
×
449
            result = std::to_string(*(value<uint32_t>()));
×
450
            break;
×
451
        case Type::UBYTE_8:
×
452
            result = std::to_string(*(value<uint64_t>()));
×
453
            break;
×
454
        case Type::DOUBLE:
×
455
            result = std::to_string(*(value<double>()));
×
456
            break;
×
457
        case Type::BOOL:
×
458
            result = (*(value<bool>()) ? "true" : "false");
×
459
            break;
460
        case Type::STRING:
260✔
461
            result = *(value<std::string>());
260✔
462
            break;
463
        case Type::BYTEARRAY: {
×
464
            std::vector<char>* val = value<std::vector<char>>();
×
465

466
            result.assign(val->data(), val->size());
260✔
467
            break;
468
        }
469
        case Type::VECTOR: {
×
470
            std::vector<Variant>* val = value<std::vector<Variant>>();
×
471

472
            for (auto it = val->begin(); it != val->end(); ++it) {
×
473
                if (false == result.empty()) {
×
474
                    result.append(", ");
×
475
                }
476

477
                result += it->toString();
×
478
            }
479
            break;
480
        }
481
        case Type::LIST: {
×
482
            std::list<Variant>* val = value<std::list<Variant>>();
×
483

484
            for (auto it = val->begin(); it != val->end(); ++it) {
×
485
                if (false == result.empty()) {
×
486
                    result.append(", ");
×
487
                }
488

489
                result += it->toString();
×
490
            }
491
            break;
492
        }
493
        case Type::DICTIONARY: {
×
494
            VariantDict_t* dict = value<VariantDict_t>();
×
495

496
            for (auto it = dict->begin(); it != dict->end(); ++it) {
×
497
                result += it->first.toString().append("=[").append(it->second.toString()).append("], ");
×
498
            }
499
            break;
500
        }
501
        case Type::PAIR:
×
502
            result = std::string("(") + value<VariantPair_t>()->first.toString() + std::string(", ") +
×
503
                     value<VariantPair_t>()->second.toString() + std::string(")");
×
504
            break;
×
505
        default:
506
            break;
507
    }
508

509
    return result;
260✔
510
}
×
511

512
std::vector<char> Variant::toByteArray() const {
40✔
513
    std::vector<char> result;
40✔
514

515
    switch (getType()) {
40✔
516
        case Type::BYTE_1:
×
517
        case Type::UBYTE_1:
×
518
            result.resize(sizeof(int8_t));
×
519
            static_cast<void>(std::memcpy(result.data(), data, sizeof(int8_t)));
×
520
            break;
521
        case Type::BYTE_2:
×
522
        case Type::UBYTE_2:
×
523
            result.resize(sizeof(int16_t));
×
524
            static_cast<void>(memcpy(result.data(), data, sizeof(int16_t)));
×
525
            break;
526
        case Type::BYTE_4:
×
527
        case Type::UBYTE_4:
×
528
            result.resize(sizeof(int32_t));
×
529
            static_cast<void>(memcpy(result.data(), data, sizeof(int32_t)));
×
530
            break;
531
        case Type::BYTE_8:
×
532
        case Type::UBYTE_8:
×
533
            result.resize(sizeof(int64_t));
×
534
            static_cast<void>(memcpy(result.data(), data, sizeof(int64_t)));
×
535
            break;
536
        case Type::DOUBLE:
×
537
            result.resize(sizeof(double));
×
538
            static_cast<void>(memcpy(result.data(), data, sizeof(double)));
×
539
            break;
540
        case Type::BOOL:
×
541
            result.push_back((*(value<bool>()) == true) ? 1 : 0);
×
542
            break;
×
543
        case Type::STRING: {
×
544
            std::string* val = value<std::string>();
×
545

546
            result.assign(val->begin(), val->end());
×
547
            break;
548
        }
549
        case Type::BYTEARRAY:
40✔
550
            result = *(value<std::vector<char>>());
40✔
551
            break;
552
        case Type::VECTOR:
553
            // TODO
554
            break;
555
        case Type::LIST:
556
            // TODO
557
            break;
558
        case Type::DICTIONARY: {
×
559
            VariantDict_t* dict = value<VariantDict_t>();
×
560

561
            for (auto it = dict->begin(); it != dict->end(); ++it) {
×
562
                std::vector<char> curValue = it->second.toByteArray();
×
563

564
                (void)result.insert(result.end(), curValue.begin(), curValue.end());
×
565
            }
×
566
            break;
567
        }
568
        case Type::PAIR: {
×
569
            std::vector<char> secondValue = value<VariantPair_t>()->second.toByteArray();
×
570

571
            result = value<VariantPair_t>()->first.toByteArray();
×
572
            (void)result.insert(result.end(), secondValue.begin(), secondValue.end());
×
573
            break;
×
574
        }
×
575
        default:
576
            break;
577
    }
578

579
    return result;
40✔
580
}
×
581

582
int64_t Variant::toInt64() const {
720✔
583
    int64_t result = 0;
720✔
584

585
    switch (type) {
720✔
586
        case Type::BYTE_1:
30✔
587
            result = static_cast<int64_t>(*value<int8_t>());
30✔
588
            break;
30✔
589
        case Type::BYTE_2:
30✔
590
            result = static_cast<int64_t>(*value<int16_t>());
30✔
591
            break;
30✔
592
        case Type::BYTE_4:
610✔
593
            result = static_cast<int64_t>(*value<int32_t>());
610✔
594
            break;
610✔
595
        case Type::BYTE_8:
30✔
596
            result = *value<int64_t>();
30✔
597
            break;
30✔
598

599
        case Type::UBYTE_1:
×
600
            result = static_cast<int64_t>(*value<uint8_t>());
×
601
            break;
×
602
        case Type::UBYTE_2:
×
603
            result = static_cast<int64_t>(*value<uint16_t>());
×
604
            break;
×
605
        case Type::UBYTE_4:
×
606
            result = static_cast<int64_t>(*value<uint32_t>());
×
607
            break;
×
608
        case Type::UBYTE_8:
×
609
            result = static_cast<int64_t>(*value<uint64_t>());
×
610
            break;
×
611

612
        case Type::DOUBLE:
10✔
613
            result = static_cast<int64_t>(*value<double>());
10✔
614
            break;
10✔
615

616
        case Type::BOOL:
617
        case Type::STRING:
618
        case Type::BYTEARRAY:
619
        case Type::VECTOR:
620
        case Type::LIST:
621
        case Type::DICTIONARY:
622
        case Type::PAIR:
623
        default:
624
            break;
625
    }
626

627
    return result;
720✔
628
}
629

630
uint64_t Variant::toUInt64() const {
120✔
631
    uint64_t result = 0;
120✔
632

633
    switch (type) {
120✔
634
        case Type::BYTE_1:
×
635
            result = static_cast<uint64_t>(*value<int8_t>());
×
636
            break;
×
637
        case Type::BYTE_2:
×
638
            result = static_cast<uint64_t>(*value<int16_t>());
×
639
            break;
×
640
        case Type::BYTE_4:
×
641
            result = static_cast<uint64_t>(*value<int32_t>());
×
642
            break;
×
643
        case Type::BYTE_8:
×
644
            result = static_cast<uint64_t>(*value<int64_t>());
×
645
            break;
×
646

647
        case Type::UBYTE_1:
30✔
648
            result = static_cast<uint64_t>(*value<uint8_t>());
30✔
649
            break;
30✔
650
        case Type::UBYTE_2:
30✔
651
            result = static_cast<uint64_t>(*value<uint16_t>());
30✔
652
            break;
30✔
653
        case Type::UBYTE_4:
30✔
654
            result = static_cast<uint64_t>(*value<uint32_t>());
30✔
655
            break;
30✔
656
        case Type::UBYTE_8:
30✔
657
            result = *value<uint64_t>();
30✔
658
            break;
30✔
659

660
        case Type::DOUBLE:
×
661
            result = static_cast<uint64_t>(*value<double>());
×
662
            break;
×
663

664
        case Type::BOOL:
665
        case Type::STRING:
666
        case Type::BYTEARRAY:
667
        case Type::VECTOR:
668
        case Type::LIST:
669
        case Type::DICTIONARY:
670
        case Type::PAIR:
671
        default:
672
            break;
673
    }
674

675
    return result;
120✔
676
}
677

678
double Variant::toDouble() const {
50✔
679
    double result = 0.0;
50✔
680

681
    switch (type) {
50✔
682
        case Type::BYTE_1:
×
683
            result = static_cast<double>(*value<int8_t>());
×
684
            break;
×
685
        case Type::BYTE_2:
×
686
            result = static_cast<double>(*value<int16_t>());
×
687
            break;
×
688
        case Type::BYTE_4:
×
689
            result = static_cast<double>(*value<int32_t>());
×
690
            break;
×
691
        case Type::BYTE_8:
×
692
            result = static_cast<double>(*value<int64_t>());
×
693
            break;
×
694

695
        case Type::UBYTE_1:
×
696
            result = static_cast<double>(*value<uint8_t>());
×
697
            break;
×
698
        case Type::UBYTE_2:
×
699
            result = static_cast<double>(*value<uint16_t>());
×
700
            break;
×
701
        case Type::UBYTE_4:
×
702
            result = static_cast<double>(*value<uint32_t>());
×
703
            break;
×
704
        case Type::UBYTE_8:
×
705
            result = static_cast<double>(*value<uint64_t>());
×
706
            break;
×
707

708
        case Type::DOUBLE:
50✔
709
            result = *value<double>();
50✔
710
            break;
50✔
711

712
        case Type::BOOL:
713
        case Type::STRING:
714
        case Type::BYTEARRAY:
715
        case Type::VECTOR:
716
        case Type::LIST:
717
        case Type::DICTIONARY:
718
        case Type::PAIR:
719
        default:
720
            break;
721
    }
722

723
    return result;
50✔
724
}
725

726
bool Variant::toBool() const {
220✔
727
    bool result = false;
220✔
728

729
    if (Type::BOOL == type) {
220✔
730
        result = *value<bool>();
180✔
731
    } else {
732
        result = (0 != toInt64());
40✔
733
    }
734

735
    return result;
220✔
736
}
737

738
bool Variant::isSameObject(const Variant& val) const {
3,550✔
739
    return (val.data == data) && (nullptr != data);
3,550✔
740
}
741

742
void Variant::freeMemory() {
10,490✔
743
    switch (type) {
10,490✔
744
        case Type::BYTE_1:
120✔
745
            delete static_cast<int8_t*>(data);
120✔
746
            break;
747
        case Type::BYTE_2:
100✔
748
            delete static_cast<int16_t*>(data);
100✔
749
            break;
750
        case Type::BYTE_4:
2,340✔
751
            delete static_cast<int32_t*>(data);
2,340✔
752
            break;
753
        case Type::BYTE_8:
80✔
754
            delete static_cast<int64_t*>(data);
80✔
755
            break;
756

757
        case Type::UBYTE_1:
60✔
758
            delete static_cast<uint8_t*>(data);
60✔
759
            break;
760
        case Type::UBYTE_2:
60✔
761
            delete static_cast<uint16_t*>(data);
60✔
762
            break;
763
        case Type::UBYTE_4:
60✔
764
            delete static_cast<uint32_t*>(data);
60✔
765
            break;
766
        case Type::UBYTE_8:
60✔
767
            delete static_cast<uint64_t*>(data);
60✔
768
            break;
769

770
        case Type::DOUBLE:
190✔
771
            delete static_cast<double*>(data);
190✔
772
            break;
773
        case Type::BOOL:
670✔
774
            delete static_cast<bool*>(data);
670✔
775
            break;
776

777
        case Type::STRING:
1,370✔
778
            delete static_cast<std::string*>(data);
2,740✔
779
            break;
780

781
        case Type::BYTEARRAY:
40✔
782
            delete static_cast<std::vector<char>*>(data);
80✔
783
            break;
784

785
        case Type::VECTOR:
70✔
786
            delete static_cast<std::vector<Variant>*>(data);
70✔
787
            break;
788

789
        case Type::LIST:
90✔
790
            delete static_cast<std::list<Variant>*>(data);
90✔
791
            break;
792

793
        case Type::DICTIONARY:
50✔
794
            delete static_cast<VariantDict_t*>(data);
100✔
795
            break;
796

797
        case Type::PAIR:
×
798
            delete static_cast<VariantPair_t*>(data);
×
799
            break;
800

801
        default:  // Type::UNKNOWN
802
            break;
803
    }
804

805
    data = nullptr;
10,490✔
806
    type = Type::UNKNOWN;
10,490✔
807
}
10,490✔
808

809
}  // namespace hsmcpp
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc