LCOV - code coverage report
Current view: top level - utils/meshkit - iMesh.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 160 205 78.0 %
Date: 2020-07-01 15:24:36 Functions: 26 28 92.9 %
Branches: 101 258 39.1 %

           Branch data     Line data    Source code
       1                 :            : #ifndef MESHKIT_ITAPS_MESH_HPP
       2                 :            : #define MESHKIT_ITAPS_MESH_HPP
       3                 :            : 
       4                 :            : /** \file iMesh.hpp
       5                 :            :  */
       6                 :            : 
       7                 :            : #include "moab/EntityType.hpp"
       8                 :            : #include "iMesh.h"
       9                 :            : #include "iRel.hpp"
      10                 :            : #include <string.h>
      11                 :            : #include <stdlib.h>
      12                 :            : #include <vector>
      13                 :            : #include <limits>
      14                 :            : #include <string>
      15                 :            : 
      16                 :            : #define ITAPS_PREFIX iMesh
      17                 :            : #include "meshkit/iBase.hpp"
      18                 :            : #undef ITAPS_PREFIX
      19                 :            : 
      20                 :            : /** \class iMesh
      21                 :            :  * \brief C++ interface to ITAPS iMesh interface
      22                 :            :  *
      23                 :            :  * This class is a simple wrapper for the ITAPS iGeom interface.  The primary benefit to using this class
      24                 :            :  * instead of iMesh directly is that lists of handles are passed as std::vectors instead of pointers to
      25                 :            :  * handle arrays.  This file includes both declaration and definition of all iGeom class functions, i.e.
      26                 :            :  * all functions are inlined.  The class can be constructed and destructed in the standard C++ way; the
      27                 :            :  * implementation of those functions call into the standard iMesh C functions newMesh and dtor.
      28                 :            :  *
      29                 :            :  * For complete documentation of these functions, see http://www.itaps.org/software/iMesh_html/index.html.
      30                 :            :  */
      31                 :            : class iMesh : public iMeshBase {
      32                 :            :   public:
      33                 :            :     inline iRel::IfaceType iface_type() const {
      34                 :            :         return iRel::IMESH_IFACE;
      35                 :            :     }
      36                 :            : 
      37                 :            : 
      38                 :            :   /* map to MB's entity type from TSTT's entity topology */
      39                 :            :   static const moab::EntityType mb_topology_table[iMesh_ALL_TOPOLOGIES+1];
      40                 :            : 
      41                 :            :     typedef iMesh_EntityTopology EntityTopology;
      42                 :            :     typedef iBase_AdjacencyCost AdjacencyCost;
      43                 :            :     
      44                 :            :     explicit inline iMesh( const char* options = 0 );
      45                 :            :     inline iMesh( iMesh_Instance imesh );
      46                 :            :     
      47                 :            :     inline ~iMesh();
      48                 :            :     
      49                 :            :     inline Error load( EntitySetHandle set,
      50                 :            :                        const char* file_name,
      51                 :            :                        const char* options = 0 );
      52                 :            : 
      53                 :            :     inline Error save( EntitySetHandle set,
      54                 :            :                        const char* file_name,
      55                 :            :                        const char* options = 0 );
      56                 :            :     
      57                 :            :     inline int getGeometricDimension() const;
      58                 :            :     
      59                 :            :     inline Error setGeometricDimension( int dim );
      60                 :            :     
      61                 :            :     inline StorageOrder getDfltStorage() const;
      62                 :            :     
      63                 :            :     typedef AdjacencyCost (*AdjTableType)[4];
      64                 :            :     inline AdjTableType getAdjTable();
      65                 :            :   
      66                 :            :     inline Error setAdjTable( int* adj_table, int table_size);
      67                 :            : 
      68                 :            :     inline Error getNumOfType( EntitySetHandle set, EntityType type, int& count_out  ) const;
      69                 :            :     
      70                 :            :     inline Error getNumOfTopo( EntitySetHandle set, EntityTopology topo, int& count_out ) const;
      71                 :            :     
      72                 :            :     inline bool optimize();
      73                 :            :     
      74                 :            :     inline Error getEntities( EntitySetHandle set,
      75                 :            :                               EntityType type,
      76                 :            :                               EntityTopology topo,
      77                 :            :                               std::vector<EntityHandle>& entities_out ) const;
      78                 :            :     
      79                 :            :     inline Error getVtxCoord( EntityHandle vertex, double& x, double& y, double& z ) const;
      80                 :            :     inline Error setVtxCoord( EntityHandle vertex, double x, double y, double z );
      81                 :            :     
      82                 :            :     
      83                 :            :     inline Error getVtxArrCoords( const EntityHandle* vertex_handles,
      84                 :            :                                   int vertex_handles_size,
      85                 :            :                                   StorageOrder storage_order,
      86                 :            :                                   double* coords_out ) const;
      87                 :            :     
      88                 :            :     inline Error setVtxArrCoords( const EntityHandle* vertex_handles,
      89                 :            :                                   int vertex_handles_size,
      90                 :            :                                   StorageOrder storage_order,
      91                 :            :                                   const double* new_coords );
      92                 :            :     
      93                 :            :     inline Error createVtx( double x, double y, double z, EntityHandle& vertex_out );
      94                 :            :     
      95                 :            :     inline Error createVtxArr( int num_verts, 
      96                 :            :                                StorageOrder storage_order,
      97                 :            :                                const double* new_coords,
      98                 :            :                                EntityHandle* new_vertex_handles_out );
      99                 :            :     
     100                 :            :     inline Error createEnt( EntityTopology topology,
     101                 :            :                             const EntityHandle* lower_order_entity_handles,
     102                 :            :                             int lower_order_entity_handles_size,
     103                 :            :                             EntityHandle& new_entity_handle_out );
     104                 :            :     
     105                 :            :     inline Error createEntArr( EntityTopology new_entity_topology,
     106                 :            :                                const EntityHandle* lower_order_entity_handles,
     107                 :            :                                int lower_order_entity_handles_size,
     108                 :            :                                EntityHandle* new_entity_handles_out );
     109                 :            :     
     110                 :            :     inline Error deleteEnt( EntityHandle handle );
     111                 :            :     
     112                 :            :     inline Error deleteEntArr( const EntityHandle* entity_handles, int num_handles );
     113                 :            :     
     114                 :            :     inline Error getAdjEntities( EntitySetHandle set,
     115                 :            :                                  EntityType type_requestor,
     116                 :            :                                  EntityTopology topo_requestor,
     117                 :            :                                  EntityType type_requested,
     118                 :            :                                  std::vector<EntityHandle>& adj_entity_handles,
     119                 :            :                                  std::vector<int>& offset ) const;
     120                 :            :     
     121                 :            : /** \class EntArrIter iMesh.hpp "iMesh.hpp"
     122                 :            :  * \brief Class for iterating over %iMesh entity arrays.
     123                 :            :  */
     124                 :            :     class EntArrIter {
     125                 :            :       private:
     126                 :            :         friend class iMesh;
     127                 :            :         iBase_EntityArrIterator mHandle;
     128                 :            :         iMesh_Instance mInstance;
     129                 :            :         int mSize;
     130                 :            :       public:
     131                 :            :         EntArrIter() : mHandle(0), mInstance(0), mSize(0) {}
     132                 :            :         inline ~EntArrIter();
     133                 :            :         inline Error getNext( EntityHandle* entity_handles_out,
     134                 :            :                               int& size_out,
     135                 :            :                               bool& has_more_data_out );
     136                 :            :         inline Error reset();
     137                 :            :     };
     138                 :            :     
     139                 :            : /** \class EntIter iMesh.hpp "iMesh.hpp"
     140                 :            :  * \brief Class for iterating over %iMesh entities.
     141                 :            :  */
     142                 :            :     class EntIter {
     143                 :            :       private:
     144                 :            :         friend class iMesh;
     145                 :            :         iBase_EntityIterator mHandle;
     146                 :            :         iMesh_Instance mInstance;
     147                 :            :       public:
     148                 :            :         EntIter() : mHandle(0), mInstance(0) {}
     149                 :            :         inline ~EntIter();
     150                 :            :         inline Error getNext( EntityHandle& entity_handle_out,
     151                 :            :                               bool& has_more_data_out );
     152                 :            :         inline Error reset();
     153                 :            :     };
     154                 :            :     
     155                 :            :     inline Error initEntIter( EntitySetHandle set,
     156                 :            :                               EntityType requested_type,
     157                 :            :                               EntityTopology requested_topo,
     158                 :            :                               int resilient,
     159                 :            :                               EntIter& iter );
     160                 :            :     inline Error initEntArrIter( EntitySetHandle set,
     161                 :            :                                  EntityType requested_type,
     162                 :            :                                  EntityTopology requested_topo,
     163                 :            :                                  int requested_array_size,
     164                 :            :                                  int resilient,
     165                 :            :                                  EntArrIter& iter );
     166                 :            :     
     167                 :            :     inline Error getEntTopo( EntityHandle handle, EntityTopology& topo_out ) const;
     168                 :            :     inline Error getEntArrTopo( const EntityHandle* entity_handles,
     169                 :            :                                 int entity_handles_Size,
     170                 :            :                                 EntityTopology* topos_out ) const;
     171                 :            :      
     172                 :            :     inline Error getEntType( EntityHandle handle, EntityType& type_out ) const;
     173                 :            :     inline Error getEntArrType( const EntityHandle* entity_handles,
     174                 :            :                                 int entity_handles_Size,
     175                 :            :                                 EntityType* types_out ) const;
     176                 :            :     
     177                 :            :     inline Error getEntAdj( EntityHandle handle, 
     178                 :            :                             EntityType type_requested,
     179                 :            :                             std::vector<EntityHandle>& adj_entities_out ) const;                   
     180                 :            :     inline Error getEntArrAdj( const EntityHandle* entity_handles,
     181                 :            :                                int entity_handles_size,
     182                 :            :                                EntityType type_requested,
     183                 :            :                                std::vector<EntityHandle>& adjacent_entity_handles_out,
     184                 :            :                                int* offsets_out ) const ;
     185                 :            :                        
     186                 :            :    inline Error getEnt2ndAdj( EntityHandle handle, 
     187                 :            :                               EntityType bridge_entity_type,
     188                 :            :                               EntityType type_requested,
     189                 :            :                               std::vector<EntityHandle>& adj_entities_out ) const;                   
     190                 :            :    inline Error getEntArr2ndAdj( const EntityHandle* entity_handles,
     191                 :            :                                   int entity_handles_size,
     192                 :            :                                   EntityType order_key,
     193                 :            :                                   EntityType type_requested,
     194                 :            :                                   std::vector<EntityHandle>& adjacent_entity_handles_out,
     195                 :            :                                   int* offsets_out ) const;
     196                 :            : 
     197                 :            :     inline Error getAdjEntIndices( EntitySetHandle set,
     198                 :            :                                    EntityType requestor_type,
     199                 :            :                                    EntityTopology requestor_topo,
     200                 :            :                                    EntityType type_requested,
     201                 :            :                                    std::vector<EntityHandle>& entity_handles_out,
     202                 :            :                                    std::vector<EntityHandle>& adj_entity_handles_out,
     203                 :            :                                    std::vector<int>& adj_entity_indices_out,
     204                 :            :                                    std::vector<int>& offsets_out ) const;
     205                 :            :     
     206                 :            :   private:
     207                 :            :     bool iMeshInstanceOwner;
     208                 :            :     AdjacencyCost adjTable[4][4];
     209                 :            :     Error adjTableErr;
     210                 :            :     
     211                 :            :     void cacheAdjTable();
     212                 :            :     
     213                 :            :       // prohibit copying
     214                 :            :     iMesh( const iMesh& ) {}
     215                 :            :     void operator=(const iMesh&) {}
     216                 :            : };
     217                 :            : 
     218                 :            : inline void
     219                 :        132 : iMesh::cacheAdjTable()
     220                 :            : {
     221                 :            :   int err;
     222                 :            :   if (sizeof(int) == sizeof(AdjacencyCost)) {
     223                 :         66 :     int* ptr = (int*)&adjTable[0][0];
     224                 :         66 :     int size = 16, alloc = 16;
     225         [ +  - ]:         66 :     iMesh_getAdjTable( mInstance, &ptr, &alloc, &size, &err );
     226                 :         66 :     adjTableErr = (Error)err;
     227                 :            :   }
     228                 :            :   else {
     229                 :            :     int data[16];
     230                 :            :     int* ptr = data;
     231                 :            :     int size = 16, alloc = 16;
     232                 :            :     iMesh_getAdjTable( mInstance, &ptr, &alloc, &size, &err );
     233                 :            :     adjTableErr = (Error)err;
     234                 :            :     for (int i = 0; i < 4; ++i)
     235                 :            :       for (int j = 0; j < 4; ++j)
     236                 :            :         adjTable[i][j] = (AdjacencyCost)data[4*i+1];
     237                 :            :   }
     238                 :         66 : }
     239                 :            : 
     240                 :            : inline 
     241                 :            : iMesh::iMesh( const char* options )
     242                 :            : {
     243                 :            :   int err, len = options ? strlen(options) : 0;
     244                 :            :   iMesh_newMesh( options, &mInstance, &err, len );
     245                 :            :   if (iBase_SUCCESS != err) {
     246                 :            :     mInstance = 0;
     247                 :            :     iMeshInstanceOwner = false;
     248                 :            :   }
     249                 :            :   else {
     250                 :            :     iMeshInstanceOwner = true;
     251                 :            :     cacheAdjTable();
     252                 :            :   }
     253                 :            : }
     254                 :            : 
     255                 :            : inline 
     256                 :         65 : iMesh::iMesh( iMesh_Instance instance )
     257                 :         65 :   : iMeshInstanceOwner(false)
     258                 :            : {
     259                 :         65 :   mInstance = instance;
     260                 :         65 :   cacheAdjTable();
     261                 :         65 : }
     262                 :            : 
     263                 :         48 : inline iMesh::~iMesh()
     264                 :            : {
     265         [ -  + ]:         48 :   if (iMeshInstanceOwner) {
     266                 :            :     int err;
     267                 :          0 :     iMesh_dtor( mInstance, &err );
     268                 :            :   }
     269                 :         48 : }
     270                 :            : 
     271                 :            : inline iMesh::Error
     272                 :          2 : iMesh::load( EntitySetHandle set,
     273                 :            :              const char* file_name,
     274                 :            :              const char* options )
     275                 :            : {
     276         [ -  + ]:          2 :   int err, len = options ? strlen(options) : 0;
     277         [ +  - ]:          2 :   iMesh_load( mInstance, set, file_name, options, &err, strlen(file_name), len );
     278                 :          2 :   return (Error)err;
     279                 :            : }
     280                 :            : 
     281                 :            : 
     282                 :            : inline iMesh::Error
     283                 :            : iMesh::save( EntitySetHandle set,
     284                 :            :              const char* file_name,
     285                 :            :              const char* options )
     286                 :            : {
     287                 :            :   int err, len = options ? strlen(options) : 0;
     288                 :            :   iMesh_save( mInstance, set, file_name, options, &err, strlen(file_name), len );
     289                 :            :   return (Error)err;
     290                 :            : }
     291                 :            : 
     292                 :            : 
     293                 :            : inline int 
     294                 :         28 : iMesh::getGeometricDimension() const
     295                 :            : {
     296                 :            :   int err, result;
     297         [ +  - ]:         28 :   iMesh_getGeometricDimension( mInstance, &result, &err );
     298         [ -  + ]:         28 :   return iBase_SUCCESS == err ? result : -err;
     299                 :            : }
     300                 :            : 
     301                 :            : 
     302                 :            : inline iMesh::Error
     303                 :            : iMesh::setGeometricDimension( int dim )
     304                 :            : {
     305                 :            :   int err;
     306                 :            :   iMesh_setGeometricDimension( mInstance, dim, &err );
     307                 :            :   return (Error)err;
     308                 :            : }
     309                 :            : 
     310                 :            : inline iMesh::StorageOrder 
     311                 :            : iMesh::getDfltStorage() const
     312                 :            : {
     313                 :            :   int err, order;
     314                 :            :   iMesh_getDfltStorage( mInstance, &order, &err );
     315                 :            :   return (iBase_SUCCESS == err) ? (StorageOrder)order : iBase_BLOCKED;
     316                 :            : }
     317                 :            : 
     318                 :          1 : inline iMesh::AdjTableType iMesh::getAdjTable()
     319                 :            : {
     320                 :          1 :   cacheAdjTable(); //retrieve the most up-to-date table
     321         [ +  - ]:          1 :   return (iBase_SUCCESS == adjTableErr) ? adjTable : 0;
     322                 :            : }
     323                 :            :   
     324                 :            : 
     325                 :            : inline iMesh::Error 
     326                 :          2 : iMesh::setAdjTable( int adj_table[], int table_size)
     327                 :            : {
     328                 :            : 
     329                 :            :   int err; 
     330         [ +  - ]:          2 :   iMesh_setAdjTable( mInstance, adj_table, table_size, &err);
     331                 :            :   
     332                 :          2 :   return (Error)err;
     333                 :            : 
     334                 :            : }
     335                 :            : 
     336                 :            : inline iMesh::Error
     337                 :       1205 : iMesh::getNumOfType( EntitySetHandle set, EntityType type, int& count_out  ) const
     338                 :            : {
     339                 :            :   int err;
     340         [ +  - ]:       1205 :   iMesh_getNumOfType( mInstance, set, type, &count_out, &err );
     341                 :       1205 :   return (Error)err;
     342                 :            : }
     343                 :            : 
     344                 :            : inline iMesh::Error
     345                 :         95 : iMesh::getNumOfTopo( EntitySetHandle set, EntityTopology topo, int& count_out ) const
     346                 :            : {
     347                 :            :   int err;
     348         [ +  - ]:         95 :   iMesh_getNumOfTopo( mInstance, set, topo, &count_out, &err );
     349                 :         95 :   return (Error)err;
     350                 :            : }
     351                 :            : 
     352                 :            : inline bool 
     353                 :            : iMesh::optimize()
     354                 :            : {
     355                 :            :   int err, result;
     356                 :            :   iMesh_optimize( mInstance, &result, &err );
     357                 :            :   return (iBase_SUCCESS == err) ? !!result : true;
     358                 :            : }
     359                 :            : 
     360                 :            : inline iMesh::Error
     361                 :        184 : iMesh::getEntities( EntitySetHandle set,
     362                 :            :                     EntityType type,
     363                 :            :                     EntityTopology topo,
     364                 :            :                     std::vector<EntityHandle>& entities_out ) const
     365                 :            : {
     366                 :            :     // if input vect has no allocated space, allocate some so
     367                 :            :     // we don't accidentally ask the impl to allocate an array
     368         [ +  + ]:        184 :   if (entities_out.capacity() == 0) {
     369                 :            :     Error err2;
     370                 :            :     int count;
     371         [ +  + ]:        172 :     if (topo == iMesh_ALL_TOPOLOGIES)
     372         [ +  - ]:         83 :       err2 = getNumOfType( set, type, count );
     373                 :            :     else
     374         [ +  - ]:         89 :       err2 = getNumOfTopo( set, topo, count );
     375         [ -  + ]:        172 :     if (err2 != iBase_SUCCESS)
     376                 :          0 :       return err2;
     377         [ +  - ]:        172 :     entities_out.resize( count );
     378                 :            :   }
     379                 :            :   
     380                 :            :     // try getting results using whatever space input vector has allocated
     381                 :        184 :   int err, size = 0, alloc = entities_out.capacity();
     382         [ +  - ]:        184 :   entities_out.resize( entities_out.capacity() );
     383         [ +  - ]:        184 :   EntityHandle* ptr = &entities_out[0];
     384         [ +  - ]:        184 :   iMesh_getEntities( mInstance, set, type, topo, &ptr, &alloc, &size, &err );
     385         [ +  - ]:        184 :   entities_out.resize(size);
     386                 :            :   
     387                 :            :     // if input vector was too small, try again with increased size
     388 [ +  - ][ -  + ]:        184 :   if (iBase_BAD_ARRAY_DIMENSION == err || iBase_BAD_ARRAY_SIZE == err) {
     389                 :          0 :     alloc = entities_out.size();
     390         [ #  # ]:          0 :     ptr = &entities_out[0];
     391         [ #  # ]:          0 :     iMesh_getEntities( mInstance, set, type, topo, &ptr, &alloc, &size, &err );
     392                 :            :   }
     393                 :            :   
     394                 :        184 :   return (Error)err;
     395                 :            : }
     396                 :            : 
     397                 :            : inline iMesh::Error
     398                 :      14382 : iMesh::getVtxCoord( EntityHandle vertex, double& x, double& y, double& z ) const
     399                 :            : {
     400                 :            :   int err;
     401         [ +  - ]:      14382 :   iMesh_getVtxCoord( mInstance, vertex, &x, &y, &z, &err );
     402                 :      14382 :   return (Error)err;
     403                 :            : }
     404                 :            : 
     405                 :            : inline iMesh::Error
     406                 :          0 : iMesh::setVtxCoord( EntityHandle vertex, double x, double y, double z )
     407                 :            : {
     408                 :            :   int err;
     409         [ #  # ]:          0 :   iMesh_setVtxCoord( mInstance, vertex, x, y, z, &err );
     410                 :          0 :   return (Error)err;
     411                 :            : }
     412                 :            : 
     413                 :            : 
     414                 :            : inline iMesh::Error
     415                 :        104 : iMesh::getVtxArrCoords( const EntityHandle* vertex_handles,
     416                 :            :                         int vertex_handles_size,
     417                 :            :                         StorageOrder storage_order,
     418                 :            :                         double* coords_out ) const
     419                 :            : {
     420                 :        104 :   int err, alloc = 3*vertex_handles_size, junk, order = storage_order;
     421                 :            :   iMesh_getVtxArrCoords( mInstance, vertex_handles, vertex_handles_size,
     422         [ +  - ]:        104 :                          order, &coords_out, &alloc, &junk, &err );
     423                 :        104 :   return (Error)err;
     424                 :            : }
     425                 :            : 
     426                 :            : inline iMesh::Error
     427                 :          0 : iMesh::setVtxArrCoords( const EntityHandle* vertex_handles,
     428                 :            :                         int vertex_handles_size,
     429                 :            :                         StorageOrder storage_order,
     430                 :            :                         const double* new_coords )
     431                 :            : {
     432         [ #  # ]:          0 :   int err, dim = getGeometricDimension();
     433                 :            :   iMesh_setVtxArrCoords( mInstance, vertex_handles, vertex_handles_size, 
     434                 :            :                          storage_order, new_coords, dim*vertex_handles_size,
     435         [ #  # ]:          0 :                          &err );
     436                 :          0 :   return (Error)err;
     437                 :            : }
     438                 :            : 
     439                 :            : inline iMesh::Error
     440                 :       8215 : iMesh::createVtx( double x, double y, double z, EntityHandle& vertex_out )
     441                 :            : {
     442                 :            :   int err;
     443         [ +  - ]:       8215 :   iMesh_createVtx( mInstance, x, y, z, &vertex_out, &err );
     444                 :       8215 :   return (Error)err;
     445                 :            : }
     446                 :            : 
     447                 :            : 
     448                 :            : inline iMesh::Error
     449                 :         28 : iMesh::createVtxArr( int num_verts, 
     450                 :            :                      StorageOrder storage_order,
     451                 :            :                      const double* new_coords,
     452                 :            :                      EntityHandle* new_vertex_handles_out )
     453                 :            : {
     454         [ +  - ]:         28 :   int err, alloc = num_verts, junk, dim = getGeometricDimension();
     455                 :            :   iMesh_createVtxArr( mInstance, num_verts, storage_order, new_coords, 
     456                 :            :                       dim * num_verts, &new_vertex_handles_out,
     457         [ +  - ]:         28 :                       &alloc, &junk, &err );
     458                 :         28 :   return (Error)err;
     459                 :            : }
     460                 :            : 
     461                 :            : inline iMesh::Error
     462                 :       9173 : iMesh::createEnt( EntityTopology topology,
     463                 :            :                   const EntityHandle* entities,
     464                 :            :                   int entities_size,
     465                 :            :                   EntityHandle& new_entity_out )
     466                 :            : {
     467                 :            :   int err, status;
     468         [ +  - ]:       9173 :   iMesh_createEnt( mInstance, topology, entities, entities_size, &new_entity_out, &status, &err );
     469         [ +  - ]:       9173 :   if (err == iBase_SUCCESS) 
     470 [ +  - ][ -  + ]:       9173 :     if (status == iBase_ALREADY_EXISTED || status == iBase_CREATION_FAILED)
     471                 :       9173 :       err = iBase_ENTITY_CREATION_ERROR;
     472                 :       9173 :   return (Error)err;
     473                 :            : }
     474                 :            : 
     475                 :            : inline iMesh::Error
     476                 :         17 : iMesh::createEntArr( EntityTopology new_entity_topology,
     477                 :            :                      const EntityHandle* lower_order_handles,
     478                 :            :                      int lower_order_handles_size,
     479                 :            :                      EntityHandle* new_entity_handles_out )
     480                 :            : {
     481         [ +  - ]:         17 :   std::vector<int> status(lower_order_handles_size, iBase_CREATION_FAILED);
     482                 :         17 :   int err, alloc = lower_order_handles_size, size = 0;
     483         [ +  - ]:         17 :   int status_alloc = status.size(), junk, *stat_ptr = &status[0];
     484                 :            :   
     485                 :            :   iMesh_createEntArr( mInstance, new_entity_topology, 
     486                 :            :                       lower_order_handles, lower_order_handles_size, 
     487                 :            :                       &new_entity_handles_out, &alloc, &size,
     488         [ +  - ]:         17 :                       &stat_ptr, &status_alloc, &junk, &err );
     489                 :            :   
     490         [ +  - ]:         17 :   if (iBase_SUCCESS == err) {
     491         [ +  + ]:       1007 :     for (int i = 0; i < size; ++i)
     492 [ +  - ][ -  + ]:        990 :       if (status[i] != iBase_NEW && status[i] != iBase_CREATED_DUPLICATE)
         [ #  # ][ #  # ]
                 [ -  + ]
     493                 :          0 :         err = iBase_ENTITY_CREATION_ERROR;
     494                 :            :   }
     495                 :            :   
     496         [ -  + ]:         17 :   if (iBase_SUCCESS != err) {
     497                 :          0 :     int err2, w = 0;
     498         [ #  # ]:          0 :     for (int r = 0; r < size; ++r) 
     499 [ #  # ][ #  # ]:          0 :       if (status[r] == iBase_NEW || status[r] == iBase_CREATED_DUPLICATE) 
         [ #  # ][ #  # ]
                 [ #  # ]
     500                 :          0 :         new_entity_handles_out[w++] = new_entity_handles_out[r];
     501         [ #  # ]:          0 :     iMesh_deleteEntArr( mInstance, new_entity_handles_out, w, &err2 );
     502                 :            :   }
     503                 :            :   
     504                 :         17 :   return (Error)err;
     505                 :            : }
     506                 :            : 
     507                 :            : inline iMesh::Error
     508                 :        120 : iMesh::deleteEnt( EntityHandle handle )
     509                 :            : {
     510                 :            :   int err;
     511         [ +  - ]:        120 :   iMesh_deleteEnt( mInstance, handle, &err );
     512                 :        120 :   return (Error)err;
     513                 :            : }
     514                 :            : 
     515                 :            : inline iMesh::Error
     516                 :          3 : iMesh::deleteEntArr( const EntityHandle* entity_handles, int num_handles )
     517                 :            : {
     518                 :            :   int err;
     519         [ +  - ]:          3 :   iMesh_deleteEntArr( mInstance, entity_handles, num_handles, &err );
     520                 :          3 :   return (Error)err;
     521                 :            : }
     522                 :            : 
     523                 :            : inline iMesh::Error
     524                 :          8 : iMesh::getAdjEntities( EntitySetHandle set,
     525                 :            :                        EntityType type_requestor,
     526                 :            :                        EntityTopology topo_requestor,
     527                 :            :                        EntityType type_requested,
     528                 :            :                        std::vector<EntityHandle>& adj_entity_handles,
     529                 :            :                        std::vector<int>& offset ) const
     530                 :            : {
     531         [ +  - ]:          8 :   std::vector<EntityHandle> entities;
     532         [ +  - ]:          8 :   Error err = getEntities( set, type_requestor, topo_requestor, entities );
     533         [ -  + ]:          8 :   if (iBase_SUCCESS != err)
     534                 :          0 :     return err;
     535                 :            :   
     536         [ +  - ]:          8 :   offset.resize( entities.size() + 1 );
     537         [ +  - ]:          8 :   return getEntArrAdj( &entities[0], entities.size(), type_requested,
     538 [ +  - ][ +  - ]:         16 :                        adj_entity_handles, &offset[0] );
     539                 :            : }
     540                 :            :     
     541                 :            : inline iMesh::Error 
     542                 :            : iMesh::initEntIter( EntitySetHandle set,
     543                 :            :                     EntityType requested_type,
     544                 :            :                     EntityTopology requested_topo,
     545                 :            :                        int resilient,
     546                 :            :                     iMesh::EntIter& iter )
     547                 :            : {
     548                 :            :   int err;
     549                 :            :   iter.mInstance = mInstance;
     550                 :            :   iMesh_initEntIter( mInstance, set, requested_type, requested_topo, resilient,
     551                 :            :                      &iter.mHandle, &err );
     552                 :            :   return (Error)err;
     553                 :            : }
     554                 :            : 
     555                 :            : inline iMesh::Error 
     556                 :            : iMesh::initEntArrIter( EntitySetHandle set,
     557                 :            :                        EntityType requested_type,
     558                 :            :                        EntityTopology requested_topo,
     559                 :            :                        int requested_array_size,
     560                 :            :                        int resilient,
     561                 :            :                        iMesh::EntArrIter& iter )
     562                 :            : {
     563                 :            :   int err;
     564                 :            :   iter.mInstance = mInstance;
     565                 :            :   iter.mSize = requested_array_size;
     566                 :            :   iMesh_initEntArrIter( mInstance, set, requested_type, requested_topo,
     567                 :            :                         requested_array_size, resilient, &iter.mHandle, &err );
     568                 :            :   return (Error)err;
     569                 :            : }
     570                 :            : 
     571                 :            : inline 
     572                 :            : iMesh::EntArrIter::~EntArrIter()
     573                 :            : {
     574                 :            :   int err;
     575                 :            :   if (mHandle != 0) {
     576                 :            :     iMesh_endEntArrIter( mInstance, mHandle, &err );
     577                 :            :     mHandle = 0;
     578                 :            :   }
     579                 :            : }
     580                 :            : 
     581                 :            : inline 
     582                 :            : iMesh::EntIter::~EntIter()
     583                 :            : {
     584                 :            :   int err;
     585                 :            :   if (mHandle != 0) {
     586                 :            :     iMesh_endEntIter( mInstance, mHandle, &err );
     587                 :            :     mHandle = 0;
     588                 :            :   }
     589                 :            : }
     590                 :            : 
     591                 :            : inline iMesh::Error
     592                 :            : iMesh::EntArrIter::getNext( EntityHandle* entity_handles,
     593                 :            :                             int& size_out,
     594                 :            :                             bool& has_more_data_out )
     595                 :            : {
     596                 :            :   int err, alloc = mSize, has_data;
     597                 :            :   iMesh_getNextEntArrIter( mInstance, mHandle, &entity_handles, &alloc,
     598                 :            :                            &size_out, &has_data, &err );
     599                 :            :   has_more_data_out = (has_data != 0);
     600                 :            :   return (Error)err;
     601                 :            : }
     602                 :            : 
     603                 :            : inline iMesh::Error
     604                 :            : iMesh::EntIter::getNext( EntityHandle& handle_out, bool& has_more_data_out )
     605                 :            : {
     606                 :            :   int err, has_data;
     607                 :            :   iMesh_getNextEntIter( mInstance, mHandle, &handle_out, &has_data, &err );
     608                 :            :   has_more_data_out = (has_data != 0);
     609                 :            :   return (Error)err;
     610                 :            : }
     611                 :            : 
     612                 :            : inline iMesh::Error
     613                 :            : iMesh::EntArrIter::reset()
     614                 :            : {
     615                 :            :   int err;
     616                 :            :   iMesh_resetEntArrIter( mInstance, mHandle, &err );
     617                 :            :   return (Error)err;
     618                 :            : }
     619                 :            : 
     620                 :            : inline iMesh::Error
     621                 :            : iMesh::EntIter::reset()
     622                 :            : {
     623                 :            :   int err;
     624                 :            :   iMesh_resetEntIter( mInstance, mHandle, &err );
     625                 :            :   return (Error)err;
     626                 :            : }
     627                 :            : 
     628                 :            : inline iMesh::Error
     629                 :         72 : iMesh::getEntTopo( EntityHandle handle, EntityTopology& topo_out ) const
     630                 :            : {
     631                 :            :   int err, result;
     632         [ +  - ]:         72 :   iMesh_getEntTopo( mInstance, handle, &result, &err );
     633                 :         72 :   topo_out = (EntityTopology)result;
     634                 :         72 :   return (Error)err;
     635                 :            : }
     636                 :            : 
     637                 :            : inline iMesh::Error
     638                 :          7 : iMesh::getEntArrTopo( const EntityHandle* entity_handles,
     639                 :            :                       int entity_handles_size,
     640                 :            :                       EntityTopology* topos_out ) const 
     641                 :            : {
     642                 :          7 :   int err, alloc = entity_handles_size, junk, *ptr;
     643         [ +  - ]:          7 :   std::vector<int> storage;
     644                 :            :   if (sizeof(EntityTopology) == sizeof(int))
     645                 :          7 :     ptr = reinterpret_cast<int*>(topos_out);
     646                 :            :   else {
     647                 :            :     storage.resize( entity_handles_size );
     648                 :            :     ptr = &storage[0];
     649                 :            :   }
     650                 :            :   
     651                 :            :   iMesh_getEntArrTopo( mInstance, entity_handles, entity_handles_size,
     652         [ +  - ]:          7 :                        &ptr, &alloc, &junk, &err );
     653                 :            :   
     654                 :            :   if (sizeof(EntityTopology) != sizeof(int))
     655                 :            :     for (int i = 0; i < entity_handles_size; ++i)
     656                 :            :       topos_out[i] = (EntityTopology)storage[i];
     657                 :            :       
     658                 :          7 :   return (Error)err;
     659                 :            : }
     660                 :            :  
     661                 :            : inline iMesh::Error
     662                 :          4 : iMesh::getEntType( EntityHandle handle, EntityType& type_out ) const
     663                 :            : {
     664                 :            :   int err, result;
     665         [ +  - ]:          4 :   iMesh_getEntType( mInstance, handle, &result, &err );
     666                 :          4 :   type_out = (EntityType)result;
     667                 :          4 :   return (Error)err;
     668                 :            : }
     669                 :            : 
     670                 :            : inline iMesh::Error
     671                 :            : iMesh::getEntArrType( const EntityHandle* entity_handles,
     672                 :            :                       int entity_handles_size,
     673                 :            :                       EntityType* types_out ) const
     674                 :            : {
     675                 :            :   int err, alloc = entity_handles_size, junk, *ptr;
     676                 :            :   std::vector<int> storage;
     677                 :            :   if (sizeof(EntityType) == sizeof(int))
     678                 :            :     ptr = reinterpret_cast<int*>(types_out);
     679                 :            :   else {
     680                 :            :     storage.resize( entity_handles_size );
     681                 :            :     ptr = &storage[0];
     682                 :            :   }
     683                 :            :   
     684                 :            :   iMesh_getEntArrType( mInstance, entity_handles, entity_handles_size,
     685                 :            :                        &ptr, &alloc, &junk, &err );
     686                 :            :   
     687                 :            :   if (sizeof(EntityType) != sizeof(int))
     688                 :            :     for (int i = 0; i < entity_handles_size; ++i)
     689                 :            :       types_out[i] = (EntityType)storage[i];
     690                 :            :       
     691                 :            :   return (Error)err;
     692                 :            : }
     693                 :            : 
     694                 :            : inline iMesh::Error
     695                 :        980 : iMesh::getEntAdj( EntityHandle handle, 
     696                 :            :                   EntityType type_requested,
     697                 :            :                   std::vector<EntityHandle>& adj_entities_out ) const
     698                 :            : {
     699         [ +  + ]:        980 :   if (adj_entities_out.capacity() == 0) 
     700         [ +  - ]:        976 :     adj_entities_out.resize(12);
     701                 :            :   else
     702         [ +  - ]:          4 :     adj_entities_out.resize( adj_entities_out.capacity() );
     703                 :            :   
     704                 :        980 :   int err, alloc = adj_entities_out.size(), size = 0;
     705         [ +  - ]:        980 :   EntityHandle* ptr = &adj_entities_out[0];
     706                 :            :   iMesh_getEntAdj( mInstance, handle, type_requested, 
     707         [ +  - ]:        980 :                    &ptr, &alloc, &size, &err );
     708         [ +  - ]:        980 :   adj_entities_out.resize(size);
     709                 :            :   
     710 [ +  - ][ -  + ]:        980 :   if (iBase_BAD_ARRAY_DIMENSION == err || iBase_BAD_ARRAY_SIZE == err) {
     711                 :          0 :     alloc = adj_entities_out.size();
     712         [ #  # ]:          0 :     ptr = &adj_entities_out[0];
     713                 :            :     iMesh_getEntAdj( mInstance, handle, type_requested, 
     714         [ #  # ]:          0 :                      &ptr, &alloc, &size, &err );
     715                 :            :   }
     716                 :            :   
     717                 :        980 :   return (Error)err;
     718                 :            : }
     719                 :            : 
     720                 :            : inline iMesh::Error
     721                 :         23 : iMesh::getEntArrAdj( const EntityHandle* entity_handles,
     722                 :            :                            int entity_handles_size,
     723                 :            :                            EntityType type_requested,
     724                 :            :                            std::vector<EntityHandle>& adj_entities_out,
     725                 :            :                            int* offsets_out ) const
     726                 :            : {
     727         [ +  - ]:         23 :   if (adj_entities_out.capacity() == 0) 
     728         [ +  - ]:         23 :     adj_entities_out.resize(12*entity_handles_size);
     729                 :            :   else
     730         [ #  # ]:          0 :     adj_entities_out.resize( adj_entities_out.capacity() );
     731                 :            :   
     732                 :         23 :   int err, alloc = adj_entities_out.size(), size = 0;
     733                 :         23 :   int off_alloc = entity_handles_size+1, junk;
     734         [ +  - ]:         23 :   EntityHandle* ptr = &adj_entities_out[0];
     735                 :            :   iMesh_getEntArrAdj( mInstance, entity_handles, entity_handles_size, 
     736                 :            :                       type_requested,
     737                 :            :                       &ptr, &alloc, &size,
     738                 :            :                       &offsets_out, &off_alloc, &junk,
     739         [ +  - ]:         23 :                       &err );
     740         [ +  - ]:         23 :   adj_entities_out.resize(size);
     741                 :            :   
     742 [ +  - ][ -  + ]:         23 :   if (iBase_BAD_ARRAY_DIMENSION == err || iBase_BAD_ARRAY_SIZE == err) {
     743                 :          0 :     alloc = adj_entities_out.size();
     744         [ #  # ]:          0 :     ptr = &adj_entities_out[0];
     745                 :            :     iMesh_getEntArrAdj( mInstance, entity_handles, entity_handles_size, 
     746                 :            :                         type_requested,
     747                 :            :                         &ptr, &alloc, &size,
     748                 :            :                         &offsets_out, &off_alloc, &junk,
     749         [ #  # ]:          0 :                         &err );
     750                 :            :   }
     751                 :            :   
     752                 :         23 :   return (Error)err;
     753                 :            : }
     754                 :            : 
     755                 :            :                    
     756                 :            : inline iMesh::Error
     757                 :         16 : iMesh::getEnt2ndAdj( EntityHandle handle, 
     758                 :            :                      EntityType bridge_entity_type,
     759                 :            :                      EntityType type_requested,
     760                 :            :                      std::vector<EntityHandle>& adj_entities_out ) const
     761                 :            : {
     762         [ +  - ]:         16 :   if (adj_entities_out.capacity() == 0) 
     763         [ +  - ]:         16 :     adj_entities_out.resize(12);
     764                 :            :   else
     765         [ #  # ]:          0 :     adj_entities_out.resize( adj_entities_out.capacity() );
     766                 :            :   
     767                 :         16 :   int err, alloc = adj_entities_out.size(), size = 0;
     768         [ +  - ]:         16 :   EntityHandle* ptr = &adj_entities_out[0];
     769                 :            :   iMesh_getEnt2ndAdj( mInstance, handle, bridge_entity_type, type_requested, 
     770         [ +  - ]:         16 :                       &ptr, &alloc, &size, &err );
     771         [ +  - ]:         16 :   adj_entities_out.resize(size);
     772                 :            :   
     773 [ +  - ][ -  + ]:         16 :   if (iBase_BAD_ARRAY_DIMENSION == err || iBase_BAD_ARRAY_SIZE == err) {
     774                 :          0 :     alloc = adj_entities_out.size();
     775         [ #  # ]:          0 :     ptr = &adj_entities_out[0];
     776                 :            :     iMesh_getEnt2ndAdj( mInstance, handle, bridge_entity_type, type_requested, 
     777         [ #  # ]:          0 :                        &ptr, &alloc, &size, &err );
     778                 :            :   }
     779                 :            :   
     780                 :         16 :   return (Error)err;
     781                 :            : }
     782                 :            : 
     783                 :            : inline iMesh::Error
     784                 :            : iMesh::getEntArr2ndAdj( const EntityHandle* entity_handles,
     785                 :            :                         int entity_handles_size,
     786                 :            :                         EntityType order_key,
     787                 :            :                         EntityType type_requested,
     788                 :            :                         std::vector<EntityHandle>& adj_entities_out,
     789                 :            :                         int* offsets_out ) const
     790                 :            : {
     791                 :            :   if (adj_entities_out.capacity() == 0) 
     792                 :            :     adj_entities_out.resize(12*entity_handles_size);
     793                 :            :   else
     794                 :            :     adj_entities_out.resize( adj_entities_out.capacity() );
     795                 :            :   
     796                 :            :   int err, alloc = adj_entities_out.size(), size = 0;
     797                 :            :   int off_alloc = entity_handles_size+1, junk;
     798                 :            :   EntityHandle* ptr = &adj_entities_out[0];
     799                 :            :   iMesh_getEntArr2ndAdj( mInstance, entity_handles, entity_handles_size, 
     800                 :            :                          order_key, type_requested,
     801                 :            :                          &ptr, &alloc, &size,
     802                 :            :                          &offsets_out, &off_alloc, &junk,
     803                 :            :                          &err );
     804                 :            :   adj_entities_out.resize(size);
     805                 :            :   
     806                 :            :   if (iBase_BAD_ARRAY_DIMENSION == err || iBase_BAD_ARRAY_SIZE == err) {
     807                 :            :     alloc = adj_entities_out.size();
     808                 :            :     ptr = &adj_entities_out[0];
     809                 :            :     iMesh_getEntArr2ndAdj( mInstance, entity_handles, entity_handles_size, 
     810                 :            :                            order_key, type_requested,
     811                 :            :                            &ptr, &alloc, &size,
     812                 :            :                            &offsets_out, &off_alloc, &junk,
     813                 :            :                            &err );
     814                 :            :   }
     815                 :            :   
     816                 :            :   return (Error)err;
     817                 :            : }
     818                 :            : 
     819                 :            : 
     820                 :            : inline iMesh::Error
     821                 :         12 : iMesh::getAdjEntIndices( EntitySetHandle set,
     822                 :            :                          EntityType requestor_type,
     823                 :            :                          EntityTopology requestor_topo,
     824                 :            :                          EntityType type_requested,
     825                 :            :                          std::vector<EntityHandle>& entities_out,
     826                 :            :                          std::vector<EntityHandle>& adj_entities_out,
     827                 :            :                          std::vector<int>& adj_indices_out,
     828                 :            :                          std::vector<int>& offsets_out ) const
     829                 :            : {
     830                 :            :     // if input vects have no allocated space, allocate some so
     831                 :            :     // we don't accidentally ask the impl to allocate an array
     832         [ +  - ]:         12 :   if (entities_out.capacity() == 0) {
     833                 :            :     Error err2;
     834                 :            :     int count;
     835         [ +  - ]:         12 :     if (requestor_topo == iMesh_ALL_TOPOLOGIES)
     836         [ +  - ]:         12 :       err2 = getNumOfType( set, requestor_type, count );
     837                 :            :     else
     838         [ #  # ]:          0 :       err2 = getNumOfTopo( set, requestor_topo, count );
     839         [ -  + ]:         12 :     if (err2 != iBase_SUCCESS)
     840                 :          0 :       return err2;
     841         [ +  - ]:         12 :     entities_out.resize( count );
     842                 :            :   }
     843                 :            :   else
     844         [ #  # ]:          0 :     entities_out.resize( entities_out.capacity() );
     845                 :            :     
     846         [ +  - ]:         12 :   if (adj_entities_out.capacity() == 0)
     847         [ +  - ]:         12 :     adj_entities_out.resize( 12*entities_out.size() );
     848                 :            :   else
     849         [ #  # ]:          0 :     adj_entities_out.resize( adj_entities_out.capacity() );
     850                 :            :     
     851         [ +  - ]:         12 :   if (adj_indices_out.capacity() == 0)
     852         [ +  - ]:         12 :     adj_indices_out.resize( 12*entities_out.size() );
     853                 :            :   else
     854         [ #  # ]:          0 :     adj_indices_out.resize( adj_indices_out.capacity() );
     855                 :            :     
     856         [ +  - ]:         12 :   if (offsets_out.capacity() == 0)
     857         [ +  - ]:         12 :     offsets_out.resize( entities_out.size() + 1 );
     858                 :            :   else
     859         [ #  # ]:          0 :     offsets_out.resize( offsets_out.capacity() );
     860                 :            : 
     861                 :            :   int err;
     862                 :         12 :   int     entities_size = 0,     entities_alloc =     entities_out.size();
     863                 :         12 :   int adj_entities_size = 0, adj_entities_alloc = adj_entities_out.size();
     864                 :         12 :   int  adj_indices_size = 0,  adj_indices_alloc =  adj_indices_out.size();
     865                 :         12 :   int      offsets_size = 0,      offsets_alloc =      offsets_out.size();
     866         [ +  - ]:         12 :   EntityHandle*     entities_ptr = &    entities_out[0];
     867         [ +  - ]:         12 :   EntityHandle* adj_entities_ptr = &adj_entities_out[0];
     868         [ +  - ]:         12 :   int         *  adj_indices_ptr = & adj_indices_out[0];
     869         [ +  - ]:         12 :   int         *      offsets_ptr = &     offsets_out[0];
     870                 :            :   
     871                 :            :   iMesh_getAdjEntIndices( mInstance, 
     872                 :            :                           set, requestor_type, requestor_topo,
     873                 :            :                           type_requested,
     874                 :            :                           &    entities_ptr, &    entities_alloc, &    entities_size,
     875                 :            :                           &adj_entities_ptr, &adj_entities_alloc, &adj_entities_size,
     876                 :            :                           & adj_indices_ptr, & adj_indices_alloc, & adj_indices_size,
     877                 :            :                           &     offsets_ptr, &     offsets_alloc, &     offsets_size,
     878         [ +  - ]:         12 :                           &err );
     879                 :            :   
     880         [ +  - ]:         12 :       entities_out.resize(     entities_size );
     881         [ +  - ]:         12 :   adj_entities_out.resize( adj_entities_size );
     882         [ +  - ]:         12 :    adj_indices_out.resize(  adj_indices_size );
     883         [ +  - ]:         12 :        offsets_out.resize(      offsets_size );
     884                 :            :   
     885 [ +  - ][ -  + ]:         12 :   if (iBase_BAD_ARRAY_DIMENSION == err || iBase_BAD_ARRAY_SIZE == err) {
     886                 :          0 :         entities_alloc =     entities_out.size();
     887                 :          0 :     adj_entities_alloc = adj_entities_out.size();
     888                 :          0 :      adj_indices_alloc =  adj_indices_out.size();
     889                 :          0 :          offsets_alloc =      offsets_out.size();
     890         [ #  # ]:          0 :         entities_ptr = &    entities_out[0];
     891         [ #  # ]:          0 :     adj_entities_ptr = &adj_entities_out[0];
     892         [ #  # ]:          0 :      adj_indices_ptr = & adj_indices_out[0];
     893         [ #  # ]:          0 :          offsets_ptr = &     offsets_out[0];
     894                 :            : 
     895                 :            :     iMesh_getAdjEntIndices( mInstance, 
     896                 :            :                             set, requestor_type, requestor_topo,
     897                 :            :                             type_requested,
     898                 :            :                             &    entities_ptr, &    entities_alloc, &    entities_size,
     899                 :            :                             &adj_entities_ptr, &adj_entities_alloc, &adj_entities_size,
     900                 :            :                             & adj_indices_ptr, & adj_indices_alloc, & adj_indices_size,
     901                 :            :                             &     offsets_ptr, &     offsets_alloc, &     offsets_size,
     902         [ #  # ]:          0 :                             &err );
     903                 :            :   }
     904                 :            :   
     905                 :         12 :   return (Error)err;
     906                 :            : }
     907                 :            : 
     908                 :            : #endif
     909                 :            : 

Generated by: LCOV version 1.11