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

igor-krechetov / hsmcpp / 4815527644

pending completion
4815527644

push

github

igor-krechetov
[0.35.0][r] Variant refactoring and custom types support (BREAKS INTERFACE)

329 of 329 new or added lines in 2 files covered. (100.0%)

3586 of 7885 relevant lines covered (45.48%)

49379.18 hits per line

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

98.56
/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
#include "hsmcpp/os/os.hpp"
9

10
// cppcheck-suppress misra-c2012-20.7 ; parentheses are not needed
11
#define IMPL_CONSTRUCTOR(_val_type, _internal_type) \
12
  Variant::Variant(const _val_type v) {             \
13
    assign(v, _internal_type);                      \
14
  }
15

16
// cppcheck-suppress misra-c2012-20.7 ; parentheses are not needed
17
#define IMPL_OPERATOR_ASSIGN(_val_type, _internal_type) \
18
  Variant& Variant::operator=(const _val_type v) {      \
19
    assign(v, _internal_type);                          \
20
    return *this;                                       \
21
  }
22

23
// cppcheck-suppress misra-c2012-20.7 ; parentheses are not needed
24
#define IMPL_MAKE(_val_type)                 \
25
  Variant Variant::make(const _val_type v) { \
26
    return Variant(v);                       \
27
  }
28

