Branch data Line data Source code
1 : : #ifndef ARRAYMANAGER_HPP
2 : : #define ARRAYMANAGER_HPP
3 : :
4 : : #include <cstdlib>
5 : :
6 : : // Check the array size, and allocate the array if necessary.
7 : : // Free the array upon leaving scope unless KEEP_ARRAY
8 : : // is invoked.
9 : : #define ALLOC_CHECK_ARRAY(array, this_size) \
10 : : ArrayManager array ## _manager ( reinterpret_cast<void**>(array), *(array ## _allocated), *(array ## _size), this_size, sizeof(**array), err ); \
11 : : if (iBase_SUCCESS != *err) return
12 : :
13 : : #define ALLOC_CHECK_TAG_ARRAY(array, this_size) \
14 : : ArrayManager array ## _manager ( reinterpret_cast<void**>(array), *(array ## _allocated), *(array ## _size), this_size, 1, err ); \
15 : : if (iBase_SUCCESS != *err) return
16 : :
17 : : #define KEEP_ARRAY(array) \
18 : : array ## _manager .keep_array()
19 : :
20 : : // Check the array size, and allocate the array if necessary.
21 : : // Do NOT free the array upon leaving scope.
22 : : #define ALLOC_CHECK_ARRAY_NOFAIL(array, this_size) \
23 : : ALLOC_CHECK_ARRAY(array, this_size); KEEP_ARRAY(array)
24 : :
25 : :
26 : : // Implement RAII pattern for allocated arrays, stolen from iMesh
27 : : class ArrayManager
28 : : {
29 : : void** arrayPtr;
30 : :
31 : : public:
32 : :
33 : :
34 : 16 : ArrayManager( void** array_ptr,
35 : : int& array_allocated_space,
36 : : int& array_size,
37 : : int count,
38 : : int val_size,
39 : 16 : int* err ) : arrayPtr(0)
40 : : {
41 [ + + ][ - + ]: 16 : if (!*array_ptr || !array_allocated_space) {
42 : 12 : *array_ptr = std::malloc(val_size * count);
43 : 12 : array_allocated_space = array_size = count;
44 [ - + ]: 12 : if (!*array_ptr) {
45 : 0 : *err = iBase_MEMORY_ALLOCATION_FAILED;
46 : 0 : return;
47 : : }
48 : 12 : arrayPtr = array_ptr;
49 : : }
50 : : else {
51 : 4 : array_size = count;
52 [ - + ]: 4 : if (array_allocated_space < count) {
53 : 0 : *err = iBase_BAD_ARRAY_DIMENSION;
54 : 0 : return;
55 : : }
56 : : }
57 : :
58 : 16 : *err = iBase_SUCCESS;
59 : : }
60 : :
61 : 16 : ~ArrayManager()
62 : : {
63 [ + + ]: 16 : if (arrayPtr) {
64 : 2 : std::free(*arrayPtr);
65 : 2 : *arrayPtr = 0;
66 : : }
67 : 16 : }
68 : :
69 : 14 : void keep_array()
70 : 14 : { arrayPtr = 0; }
71 : : };
72 : :
73 : : #endif
|