LCOV - code coverage report
Current view: top level - src/lasso - ArrayManager.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 17 21 81.0 %
Date: 2015-08-05 10:04:16 Functions: 3 3 100.0 %
Branches: 7 10 70.0 %

           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

Generated by: LCOV version 1.11