29
namespace hsmcpp {
30

31
// =================================================================================================================
32
// make()
33
IMPL_MAKE(int8_t)
130✔
34
IMPL_MAKE(int16_t)
160✔
35
IMPL_MAKE(int32_t)
640✔
36
IMPL_MAKE(int64_t)
130✔
37
IMPL_MAKE(uint8_t)
130✔
38
IMPL_MAKE(uint16_t)
130✔
39
IMPL_MAKE(uint32_t)
130✔
40
IMPL_MAKE(uint64_t)
130✔
41
IMPL_MAKE(double)
160✔
42
IMPL_MAKE(bool)
270✔
43
IMPL_MAKE(std::string&)
220✔
44
IMPL_MAKE(ByteArray_t&)
120✔
45
IMPL_MAKE(VariantVector_t&)
130✔
46
IMPL_MAKE(VariantList_t&)
250✔
47
IMPL_MAKE(VariantMap_t&)
130✔
48
IMPL_MAKE(VariantPair_t&)
130✔
49
IMPL_MAKE(Variant&)
10✔
50

51
Variant Variant::make(const char* v) {
280✔
52
    return Variant(v);
280✔
53
}
54

55
Variant Variant::make(const char* binaryData, const size_t bytesCount) {
10✔
56
    return Variant(binaryData, bytesCount);
10✔
57
}
58

59
// =================================================================================================================
60
// Constructors
61
Variant::Variant(const std::shared_ptr<void>& d, const Type t)
80✔
62
    : data(d)
160✔
63
    , type(t) {}
80✔
64

65
Variant::~Variant() {
35,960✔
66
    freeMemory();
35,960✔
67
}
35,960✔
68

69
Variant::Variant(const Variant& v) {
27,690✔
70
    *this = v;
27,690✔
71
}
27,690✔
72

73
Variant::Variant(Variant&& v)
1,580✔
74
    : data(v.data)
3,160✔
75
    , type(v.type)
1,580✔
76
    , memoryAllocator(v.memoryAllocator)
1,580✔
77
    , compareOperator(v.compareOperator) {
1,580✔
78
    v.data.reset();
1,580✔
79
    v.type = Type::UNKNOWN;
1,580✔
80
    v.memoryAllocator = nullptr;
1,580✔
81
    v.compareOperator = nullptr;
1,580✔
82
}
1,580✔
83

84
IMPL_CONSTRUCTOR(int8_t, Type::BYTE_1)
230✔
85
IMPL_CONSTRUCTOR(int16_t, Type::BYTE_2)
210✔
86
IMPL_CONSTRUCTOR(int32_t, Type::BYTE_4)
1,240✔
87
IMPL_CONSTRUCTOR(int64_t, Type::BYTE_8)
200✔
88
IMPL_CONSTRUCTOR(uint8_t, Type::UBYTE_1)
180✔
89
IMPL_CONSTRUCTOR(uint16_t, Type::UBYTE_2)
180✔
90
IMPL_CONSTRUCTOR(uint32_t, Type::UBYTE_4)
250✔
91
IMPL_CONSTRUCTOR(uint64_t, Type::UBYTE_8)
200✔
92
IMPL_CONSTRUCTOR(double, Type::DOUBLE)
240✔
93
IMPL_CONSTRUCTOR(bool, Type::BOOL)
430✔
94
IMPL_CONSTRUCTOR(std::string&, Type::STRING)
1,210✔
95
IMPL_CONSTRUCTOR(ByteArray_t&, Type::BYTEARRAY)
210✔
96
IMPL_CONSTRUCTOR(VariantVector_t&, Type::VECTOR)
190✔
97
IMPL_CONSTRUCTOR(VariantList_t&, Type::LIST)
380✔
98
IMPL_CONSTRUCTOR(VariantMap_t&, Type::MAP)
220✔
99
IMPL_CONSTRUCTOR(VariantPair_t&, Type::PAIR)
260✔
100

101
Variant::Variant(const char* v)
890✔
102
    // cppcheck-suppress misra-c2012-10.4 : false-positive. thinks that ':' is arithmetic operation
103
    : Variant(std::string(v)) {}
1,780✔
104

105
Variant::Variant(const char* binaryData, const size_t bytesCount)
20✔
106
    // cppcheck-suppress misra-c2012-10.4 : false-positive. thinks that ':' is arithmetic operation
107
    : Variant(ByteArray_t(binaryData, &binaryData[bytesCount])) {}
40✔
108

109
// =================================================================================================================
110
// Assign operators
111
IMPL_OPERATOR_ASSIGN(int8_t, Type::BYTE_1)
10✔
112
IMPL_OPERATOR_ASSIGN(int16_t, Type::BYTE_2)
10✔
113
IMPL_OPERATOR_ASSIGN(int32_t, Type::BYTE_4)
20✔
114
IMPL_OPERATOR_ASSIGN(int64_t, Type::BYTE_8)
10✔
115
IMPL_OPERATOR_ASSIGN(uint8_t, Type::UBYTE_1)
10✔
116
IMPL_OPERATOR_ASSIGN(uint16_t, Type::UBYTE_2)
10✔
117
IMPL_OPERATOR_ASSIGN(uint32_t, Type::UBYTE_4)
10✔
118
IMPL_OPERATOR_ASSIGN(uint64_t, Type::UBYTE_8)
10✔
119
IMPL_OPERATOR_ASSIGN(double, Type::DOUBLE)
10✔
120
IMPL_OPERATOR_ASSIGN(bool, Type::BOOL)
10✔
121
IMPL_OPERATOR_ASSIGN(std::string&, Type::STRING)
10✔
122
IMPL_OPERATOR_ASSIGN(ByteArray_t&, Type::BYTEARRAY)
10✔
123
IMPL_OPERATOR_ASSIGN(VariantVector_t&, Type::VECTOR)
10✔
124
IMPL_OPERATOR_ASSIGN(VariantList_t&, Type::LIST)
20✔
125
IMPL_OPERATOR_ASSIGN(VariantMap_t&, Type::MAP)
20✔
126
IMPL_OPERATOR_ASSIGN(VariantPair_t&, Type::PAIR)
10✔
127

128
Variant& Variant::operator=(const char* v) {
10✔
129
    assign(std::string(v), Type::STRING);
10✔
130
    return *this;
10✔
131
}
132

133
Variant& Variant::operator=(const Variant& v) {
27,950✔
134
    if (false == isSameObject(v)) {
27,950✔
135
        if ((Type::UNKNOWN != v.type) && (v.memoryAllocator)) {
27,950✔
136
            data = v.memoryAllocator(v.data.get());
27,980✔
137
            type = v.type;
27,940✔
138
            memoryAllocator = v.memoryAllocator;
27,940✔
139
            compareOperator = v.compareOperator;
27,940✔
140
        } else {
141
            freeMemory();
10✔
142
        }
143
    }
144

145
    return *this;
27,950✔
146
}
147

148
Variant& Variant::operator=(Variant&& v) {
2,290✔
149
    if (false == isSameObject(v)) {
2,290✔
150
        data = v.data;
2,290✔
151
        type = v.type;
2,290✔
152
        memoryAllocator = v.memoryAllocator;
2,290✔
153
        compareOperator = v.compareOperator;
2,290✔
154

155
        v.data.reset();
2,290✔
156
        v.type = Type::UNKNOWN;
2,290✔
157
        v.memoryAllocator = nullptr;
2,290✔
158
        v.compareOperator = nullptr;
2,290✔
159
    }
160

161
    return *this;
2,290✔
162
}
163

164
// =================================================================================================================
165
Variant::operator bool() const {
10✔
166
    return (data && (Type::UNKNOWN != type));
10✔
167
}
168

169
bool Variant::operator!=(const Variant& val) const {
2,660✔
170
    return !(*this == val);
2,660✔
171
}
172

173
bool Variant::operator>(const Variant& val) const {
1,040✔
174
    bool isGreater = false;
1,040✔
175

176
    if ((data != val.data) && (data) && (val.data)) {
1,040✔
177
        if (isNumeric() && val.isNumeric()) {
1,040✔
178
            if ((Type::DOUBLE == type) || (Type::DOUBLE == val.type)) {
680✔
179
                isGreater = toDouble() > val.toDouble();
40✔
180
            } else if (isUnsignedNumeric() || val.isUnsignedNumeric()) {
640✔
181
                isGreater = toUInt64() > val.toUInt64();
180✔
182
            } else {
183
                isGreater = toInt64() > val.toInt64();
460✔
184
            }
185
        } else if (type == val.type) {
360✔
186
            isGreater = (1 == compareOperator(data.get(), val.data.get()));
720✔
187
        } else {
188
            // do nothing
189
        }
190
    }
191

192
    return isGreater;
1,040✔
193
}
194

195
bool Variant::operator>=(const Variant& val) const {
360✔
196
    return (*this == val) || (*this > val);
360✔
197
}
198

199
bool Variant::operator<(const Variant& val) const {
2,650✔
200
    return (*this != val) && !(*this > val);
2,650✔
201
}
202

203
bool Variant::operator<=(const Variant& val) const {
360✔
204
    return (*this == val) || !(*this > val);
360✔
205
}
206

207
bool Variant::operator==(const Variant& val) const {
4,520✔
208
    bool equal = false;
4,520✔
209

210
    if (data != val.data) {
4,520✔
211
        if ((data) && (val.data)) {
4,510✔
212
            if (isNumeric() && val.isNumeric()) {
4,510✔
213
                if ((Type::DOUBLE == type) || (Type::DOUBLE == val.type)) {
2,380✔
214
                    // compare with precision for double
215
                    equal = (std::abs(toDouble() - val.toDouble()) < 0.00000001);
70✔
216
                } else if (isUnsignedNumeric() || val.isUnsignedNumeric()) {
2,310✔
217
                    equal = (toUInt64() == val.toUInt64());
260✔
218
                } else {
219
                    equal = (toInt64() == val.toInt64());
2,050✔
220
                }
221
            } else if (val.type == type) {
2,130✔
222
                equal = (0 == compareOperator(data.get(), val.data.get()));
4,240✔
223
            } else {
224
                // do nothing
225
            }
226
        }
227
    } else {
228
        equal = true;
229
    }
230

231
    return equal;
4,520✔
232
}
233

234
void Variant::clear() {
50✔
235
    freeMemory();
50✔
236
}
50✔
237

238
bool Variant::isEmpty() const {
450✔
239
    return (type == Type::UNKNOWN);
450✔
240
}
241

242
bool Variant::isString() const {
440✔
243
    return (type == Type::STRING);
440✔
244
}
245

246
bool Variant::isByteArray() const {
300✔
247
    return (type == Type::BYTEARRAY);
300✔
248
}
249

250
bool Variant::isVector() const {
560✔
251
    return (type == Type::VECTOR);
560✔
252
}
253

254
bool Variant::isList() const {
610✔
255
    return (type == Type::LIST);
610✔
256
}
257

258
bool Variant::isMap() const {
570✔
259
    return (type == Type::MAP);
570✔
260
}
261

262
bool Variant::isPair() const {
530✔
263
    return (type == Type::PAIR);
530✔
264
}
265

266
bool Variant::isCustomType() const {
580✔
267
    return (type == Type::CUSTOM);
580✔
268
}
269

270
bool Variant::isNumeric() const {
9,260✔
271
    bool numeric = false;
9,260✔
272

273
    switch (type) {
9,260✔
274
        case Type::BYTE_1:
275
        case Type::BYTE_2:
276
        case Type::BYTE_4:
277
        case Type::BYTE_8:
278
        case Type::UBYTE_1:
279
        case Type::UBYTE_2:
280
        case Type::UBYTE_4:
281
        case Type::UBYTE_8:
282
        case Type::DOUBLE:
283
            numeric = true;
284
            break;
285

286
        case Type::BOOL:
2,590✔
287
        case Type::STRING:
2,590✔
288
        case Type::BYTEARRAY:
2,590✔
289
        case Type::VECTOR:
2,590✔
290
        case Type::LIST:
2,590✔
291
        case Type::MAP:
2,590✔
292
        case Type::PAIR:
2,590✔
293
        default:
2,590✔
294
            numeric = false;
2,590✔
295
            break;
2,590✔
296
    }
297

298
    return numeric;
9,260✔
299
}
300

301
bool Variant::isSignedNumeric() const {
430✔
302
    bool isSigned = false;
430✔
303

304
    switch (type) {
430✔
305
        case Type::BYTE_1:
306
        case Type::BYTE_2:
307
        case Type::BYTE_4:
308
        case Type::BYTE_8:
309
        case Type::DOUBLE:
310
            isSigned = true;
311
            break;
312

313
        default:
140✔
314
            isSigned = false;
140✔
315
            break;
140✔
316
    }
317

318
    return isSigned;
430✔
319
}
320

321
bool Variant::isUnsignedNumeric() const {
5,930✔
322
    bool isUnsigned = false;
5,930✔
323

324
    switch (type) {
5,930✔
325
        case Type::UBYTE_1:
326
        case Type::UBYTE_2:
327
        case Type::UBYTE_4:
328
        case Type::UBYTE_8:
329
            isUnsigned = true;
330
            break;
331

332
        default:
5,210✔
333
            isUnsigned = false;
5,210✔
334
            break;
5,210✔
335
    }
336

337
    return isUnsigned;
5,930✔
338
}
339

340
bool Variant::isBool() const {
390✔
341
    return (type == Type::BOOL);
390✔
342
}
343

344
std::string Variant::toString() const {
1,870✔
345
    std::string result;
1,870✔
346

347
    switch (getType()) {
1,870✔
348
        case Type::BYTE_1:
20✔
349
            result = std::to_string(*(value<int8_t>()));
20✔
350
            break;
20✔
351
        case Type::BYTE_2:
40✔
352
            result = std::to_string(*(value<int16_t>()));
40✔
353
            break;
40✔
354
        case Type::BYTE_4:
50✔
355
            result = std::to_string(*(value<int32_t>()));
50✔
356
            break;
50✔
357
        case Type::BYTE_8:
10✔
358
            result = std::to_string(*(value<int64_t>()));
10✔
359
            break;
10✔
360
        case Type::UBYTE_1:
10✔
361
            result = std::to_string(*(value<uint8_t>()));
10✔
362
            break;
10✔
363
        case Type::UBYTE_2:
10✔
364
            result = std::to_string(*(value<uint16_t>()));
10✔
365
            break;
10✔
366
        case Type::UBYTE_4:
10✔
367
            result = std::to_string(*(value<uint32_t>()));
10✔
368
            break;
10✔
369
        case Type::UBYTE_8:
10✔
370
            result = std::to_string(*(value<uint64_t>()));
10✔
371
            break;
10✔
372
        case Type::DOUBLE:
10✔
373
            result = std::to_string(*(value<double>()));
10✔
374
            break;
10✔
375
        case Type::BOOL:
10✔
376
            result = (*(value<bool>()) ? "true" : "false");
20✔
377
            break;
10✔
378
        case Type::STRING:
1,630✔
379
            result = *(value<std::string>());
3,260✔
380
            break;
1,630✔
381
        case Type::BYTEARRAY: {
10✔
382
            std::shared_ptr<ByteArray_t> val = value<ByteArray_t>();
10✔
383

384
            result.assign(reinterpret_cast<char*>(val->data()), val->size());
10✔
385
            break;
10✔
386
        }
10✔
387
        case Type::VECTOR: {
10✔
388
            std::shared_ptr<VariantVector_t> val = value<VariantVector_t>();
10✔
389

390
            // cppcheck-suppress misra-c2012-14.4 ; false-positive. std::shared_ptr has a bool() operator
391
            if (val) {
10✔
392
                for (auto it = val->begin(); it != val->end(); ++it) {
40✔
393
                    if (false == result.empty()) {
30✔
394
                        result.append(", ");
20✔
395
                    }
396

397
                    result += it->toString();
60✔
398
                }
399
            }
400
            break;
10✔
401
        }
10✔
402
        case Type::LIST: {
10✔
403
            std::shared_ptr<VariantList_t> val = value<VariantList_t>();
10✔
404

405
            // cppcheck-suppress misra-c2012-14.4 ; false-positive. std::shared_ptr has a bool() operator
406
            if (val) {
10✔
407
                for (auto it = val->begin(); it != val->end(); ++it) {
40✔
408
                    if (false == result.empty()) {
30✔
409
                        result.append(", ");
20✔
410
                    }
411

412
                    result += it->toString();
60✔
413
                }
414
            }
415
            break;
10✔
416
        }
10✔
417
        case Type::MAP: {
10✔
418
            std::shared_ptr<VariantMap_t> val = value<VariantMap_t>();
10✔
419

420
            // cppcheck-suppress misra-c2012-14.4 ; false-positive. std::shared_ptr has a bool() operator
421
            if (val) {
10✔
422
                for (auto it = val->begin(); it != val->end(); ++it) {
40✔
423
                    if (false == result.empty()) {
30✔
424
                        result.append(", ");
20✔
425
                    }
426
                    result += it->first.toString().append("=[").append(it->second.toString()).append("]");
90✔
427
                }
428
            }
429
            break;
10✔
430
        }
10✔
431
        case Type::PAIR:
10✔
432
            result = std::string("(") + value<VariantPair_t>()->first.toString() + std::string(", ") +
50✔
433
                     value<VariantPair_t>()->second.toString() + std::string(")");
50✔
434
            break;
10✔
435
        default:
436
            break;
437
    }
438

439
    return result;
1,870✔
440
}
×
441

442
int64_t Variant::toInt64() const {
6,510✔
443
    int64_t result = 0;
6,510✔
444

445
    switch (type) {
6,510✔
446
        case Type::BYTE_1:
230✔
447
            result = static_cast<int64_t>(*value<int8_t>());
230✔
448
            break;
230✔
449
        case Type::BYTE_2:
210✔
450
            result = static_cast<int64_t>(*value<int16_t>());
210✔
451
            break;
210✔
452
        case Type::BYTE_4:
5,230✔
453
            result = static_cast<int64_t>(*value<int32_t>());
5,230✔
454
            break;
5,230✔
455
        case Type::BYTE_8:
280✔
456
            result = *value<int64_t>();
280✔
457
            break;
280✔
458

459
        case Type::UBYTE_1:
20✔
460
            result = static_cast<int64_t>(*value<uint8_t>());
20✔
461
            break;
20✔
462
        case Type::UBYTE_2:
20✔
463
            result = static_cast<int64_t>(*value<uint16_t>());
20✔
464
            break;
20✔
465
        case Type::UBYTE_4:
20✔
466
            result = static_cast<int64_t>(*value<uint32_t>());
20✔
467
            break;
20✔
468
        case Type::UBYTE_8:
20✔
469
            result = static_cast<int64_t>(*value<uint64_t>());
20✔
470
            break;
20✔
471

472
        case Type::DOUBLE:
20✔
473
            result = static_cast<int64_t>(*value<double>());
20✔
474
            break;
20✔
475

476
        case Type::BOOL:
10✔
477
            result = static_cast<int64_t>(*value<bool>());
10✔
478
            break;
10✔
479

480
        case Type::STRING:
330✔
481
            HSM_TRY {
330✔
482
                result = std::stoll(toString());
660✔
483
            }
484
            HSM_CATCH(...) {
320✔
485
                // return empty value
486
            }
320✔
487
            break;
488

489
        case Type::BYTEARRAY:
490
        case Type::VECTOR:
491
        case Type::LIST:
492
        case Type::MAP:
493
        case Type::PAIR:
494
        default:
495
            break;
496
    }
497

498
    return result;
6,510✔
499
}
500

501
uint64_t Variant::toUInt64() const {
1,620✔
502
    uint64_t result = 0;
1,620✔
503

504
    switch (type) {
1,620✔
505
        case Type::BYTE_1:
60✔
506
            result = static_cast<uint64_t>(*value<int8_t>());
60✔
507
            break;
60✔
508
        case Type::BYTE_2:
10✔
509
            result = static_cast<uint64_t>(*value<int16_t>());
10✔
510
            break;
10✔
511
        case Type::BYTE_4:
150✔
512
            result = static_cast<uint64_t>(*value<int32_t>());
150✔
513
            break;
150✔
514
        case Type::BYTE_8:
10✔
515
            result = static_cast<uint64_t>(*value<int64_t>());
10✔
516
            break;
10✔
517

518
        case Type::UBYTE_1:
200✔
519
            result = static_cast<uint64_t>(*value<uint8_t>());
200✔
520
            break;
200✔
521
        case Type::UBYTE_2:
200✔
522
            result = static_cast<uint64_t>(*value<uint16_t>());
200✔
523
            break;
200✔
524
        case Type::UBYTE_4:
310✔
525
            result = static_cast<uint64_t>(*value<uint32_t>());
310✔
526
            break;
310✔
527
        case Type::UBYTE_8:
270✔
528
            result = *value<uint64_t>();
270✔
529
            break;
270✔
530

531
        case Type::DOUBLE:
10✔
532
            result = static_cast<uint64_t>(*value<double>());
10✔
533
            break;
10✔
534

535
        case Type::BOOL:
10✔
536
            result = static_cast<int64_t>(*value<bool>());
10✔
537
            break;
10✔
538

539
        case Type::STRING:
330✔
540
            HSM_TRY {
330✔
541
                result = std::stoull(toString());
660✔
542
            }
543
            HSM_CATCH(...) {
320✔
544
                // return empty value
545
            }
320✔
546
            break;
547

548
        case Type::BYTEARRAY:
549
        case Type::VECTOR:
550
        case Type::LIST:
551
        case Type::MAP:
552
        case Type::PAIR:
553
        default:
554
            break;
555
    }
556

557
    return result;
1,620✔
558
}
559

560
double Variant::toDouble() const {
800✔
561
    double result = 0.0;
800✔
562

563
    switch (type) {
800✔
564
        case Type::BYTE_1:
20✔
565
            result = static_cast<double>(*value<int8_t>());
20✔
566
            break;
20✔
567
        case Type::BYTE_2:
10✔
568
            result = static_cast<double>(*value<int16_t>());
10✔
569
            break;
10✔
570
        case Type::BYTE_4:
10✔
571
            result = static_cast<double>(*value<int32_t>());
10✔
572
            break;
10✔
573
        case Type::BYTE_8:
10✔
574
            result = static_cast<double>(*value<int64_t>());
10✔
575
            break;
10✔
576

577
        case Type::UBYTE_1:
10✔
578
            result = static_cast<double>(*value<uint8_t>());
10✔
579
            break;
10✔
580
        case Type::UBYTE_2:
10✔
581
            result = static_cast<double>(*value<uint16_t>());
10✔
582
            break;
10✔
583
        case Type::UBYTE_4:
20✔
584
            result = static_cast<double>(*value<uint32_t>());
20✔
585
            break;
20✔
586
        case Type::UBYTE_8:
10✔
587
            result = static_cast<double>(*value<uint64_t>());
10✔
588
            break;
10✔
589

590
        case Type::DOUBLE:
300✔
591
            result = *value<double>();
300✔
592
            break;
300✔
593

594
        case Type::BOOL:
10✔
595
            result = static_cast<double>(toBool());
10✔
596
            break;
10✔
597

598
        case Type::STRING:
330✔
599
            HSM_TRY {
330✔
600
                result = std::stod(toString());
660✔
601
            }
602
            HSM_CATCH(...) {
320✔
603
                // return empty value
604
            }
320✔
605
            break;
606

607
        case Type::BYTEARRAY:
608
        case Type::VECTOR:
609
        case Type::LIST:
610
        case Type::MAP:
611
        case Type::PAIR:
612
        default:
613
            break;
614
    }
615

616
    return result;
800✔
617
}
618

619
bool Variant::toBool() const {
410✔
620
    bool result = false;
410✔
621

622
    if (Type::BOOL == type) {
410✔
623
        result = *value<bool>();
440✔
624
    } else if (Type::STRING == type) {
190✔
625
        const std::string strValue = toString();
30✔
626

627
        if (strValue != "true") {
30✔
628
            HSM_TRY {
20✔
629
                result = (0 != std::stoll(strValue));
20✔
630
            }
631
            HSM_CATCH(...) {
10✔
632
                // return empty value
633
            }
10✔
634
        } else {
635
            result = true;
636
        }
637
    } else {
30✔
638
        result = (0 != toInt64());
160✔
639
    }
640

641
    return result;
410✔
642
}
643

644
ByteArray_t Variant::toByteArray() const {
330✔
645
    ByteArray_t result;
330✔
646

647
    switch (getType()) {
330✔
648
        case Type::BYTE_1:
30✔
649
        case Type::UBYTE_1:
30✔
650
            result.resize(sizeof(int8_t));
30✔
651
            static_cast<void>(std::memcpy(result.data(), data.get(), sizeof(int8_t)));
30✔
652
            break;
653
        case Type::BYTE_2:
50✔
654
        case Type::UBYTE_2:
50✔
655
            result.resize(sizeof(int16_t));
50✔
656
            static_cast<void>(memcpy(result.data(), data.get(), sizeof(int16_t)));
50✔
657
            break;
658
        case Type::BYTE_4:
30✔
659
        case Type::UBYTE_4:
30✔
660
            result.resize(sizeof(int32_t));
30✔
661
            static_cast<void>(memcpy(result.data(), data.get(), sizeof(int32_t)));
30✔
662
            break;
663
        case Type::BYTE_8:
20✔
664
        case Type::UBYTE_8:
20✔
665
            result.resize(sizeof(int64_t));
20✔
666
            static_cast<void>(memcpy(result.data(), data.get(), sizeof(int64_t)));
20✔
667
            break;
668
        case Type::DOUBLE:
10✔
669
            result.resize(sizeof(double));
10✔
670
            static_cast<void>(memcpy(result.data(), data.get(), sizeof(double)));
10✔
671
            break;
672
        case Type::BOOL:
10✔
673
            result.push_back((toBool() == true) ? 0x01 : 0x00);
20✔
674
            break;
10✔
675
        case Type::STRING: {
70✔
676
            std::shared_ptr<std::string> val = value<std::string>();
70✔
677

678
            // cppcheck-suppress misra-c2012-14.4 ; false-positive. std::shared_ptr has a bool() operator
679
            if (val) {
70✔
680
                result.assign(val->begin(), val->end());
70✔
681
            }
682
            break;
70✔
683
        }
70✔
684
        case Type::BYTEARRAY:
60✔
685
            result = *(value<ByteArray_t>());
60✔
686
            break;
60✔
687
        case Type::VECTOR: {
10✔
688
            std::shared_ptr<VariantVector_t> data = value<VariantVector_t>();
10✔
689

690
            // cppcheck-suppress misra-c2012-14.4 ; false-positive. std::shared_ptr has a bool() operator
691
            if (data) {
10✔
692
                for (auto it = data->begin(); it != data->end(); ++it) {
40✔
693
                    const ByteArray_t curValue = it->toByteArray();
30✔
694

695
                    (void)result.insert(result.end(), curValue.begin(), curValue.end());
30✔
696
                }
30✔
697
            }
698
            break;
10✔
699
        }
10✔
700
        case Type::LIST: {
10✔
701
            std::shared_ptr<VariantList_t> data = value<VariantList_t>();
10✔
702

703
            // cppcheck-suppress misra-c2012-14.4 ; false-positive. std::shared_ptr has a bool() operator
704
            if (data) {
10✔
705
                for (auto it = data->begin(); it != data->end(); ++it) {
40✔
706
                    const ByteArray_t curValue = it->toByteArray();
30✔
707

708
                    (void)result.insert(result.end(), curValue.begin(), curValue.end());
30✔
709
                }
30✔
710
            }
711
            break;
10✔
712
        }
10✔
713
        case Type::PAIR: {
10✔
714
            // TODO: is this even needed?
715
            ByteArray_t secondValue = value<VariantPair_t>()->second.toByteArray();
10✔
716

717
            result = value<VariantPair_t>()->first.toByteArray();
20✔
718
            (void)result.insert(result.end(), secondValue.begin(), secondValue.end());
10✔
719
            break;
10✔
720
        }
10✔
721

722
        case Type::MAP:
723
        default:
724
            break;
725
    }
726

727
    return result;
330✔
728
}
×
729

730
std::shared_ptr<ByteArray_t> Variant::getByteArray() const {
40✔
731
    std::shared_ptr<ByteArray_t> result;
40✔
732

733
    if (true == isByteArray()) {
40✔
734
        result = value<ByteArray_t>();
30✔
735
    }
736

737
    return result;
40✔
738
}
×
739

740
std::shared_ptr<VariantVector_t> Variant::getVector() const {
260✔
741
    std::shared_ptr<VariantVector_t> result;
260✔
742

743
    if (true == isVector()) {
260✔
744
        result = value<VariantVector_t>();
70✔
745
    }
746

747
    return result;
260✔
748
}
×
749

750
std::shared_ptr<VariantList_t> Variant::getList() const {
260✔
751
    std::shared_ptr<VariantList_t> result;
260✔
752

753
    if (true == isList()) {
260✔
754
        result = value<VariantList_t>();
70✔
755
    }
756

757
    return result;
260✔
758
}
×
759

760
std::shared_ptr<VariantMap_t> Variant::getMap() const {
290✔
761
    std::shared_ptr<VariantMap_t> result;
290✔
762

763
    if (true == isMap()) {
290✔
764
        result = value<VariantMap_t>();
60✔
765
    }
766

767
    return result;
290✔
768
}
×
769

770
std::shared_ptr<VariantPair_t> Variant::getPair() const {
210✔
771
    std::shared_ptr<VariantPair_t> result;
210✔
772

773
    if (true == isPair()) {
210✔
774
        result = value<VariantPair_t>();
20✔
775
    }
776

777
    return result;
210✔
778
}
×
779

780
bool Variant::isSameObject(const Variant& val) const {
30,240✔
781
    return ((val.data.get() == data.get()) && data);
30,240✔
782
}
783

784
void Variant::freeMemory() {
42,300✔
785
    data.reset();
42,300✔
786
    type = Type::UNKNOWN;
42,300✔
787
    memoryAllocator = nullptr;
42,300✔
788
    compareOperator = nullptr;
42,300✔
789
}
42,300✔
790

791
}  // 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