Coverage Report

Created: 2026-09-14 07:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/assimp/contrib/openddlparser/code/Value.cpp
Line
Count
Source
1
/*-----------------------------------------------------------------------------------------------
2
The MIT License (MIT)
3
4
Copyright (c) 2014-2020 Kim Kulling
5
6
Permission is hereby granted, free of charge, to any person obtaining a copy of
7
this software and associated documentation files (the "Software"), to deal in
8
the Software without restriction, including without limitation the rights to
9
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
10
the Software, and to permit persons to whom the Software is furnished to do so,
11
subject to the following conditions:
12
13
The above copyright notice and this permission notice shall be included in all
14
copies or substantial portions of the Software.
15
16
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
-----------------------------------------------------------------------------------------------*/
23
#include <openddlparser/OpenDDLStream.h>
24
#include <openddlparser/Value.h>
25
26
#include <cassert>
27
28
BEGIN_ODDLPARSER_NS
29
30
static Value::Iterator end(nullptr);
31
32
Value::Iterator::Iterator() :
33
0
        m_start(nullptr),
34
0
        m_current(nullptr) {
35
    // empty
36
0
}
37
38
Value::Iterator::Iterator(Value *start) :
39
27
        m_start(start),
40
27
        m_current(start) {
41
    // empty
42
27
}
43
44
Value::Iterator::Iterator(const Iterator &rhs) :
45
0
        m_start(rhs.m_start),
46
0
        m_current(rhs.m_current) {
47
    // empty
48
0
}
49
50
0
Value::Iterator::~Iterator() {
51
    // empty
52
0
}
53
54
0
bool Value::Iterator::hasNext() const {
55
0
    if (nullptr == m_current) {
56
0
        return false;
57
0
    }
58
0
    return (nullptr != m_current->getNext());
59
0
}
60
61
0
Value *Value::Iterator::getNext() {
62
0
    if (!hasNext()) {
63
0
        return nullptr;
64
0
    }
65
66
0
    Value *v(m_current->getNext());
67
0
    m_current = v;
68
69
0
    return v;
70
0
}
71
72
0
const Value::Iterator Value::Iterator::operator++(int) {
73
0
    if (nullptr == m_current) {
74
0
        return end;
75
0
    }
76
77
0
    m_current = m_current->getNext();
78
0
    Iterator inst(m_current);
79
80
0
    return inst;
81
0
}
82
83
0
Value::Iterator &Value::Iterator::operator++() {
84
0
    if (nullptr == m_current) {
85
0
        return end;
86
0
    }
87
88
0
    m_current = m_current->getNext();
89
90
0
    return *this;
91
0
}
92
93
0
bool Value::Iterator::operator==(const Iterator &rhs) const {
94
0
    return (m_current == rhs.m_current);
95
0
}
96
97
0
Value *Value::Iterator::operator->() const {
98
0
    if (nullptr == m_current) {
99
0
        return nullptr;
100
0
    }
101
0
    return m_current;
102
0
}
103
104
Value::Value(ValueType type) :
105
134k
        m_type(type),
106
134k
        m_size(0),
107
134k
        m_data(nullptr),
108
134k
        m_next(nullptr) {
109
    // empty
110
134k
}
111
112
134k
Value::~Value() {
113
134k
    if (m_data != nullptr) {
114
134k
        if (m_type == ValueType::ddl_ref) {
115
0
            Reference *tmp = (Reference *)m_data;
116
0
            if (tmp != nullptr) {
117
0
                delete tmp;
118
0
            }
119
134k
        } else {
120
134k
            delete[] m_data;
121
134k
        }
122
134k
    }
123
134k
    delete m_next;
124
134k
}
125
126
0
void Value::setBool(bool value) {
127
0
    assert(ValueType::ddl_bool == m_type);
128
0
    ::memcpy(m_data, &value, m_size);
129
0
}
130
131
0
bool Value::getBool() {
132
0
    assert(ValueType::ddl_bool == m_type);
133
0
    return (*m_data == 1);
134
0
}
135
136
2
void Value::setInt8(int8 value) {
137
2
    assert(ValueType::ddl_int8 == m_type);
138
2
    ::memcpy(m_data, &value, m_size);
139
2
}
140
141
0
int8 Value::getInt8() {
142
0
    assert(ValueType::ddl_int8 == m_type);
143
0
    return (int8)(*m_data);
144
0
}
145
146
14
void Value::setInt16(int16 value) {
147
14
    assert(ValueType::ddl_int16 == m_type);
148
14
    ::memcpy(m_data, &value, m_size);
149
14
}
150
151
0
int16 Value::getInt16() {
152
0
    assert(ValueType::ddl_int16 == m_type);
153
0
    int16 i;
154
0
    ::memcpy(&i, m_data, m_size);
155
0
    return i;
156
0
}
157
158
378
void Value::setInt32(int32 value) {
159
378
    assert(ValueType::ddl_int32 == m_type);
160
378
    ::memcpy(m_data, &value, m_size);
161
378
}
162
163
0
int32 Value::getInt32() {
164
0
    assert(ValueType::ddl_int32 == m_type);
165
0
    int32 i;
166
0
    ::memcpy(&i, m_data, m_size);
167
0
    return i;
168
0
}
169
170
1.45k
void Value::setInt64(int64 value) {
171
1.45k
    assert(ValueType::ddl_int64 == m_type);
172
1.45k
    ::memcpy(m_data, &value, m_size);
173
1.45k
}
174
175
0
int64 Value::getInt64() {
176
0
    assert(ValueType::ddl_int64 == m_type);
177
0
    int64 i;
178
0
    ::memcpy(&i, m_data, m_size);
179
0
    return i;
180
0
}
181
182
0
void Value::setUnsignedInt8(uint8 value) {
183
0
    assert(ValueType::ddl_unsigned_int8 == m_type);
184
0
    ::memcpy(m_data, &value, m_size);
185
0
}
186
187
0
uint8 Value::getUnsignedInt8() const {
188
0
    assert(ValueType::ddl_unsigned_int8 == m_type);
189
0
    uint8 i;
190
0
    ::memcpy(&i, m_data, m_size);
191
0
    return i;
192
0
}
193
194
200
void Value::setUnsignedInt16(uint16 value) {
195
200
    assert(ValueType::ddl_unsigned_int16 == m_type);
196
200
    ::memcpy(m_data, &value, m_size);
197
200
}
198
199
0
uint16 Value::getUnsignedInt16() const {
200
0
    assert(ValueType::ddl_unsigned_int16 == m_type);
201
0
    uint16 i;
202
0
    ::memcpy(&i, m_data, m_size);
203
0
    return i;
204
0
}
205
206
40.8k
void Value::setUnsignedInt32(uint32 value) {
207
40.8k
    assert(ValueType::ddl_unsigned_int32 == m_type);
208
40.8k
    ::memcpy(m_data, &value, m_size);
209
40.8k
}
210
211
40.8k
uint32 Value::getUnsignedInt32() const {
212
40.8k
    assert(ValueType::ddl_unsigned_int32 == m_type);
213
40.8k
    uint32 i;
214
40.8k
    ::memcpy(&i, m_data, m_size);
215
40.8k
    return i;
216
40.8k
}
217
218
7.50k
void Value::setUnsignedInt64(uint64 value) {
219
7.50k
    assert(ValueType::ddl_unsigned_int64 == m_type);
220
7.50k
    ::memcpy(m_data, &value, m_size);
221
7.50k
}
222
223
0
uint64 Value::getUnsignedInt64() const {
224
0
    assert(ValueType::ddl_unsigned_int64 == m_type);
225
0
    uint64 i;
226
0
    ::memcpy(&i, m_data, m_size);
227
0
    return i;
228
0
}
229
230
81.8k
void Value::setFloat(float value) {
231
81.8k
    assert(ValueType::ddl_float == m_type);
232
81.8k
    ::memcpy(m_data, &value, m_size);
233
81.8k
}
234
235
45.9k
float Value::getFloat() const {
236
45.9k
    if (m_type == ValueType::ddl_float) {
237
42.4k
        float v;
238
42.4k
        ::memcpy(&v, m_data, m_size);
239
42.4k
        return (float)v;
240
42.4k
    } else {
241
3.43k
        float tmp;
242
3.43k
        ::memcpy(&tmp, m_data, 4);
243
3.43k
        return (float)tmp;
244
3.43k
    }
245
45.9k
}
246
247
0
void Value::setDouble(double value) {
248
0
    assert(ValueType::ddl_double == m_type);
249
0
    ::memcpy(m_data, &value, m_size);
250
0
}
251
252
0
double Value::getDouble() const {
253
0
    if (m_type == ValueType::ddl_double) {
254
0
        double v;
255
0
        ::memcpy(&v, m_data, m_size);
256
0
        return (float)v;
257
0
    } else {
258
0
        double tmp;
259
0
        ::memcpy(&tmp, m_data, 4);
260
0
        return (double)tmp;
261
0
    }
262
0
}
263
264
0
void Value::setString(const std::string &str) {
265
0
    assert(ValueType::ddl_string == m_type);
266
0
    ::memcpy(m_data, str.c_str(), str.size());
267
0
    m_data[str.size()] = '\0';
268
0
}
269
270
301
const char *Value::getString() const {
271
301
    assert(ValueType::ddl_string == m_type);
272
301
    return (const char *)m_data;
273
301
}
274
275
0
void Value::setRef(Reference *ref) {
276
0
    assert(ValueType::ddl_ref == m_type);
277
278
0
    if (nullptr != ref) {
279
0
        const size_t sizeInBytes(ref->sizeInBytes());
280
0
        if (sizeInBytes > 0) {
281
0
            if (nullptr != m_data) {
282
0
                delete[] m_data;
283
0
            }
284
285
0
            m_data = (unsigned char *)new Reference(*ref);
286
0
        }
287
0
    }
288
0
}
289
290
0
Reference *Value::getRef() const {
291
0
    assert(ValueType::ddl_ref == m_type);
292
293
0
    return (Reference *)m_data;
294
0
}
295
296
0
void Value::dump(IOStreamBase &stream) {
297
0
    switch (m_type) {
298
0
        case ValueType::ddl_none:
299
0
            stream.write("None\n");
300
0
            break;
301
0
        case ValueType::ddl_bool:
302
0
            stream.write(std::to_string(getBool()) + "\n");
303
0
            break;
304
0
        case ValueType::ddl_int8:
305
0
            stream.write(std::to_string(getInt8()) + "\n");
306
0
            break;
307
0
        case ValueType::ddl_int16:
308
0
            stream.write(std::to_string(getInt16()) + "\n");
309
0
            break;
310
0
        case ValueType::ddl_int32:
311
0
            stream.write(std::to_string(getInt32()) + "\n");
312
0
            break;
313
0
        case ValueType::ddl_int64:
314
0
            stream.write(std::to_string(getInt64()) + "\n");
315
0
            break;
316
0
        case ValueType::ddl_unsigned_int8:
317
0
            stream.write("Not supported\n");
318
0
            break;
319
0
        case ValueType::ddl_unsigned_int16:
320
0
            stream.write("Not supported\n");
321
0
            break;
322
0
        case ValueType::ddl_unsigned_int32:
323
0
            stream.write("Not supported\n");
324
0
            break;
325
0
        case ValueType::ddl_unsigned_int64:
326
0
            stream.write("Not supported\n");
327
0
            break;
328
0
        case ValueType::ddl_half:
329
0
            stream.write("Not supported\n");
330
0
            break;
331
0
        case ValueType::ddl_float:
332
0
            stream.write(std::to_string(getFloat()) + "\n");
333
0
            break;
334
0
        case ValueType::ddl_double:
335
0
            stream.write(std::to_string(getDouble()) + "\n");
336
0
            break;
337
0
        case ValueType::ddl_string:
338
0
            stream.write(std::string(getString()) + "\n");
339
0
            break;
340
0
        case ValueType::ddl_ref:
341
0
            stream.write("Not supported\n");
342
0
            break;
343
0
        default:
344
0
            break;
345
0
    }
346
0
}
347
348
99.2k
void Value::setNext(Value *next) {
349
99.2k
    m_next = next;
350
99.2k
}
351
352
0
Value *Value::getNext() const {
353
0
    return m_next;
354
0
}
355
356
0
size_t Value::size() const {
357
0
    size_t result = 1;
358
0
    Value *n = m_next;
359
0
    while (n != nullptr) {
360
0
        result++;
361
0
        n = n->m_next;
362
0
    }
363
0
    return result;
364
0
}
365
366
134k
Value *ValueAllocator::allocPrimData(Value::ValueType type, size_t len) {
367
134k
    if (type == Value::ValueType::ddl_none || Value::ValueType::ddl_types_max == type) {
368
0
        return nullptr;
369
0
    }
370
371
134k
    Value *data = new Value(type);
372
134k
    switch (type) {
373
0
        case Value::ValueType::ddl_bool:
374
0
            data->m_size = sizeof(bool);
375
0
            break;
376
2
        case Value::ValueType::ddl_int8:
377
2
            data->m_size = sizeof(int8);
378
2
            break;
379
14
        case Value::ValueType::ddl_int16:
380
14
            data->m_size = sizeof(int16);
381
14
            break;
382
378
        case Value::ValueType::ddl_int32:
383
378
            data->m_size = sizeof(int32);
384
378
            break;
385
1.45k
        case Value::ValueType::ddl_int64:
386
1.45k
            data->m_size = sizeof(int64);
387
1.45k
            break;
388
0
        case Value::ValueType::ddl_unsigned_int8:
389
0
            data->m_size = sizeof(uint8);
390
0
            break;
391
200
        case Value::ValueType::ddl_unsigned_int16:
392
200
            data->m_size = sizeof(uint16);
393
200
            break;
394
40.8k
        case Value::ValueType::ddl_unsigned_int32:
395
40.8k
            data->m_size = sizeof(uint32);
396
40.8k
            break;
397
7.50k
        case Value::ValueType::ddl_unsigned_int64:
398
7.50k
            data->m_size = sizeof(uint64);
399
7.50k
            break;
400
0
        case Value::ValueType::ddl_half:
401
0
            data->m_size = sizeof(short);
402
0
            break;
403
81.8k
        case Value::ValueType::ddl_float:
404
81.8k
            data->m_size = sizeof(float);
405
81.8k
            break;
406
0
        case Value::ValueType::ddl_double:
407
0
            data->m_size = sizeof(double);
408
0
            break;
409
1.97k
        case Value::ValueType::ddl_string:
410
1.97k
            data->m_size = sizeof(char) * (len + 1);
411
1.97k
            break;
412
0
        case Value::ValueType::ddl_ref:
413
0
            data->m_size = 0;
414
0
            break;
415
0
        case Value::ValueType::ddl_none:
416
0
        case Value::ValueType::ddl_types_max:
417
0
        default:
418
0
            break;
419
134k
    }
420
421
134k
    if (data->m_size) {
422
134k
        data->m_data = new unsigned char[data->m_size];
423
134k
        ::memset(data->m_data, 0, data->m_size);
424
134k
    }
425
426
134k
    return data;
427
134k
}
428
429
0
void ValueAllocator::releasePrimData(Value **data) {
430
0
    if (!data) {
431
0
        return;
432
0
    }
433
434
0
    delete *data;
435
0
    *data = nullptr;
436
0
}
437
438
END_ODDLPARSER_NS