LCOV - code coverage report
Current view: top level - itaps/irel - iRel_Lasso.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 152 267 56.9 %
Date: 2020-12-16 07:07:30 Functions: 24 47 51.1 %
Branches: 154 486 31.7 %

           Branch data     Line data    Source code
       1                 :            : /**
       2                 :            :  * Copyright 2006 Sandia Corporation.  Under the terms of Contract
       3                 :            :  * DE-AC04-94AL85000 with Sandia Coroporation, the U.S. Government
       4                 :            :  * retains certain rights in this software.
       5                 :            :  *
       6                 :            :  * This library is free software; you can redistribute it and/or
       7                 :            :  * modify it under the terms of the GNU Lesser General Public
       8                 :            :  * License as published by the Free Software Foundation; either
       9                 :            :  * version 2.1 of the License, or (at your option) any later version.
      10                 :            :  *
      11                 :            :  */
      12                 :            : #include "iRel_Lasso.hpp"
      13                 :            : 
      14                 :            : #include "Lasso.hpp"
      15                 :            : #include "AssocPair.hpp"
      16                 :            : #include "ArrayManager.hpp"
      17                 :            : 
      18                 :            : #include <algorithm>
      19                 :            : #include <cmath>
      20                 :            : #include <cstdio>
      21                 :            : #include <iostream>
      22                 :            : #include <map>
      23                 :            : #include <vector>
      24                 :            : 
      25                 :            : const bool debug = false;
      26                 :            : 
      27                 :          0 : void iRel_getErrorType( iRel_Instance instance, int* error_type )
      28                 :            : {
      29         [ #  # ]:          0 :     if( instance == NULL )
      30                 :          0 :         *error_type = iBase_FAILURE;
      31                 :            :     else
      32                 :          0 :         *error_type = LASSOI->lastErrorType;
      33                 :          0 : }
      34                 :            : 
      35                 :          0 : void iRel_getDescription( iRel_Instance instance, char* descr, int descr_len )
      36                 :            : {
      37         [ #  # ]:          0 :     if( instance == NULL ) { strcpy( descr, "iRel_getDescription: Invalid instance" ); }
      38                 :            :     else
      39                 :            :     {
      40         [ #  # ]:          0 :         unsigned int len = std::min( strlen( LASSOI->lastErrorDescription ), static_cast< size_t >( descr_len ) );
      41                 :          0 :         strncpy( descr, LASSOI->lastErrorDescription, len );
      42                 :          0 :         descr[len] = '\0';
      43                 :            :     }
      44                 :          0 : }
      45                 :            : 
      46                 :          5 : void iRel_create( /* in */ const char* /* options */, iRel_Instance* instance, int* err, const int options_len )
      47                 :            : {
      48         [ -  + ]:          5 :     if( 0 != options_len )
      49                 :            :     {
      50                 :          0 :         *instance = NULL;
      51                 :          0 :         *err      = iBase_NOT_SUPPORTED;
      52                 :            :     }
      53                 :            : 
      54         [ +  - ]:          5 :     *instance = new Lasso();
      55                 :          5 :     *err      = iBase_SUCCESS;
      56                 :          5 : }
      57                 :            : 
      58                 :          5 : void iRel_destroy( iRel_Instance instance, int* err )
      59                 :            : {
      60         [ +  - ]:          5 :     delete LASSOI;
      61                 :          5 :     *err = iBase_SUCCESS;
      62                 :          5 : }
      63                 :            : 
      64                 :          8 : void iRel_createPair( iRel_Instance instance, iBase_Instance iface1, const int ent_or_set1, const int iface_type1,
      65                 :            :                       const int irel_status1, iBase_Instance iface2, const int ent_or_set2, const int iface_type2,
      66                 :            :                       const int irel_status2, iRel_PairHandle* pair, int* err )
      67                 :            : {
      68                 :            :     AssocPair* assoc_pair = new AssocPair(
      69                 :            :         instance, iface1, static_cast< iRel_RelationType >( ent_or_set1 ), static_cast< iRel_IfaceType >( iface_type1 ),
      70                 :            :         static_cast< iRel_RelationStatus >( irel_status1 ), iface2, static_cast< iRel_RelationType >( ent_or_set2 ),
      71         [ +  - ]:          8 :         static_cast< iRel_IfaceType >( iface_type2 ), static_cast< iRel_RelationStatus >( irel_status2 ) );
      72                 :          8 :     LASSOI->insert_pair( assoc_pair );
      73                 :            : 
      74                 :          8 :     *pair = reinterpret_cast< iRel_PairHandle >( assoc_pair );
      75                 :          8 :     RETURN( iBase_SUCCESS );
      76                 :            : }
      77                 :            : 
      78                 :          3 : void iRel_getPairInfo( iRel_Instance instance, iRel_PairHandle pair, iBase_Instance* iface1, int* ent_or_set1,
      79                 :            :                        int* iface_type1, int* irel_status1, iBase_Instance* iface2, int* ent_or_set2, int* iface_type2,
      80                 :            :                        int* irel_status2, int* err )
      81                 :            : {
      82         [ -  + ]:          3 :     CHK_PAIR();
      83                 :            : 
      84                 :          3 :     *iface1       = ASSOCPAIRI->iface_instance( 0 );
      85                 :          3 :     *ent_or_set1  = ASSOCPAIRI->relation_type( 0 );
      86                 :          3 :     *iface_type1  = ASSOCPAIRI->iface_type( 0 );
      87                 :          3 :     *irel_status1 = ASSOCPAIRI->relation_status( 0 );
      88                 :          3 :     *iface2       = ASSOCPAIRI->iface_instance( 1 );
      89                 :          3 :     *iface_type2  = ASSOCPAIRI->iface_type( 1 );
      90                 :          3 :     *ent_or_set2  = ASSOCPAIRI->relation_type( 1 );
      91                 :          3 :     *irel_status2 = ASSOCPAIRI->relation_status( 1 );
      92                 :            : 
      93                 :          3 :     RETURN( iBase_SUCCESS );
      94                 :            : }
      95                 :            : 
      96                 :          2 : void iRel_changePairType( iRel_Instance instance, iRel_PairHandle pair, int ent_or_set1, int ent_or_set2, int* err )
      97                 :            : {
      98         [ -  + ]:          2 :     CHK_PAIR();
      99                 :            : 
     100 [ -  + ][ -  + ]:          2 :     CHK_ERROR( ASSOCPAIRI->change_type( 0, static_cast< iRel_RelationType >( ent_or_set1 ) ) );CHK_ERROR( ASSOCPAIRI->change_type( 1, static_cast< iRel_RelationType >( ent_or_set2 ) ) );
     101                 :            : }
     102                 :            : 
     103                 :          2 : void iRel_changePairStatus( iRel_Instance instance, iRel_PairHandle pair, int irel_status1, int irel_status2, int* err )
     104                 :            : {
     105         [ -  + ]:          2 :     CHK_PAIR();
     106                 :            : 
     107 [ -  + ][ -  + ]:          2 :     CHK_ERROR( ASSOCPAIRI->change_status( 0, static_cast< iRel_RelationStatus >( irel_status1 ) ) );CHK_ERROR( ASSOCPAIRI->change_status( 1, static_cast< iRel_RelationStatus >( irel_status2 ) ) );
     108                 :            : }
     109                 :            : 
     110                 :          0 : void iRel_destroyPair( iRel_Instance instance, iRel_PairHandle pair, int* err )
     111                 :            : {
     112         [ #  # ]:          0 :     CHK_PAIR();
     113                 :            : 
     114         [ #  # ]:          0 :     CHK_ERROR( LASSOI->erase_pair( ASSOCPAIRI ) );
     115                 :            : }
     116                 :            : 
     117                 :          6 : void iRel_findPairs( iRel_Instance instance, iBase_Instance iface, iRel_PairHandle** pairs, int* pairs_allocated,
     118                 :            :                      int* pairs_size, int* err )
     119                 :            : {
     120         [ +  - ]:          6 :     std::vector< AssocPair* > tmp_pairs;
     121         [ +  - ]:          6 :     LASSOI->find_pairs( iface, tmp_pairs );
     122                 :            : 
     123 [ +  - ][ -  + ]:         12 :     ALLOC_CHECK_ARRAY_NOFAIL( pairs, tmp_pairs.size() );
                 [ +  - ]
     124         [ +  + ]:         12 :     for( size_t i = 0; i < tmp_pairs.size(); ++i )
     125                 :            :     {
     126         [ +  - ]:          6 :         ( *pairs )[i] = reinterpret_cast< iRel_PairHandle >( tmp_pairs[i] );
     127                 :            :     }
     128                 :            : 
     129         [ +  - ]:         12 :     RETURN( iBase_SUCCESS );
     130                 :            : }
     131                 :            : 
     132                 :          0 : void iRel_setEntEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1,
     133                 :            :                              iBase_EntityHandle ent2, int* err )
     134                 :            : {
     135 [ #  # ][ #  # ]:          0 :     CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( ent1, ent2 ) );
     136                 :            : }
     137                 :            : 
     138                 :          3 : void iRel_setEntSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1,
     139                 :            :                              iBase_EntitySetHandle set2, int* err )
     140                 :            : {
     141 [ -  + ][ -  + ]:          3 :     CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( ent1, set2 ) );
     142                 :            : }
     143                 :            : 
     144                 :          0 : void iRel_setSetEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1,
     145                 :            :                              iBase_EntityHandle ent2, int* err )
     146                 :            : {
     147 [ #  # ][ #  # ]:          0 :     CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( set1, ent2 ) );
     148                 :            : }
     149                 :            : 
     150                 :          2 : void iRel_setSetSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1,
     151                 :            :                              iBase_EntitySetHandle set2, int* err )
     152                 :            : {
     153 [ -  + ][ -  + ]:          2 :     CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( set1, set2 ) );
     154                 :            : }
     155                 :            : 
     156                 :          0 : void iRel_setEntArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
     157                 :            :                                    int num_entities1, iBase_EntityHandle* ent_array_2, int num_entities2, int* err )
     158                 :            : {
     159 [ #  # ][ #  # ]:          0 :     CHK_PAIR();
     160                 :            : 
     161         [ #  # ]:          0 :     if( num_entities1 != num_entities2 )
     162         [ #  # ]:          0 :         ERROR( iBase_INVALID_ENTITY_COUNT, "setEntArrEntArrRelation doesn't support "
     163                 :            :                                            "different #'s of entities." );
     164                 :            : 
     165                 :          0 :     int result = iBase_SUCCESS;
     166                 :            :     char descr[200];
     167         [ #  # ]:          0 :     for( int i = 0; i < num_entities1; i++ )
     168                 :            :     {
     169         [ #  # ]:          0 :         int tmp_result = ASSOCPAIRI->set_relation( ent_array_1[i], ent_array_2[i] );
     170 [ #  # ][ #  # ]:          0 :         if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
     171                 :            :         {
     172                 :          0 :             result = tmp_result;
     173         [ #  # ]:          0 :             iRel_getDescription( instance, descr, sizeof( descr ) );
     174                 :            :         }
     175                 :            :     }
     176                 :            : 
     177 [ #  # ][ #  # ]:          0 :     if( result != iBase_SUCCESS ) ERROR( result, descr );
     178         [ #  # ]:          0 :     RETURN( iBase_SUCCESS );
     179                 :            : }
     180                 :            : 
     181                 :          2 : void iRel_setEntArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
     182                 :            :                                    int num_entities1, iBase_EntitySetHandle* set_array_2, int num_sets2, int* err )
     183                 :            : {
     184 [ -  + ][ #  # ]:          2 :     CHK_PAIR();
     185                 :            : 
     186         [ -  + ]:          2 :     if( num_entities1 != num_sets2 )
     187         [ #  # ]:          0 :         ERROR( iBase_INVALID_ENTITY_COUNT, "setEntArrSetArrRelation doesn't support "
     188                 :            :                                            "different #'s of entities." );
     189                 :            : 
     190                 :          2 :     int result = iBase_SUCCESS;
     191                 :            :     char descr[200];
     192         [ +  + ]:         44 :     for( int i = 0; i < num_entities1; i++ )
     193                 :            :     {
     194         [ +  - ]:         42 :         int tmp_result = ASSOCPAIRI->set_relation( ent_array_1[i], set_array_2[i] );
     195 [ +  - ][ -  + ]:         42 :         if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
     196                 :            :         {
     197                 :          0 :             result = tmp_result;
     198         [ #  # ]:          0 :             iRel_getDescription( instance, descr, sizeof( descr ) );
     199                 :            :         }
     200                 :            :     }
     201                 :            : 
     202 [ -  + ][ #  # ]:          2 :     if( result != iBase_SUCCESS ) ERROR( result, descr );
     203         [ +  - ]:          2 :     RETURN( iBase_SUCCESS );
     204                 :            : }
     205                 :            : 
     206                 :          0 : void iRel_setSetArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
     207                 :            :                                    int num_sets1, iBase_EntityHandle* ent_array_2, int num_entities2, int* err )
     208                 :            : {
     209 [ #  # ][ #  # ]:          0 :     CHK_PAIR();
     210                 :            : 
     211         [ #  # ]:          0 :     if( num_sets1 != num_entities2 )
     212         [ #  # ]:          0 :         ERROR( iBase_INVALID_ENTITY_COUNT, "setSetArrEntArrRelation doesn't support "
     213                 :            :                                            "different #'s of entities." );
     214                 :            : 
     215                 :          0 :     int result = iBase_SUCCESS;
     216                 :            :     char descr[200];
     217         [ #  # ]:          0 :     for( int i = 0; i < num_sets1; i++ )
     218                 :            :     {
     219         [ #  # ]:          0 :         int tmp_result = ASSOCPAIRI->set_relation( set_array_1[i], ent_array_2[i] );
     220 [ #  # ][ #  # ]:          0 :         if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
     221                 :            :         {
     222                 :          0 :             result = tmp_result;
     223         [ #  # ]:          0 :             iRel_getDescription( instance, descr, sizeof( descr ) );
     224                 :            :         }
     225                 :            :     }
     226                 :            : 
     227 [ #  # ][ #  # ]:          0 :     if( result != iBase_SUCCESS ) ERROR( result, descr );
     228         [ #  # ]:          0 :     RETURN( iBase_SUCCESS );
     229                 :            : }
     230                 :            : 
     231                 :          0 : void iRel_setSetArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
     232                 :            :                                    int num_sets1, iBase_EntitySetHandle* set_array_2, int num_sets2, int* err )
     233                 :            : {
     234 [ #  # ][ #  # ]:          0 :     CHK_PAIR();
     235                 :            : 
     236         [ #  # ]:          0 :     if( num_sets1 != num_sets2 )
     237         [ #  # ]:          0 :         ERROR( iBase_INVALID_ENTITY_COUNT, "setSetArrSetArrRelation doesn't support "
     238                 :            :                                            "different #'s of entities." );
     239                 :            : 
     240                 :          0 :     int result = iBase_SUCCESS;
     241                 :            :     char descr[200];
     242         [ #  # ]:          0 :     for( int i = 0; i < num_sets1; i++ )
     243                 :            :     {
     244         [ #  # ]:          0 :         int tmp_result = ASSOCPAIRI->set_relation( set_array_1[i], set_array_2[i] );
     245 [ #  # ][ #  # ]:          0 :         if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
     246                 :            :         {
     247                 :          0 :             result = tmp_result;
     248         [ #  # ]:          0 :             iRel_getDescription( instance, descr, sizeof( descr ) );
     249                 :            :         }
     250                 :            :     }
     251                 :            : 
     252 [ #  # ][ #  # ]:          0 :     if( result != iBase_SUCCESS ) ERROR( result, descr );
     253         [ #  # ]:          0 :     RETURN( iBase_SUCCESS );
     254                 :            : }
     255                 :            : 
     256                 :          4 : void iRel_getEntEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1, int switch_order,
     257                 :            :                              iBase_EntityHandle* ent2, int* err )
     258                 :            : {
     259         [ -  + ]:          4 :     CHK_PAIR();
     260                 :            : 
     261 [ +  - ][ +  - ]:          4 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &ent1, 1, ent2 ) );
     262                 :            : }
     263                 :            : 
     264                 :          0 : void iRel_getEntSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1, int switch_order,
     265                 :            :                              iBase_EntitySetHandle* set2, int* err )
     266                 :            : {
     267         [ #  # ]:          0 :     CHK_PAIR();
     268                 :            : 
     269 [ #  # ][ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &ent1, 1, set2 ) );
     270                 :            : }
     271                 :            : 
     272                 :          0 : void iRel_getSetEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1, int switch_order,
     273                 :            :                              iBase_EntityHandle* ent2, int* err )
     274                 :            : {
     275         [ #  # ]:          0 :     CHK_PAIR();
     276                 :            : 
     277 [ #  # ][ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &set1, 1, ent2 ) );
     278                 :            : }
     279                 :            : 
     280                 :          6 : void iRel_getSetSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1, int switch_order,
     281                 :            :                              iBase_EntitySetHandle* set2, int* err )
     282                 :            : {
     283         [ -  + ]:          6 :     CHK_PAIR();
     284                 :            : 
     285 [ +  + ][ +  + ]:          6 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &set1, 1, set2 ) );
     286                 :            : }
     287                 :            : 
     288                 :          0 : void iRel_getEntSetIterRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1,
     289                 :            :                                  int switch_order, iBase_EntityIterator* entset2, int* err )
     290                 :            : {
     291         [ #  # ]:          0 :     CHK_PAIR();
     292                 :            : 
     293 [ #  # ][ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &ent1, 1, entset2 ) );
     294                 :            : }
     295                 :            : 
     296                 :          2 : void iRel_getEntArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
     297                 :            :                                    int ent_array_1_size, int switch_order, iBase_EntityHandle** ent_array_2,
     298                 :            :                                    int* ent_array_2_allocated, int* ent_array_2_size, int* err )
     299                 :            : {
     300 [ -  + ][ #  # ]:          2 :     CHK_PAIR();
     301                 :            : 
     302         [ +  - ]:          2 :     int iface_no = ( switch_order ? 1 : 0 );
     303 [ +  - ][ -  + ]:          2 :     ALLOC_CHECK_ARRAY( ent_array_2, ent_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, ent_array_1, ent_array_1_size, *ent_array_2 ) );
         [ +  - ][ -  + ]
     304                 :            : 
     305         [ +  - ]:          2 :     KEEP_ARRAY( ent_array_2 );
     306         [ +  - ]:          2 :     RETURN( iBase_SUCCESS );
     307                 :            : }
     308                 :            : 
     309                 :          9 : void iRel_getEntArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
     310                 :            :                                    int ent_array_1_size, int switch_order, iBase_EntitySetHandle** set_array_2,
     311                 :            :                                    int* set_array_2_allocated, int* set_array_2_size, int* err )
     312                 :            : {
     313 [ -  + ][ #  # ]:          9 :     CHK_PAIR();
     314                 :            : 
     315         [ -  + ]:          9 :     int iface_no = ( switch_order ? 1 : 0 );
     316 [ +  - ][ -  + ]:          9 :     ALLOC_CHECK_ARRAY( set_array_2, ent_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, ent_array_1, ent_array_1_size, *set_array_2 ) );
         [ +  - ][ +  + ]
     317                 :            : 
     318         [ +  - ]:          7 :     KEEP_ARRAY( set_array_2 );
     319         [ +  - ]:          9 :     RETURN( iBase_SUCCESS );
     320                 :            : }
     321                 :            : 
     322                 :          4 : void iRel_getSetArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
     323                 :            :                                    int set_array_1_size, int switch_order, iBase_EntityHandle** ent_array_2,
     324                 :            :                                    int* ent_array_2_allocated, int* ent_array_2_size, int* err )
     325                 :            : {
     326 [ -  + ][ #  # ]:          4 :     CHK_PAIR();
     327                 :            : 
     328         [ +  - ]:          4 :     int iface_no = ( switch_order ? 1 : 0 );
     329 [ +  - ][ -  + ]:          4 :     ALLOC_CHECK_ARRAY( ent_array_2, set_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, set_array_1, set_array_1_size, *ent_array_2 ) );
         [ +  - ][ -  + ]
     330                 :            : 
     331         [ +  - ]:          4 :     KEEP_ARRAY( ent_array_2 );
     332         [ +  - ]:          4 :     RETURN( iBase_SUCCESS );
     333                 :            : }
     334                 :            : 
     335                 :          0 : void iRel_getSetArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
     336                 :            :                                    int set_array_1_size, int switch_order, iBase_EntitySetHandle** set_array_2,
     337                 :            :                                    int* set_array_2_allocated, int* set_array_2_size, int* err )
     338                 :            : {
     339 [ #  # ][ #  # ]:          0 :     CHK_PAIR();
     340                 :            : 
     341         [ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );
     342 [ #  # ][ #  # ]:          0 :     ALLOC_CHECK_ARRAY( set_array_2, set_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, set_array_1, set_array_1_size, *set_array_2 ) );
         [ #  # ][ #  # ]
     343                 :            : 
     344         [ #  # ]:          0 :     KEEP_ARRAY( set_array_2 );
     345         [ #  # ]:          0 :     RETURN( iBase_SUCCESS );
     346                 :            : }
     347                 :            : 
     348                 :          0 : void iRel_getEntArrSetIterArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
     349                 :            :                                        int ent_array_1_size, int switch_order, iBase_EntityIterator** entiter,
     350                 :            :                                        int* entiter_allocated, int* entiter_size, int* err )
     351                 :            : {
     352 [ #  # ][ #  # ]:          0 :     CHK_PAIR();
     353                 :            : 
     354         [ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );
     355                 :            :     ;
     356 [ #  # ][ #  # ]:          0 :     ALLOC_CHECK_ARRAY( entiter, ent_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, ent_array_1, ent_array_1_size, *entiter ) );
         [ #  # ][ #  # ]
     357                 :            : 
     358         [ #  # ]:          0 :     KEEP_ARRAY( entiter );
     359         [ #  # ]:          0 :     RETURN( iBase_SUCCESS );
     360                 :            : }
     361                 :            : 
     362                 :          0 : void iRel_rmvEntRelation( iRel_Instance instance,
     363                 :            :                           /*in*/ iRel_PairHandle pair,
     364                 :            :                           /*in*/ iBase_EntityHandle ent,
     365                 :            :                           /*in*/ int switch_order,
     366                 :            :                           /*out*/ int* err )
     367                 :            : {
     368         [ #  # ]:          0 :     CHK_PAIR();
     369                 :            : 
     370 [ #  # ][ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, &ent, 1 ) );
     371                 :            : }
     372                 :            : 
     373                 :          0 : void iRel_rmvSetRelation( iRel_Instance instance,
     374                 :            :                           /*in*/ iRel_PairHandle pair,
     375                 :            :                           /*in*/ iBase_EntitySetHandle entset,
     376                 :            :                           /*in*/ int switch_order,
     377                 :            :                           /*out*/ int* err )
     378                 :            : {
     379         [ #  # ]:          0 :     CHK_PAIR();
     380                 :            : 
     381 [ #  # ][ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, &entset, 1 ) );
     382                 :            : }
     383                 :            : 
     384                 :          3 : void iRel_rmvEntArrRelation( iRel_Instance instance,
     385                 :            :                              /*in*/ iRel_PairHandle pair,
     386                 :            :                              /*in*/ iBase_EntityHandle* ent_array,
     387                 :            :                              /*in*/ int num_ent,
     388                 :            :                              /*in*/ int switch_order,
     389                 :            :                              /*out*/ int* err )
     390                 :            : {
     391         [ -  + ]:          3 :     CHK_PAIR();
     392                 :            : 
     393 [ -  + ][ -  + ]:          3 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, ent_array, num_ent ) );
     394                 :            : }
     395                 :            : 
     396                 :          0 : void iRel_rmvSetArrRelation( iRel_Instance instance,
     397                 :            :                              /*in*/ iRel_PairHandle pair,
     398                 :            :                              /*in*/ iBase_EntitySetHandle* entset_array,
     399                 :            :                              /*in*/ int num_ent,
     400                 :            :                              /*in*/ int switch_order,
     401                 :            :                              /*out*/ int* err )
     402                 :            : {
     403         [ #  # ]:          0 :     CHK_PAIR();
     404                 :            : 
     405 [ #  # ][ #  # ]:          0 :     int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, entset_array, num_ent ) );
     406                 :            : }
     407                 :            : 
     408                 :         18 : static int get_gids_and_dims( iRel_PairHandle pair, int iface_no, iBase_EntityHandle* ents, int ents_size,
     409                 :            :                               int ent_or_set, std::vector< int >& ents_gids, std::vector< int >& ents_dims )
     410                 :            : {
     411                 :            :     int result;
     412                 :         18 :     iBase_EntitySetHandle* sets = reinterpret_cast< iBase_EntitySetHandle* >( ents );
     413                 :            : 
     414                 :         18 :     ents_gids.resize( ents_size );
     415         [ +  + ]:         18 :     if( ent_or_set == iRel_ENTITY )
     416                 :          9 :         result = ASSOCPAIRI->get_gids( iface_no, ents, ents_size, &ents_gids[0] );
     417                 :            :     else
     418                 :          9 :         result = ASSOCPAIRI->get_gids( iface_no, sets, ents_size, &ents_gids[0] );
     419                 :            : 
     420 [ -  + ][ #  # ]:         18 :     if( iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result ) return result;
     421                 :            : 
     422         [ +  - ]:         18 :     ents_dims.resize( ents_size, -1 );
     423         [ +  + ]:         18 :     if( ent_or_set == iRel_ENTITY )
     424                 :            :     {
     425         [ +  - ]:          9 :         int* ents_dims_ptr  = &ents_dims[0];
     426                 :          9 :         int ents_dims_alloc = ents_dims.size(), ents_dims_size;
     427                 :            :         result =
     428         [ +  - ]:          9 :             ASSOCPAIRI->get_ents_dims( iface_no, ents, ents_size, &ents_dims_ptr, &ents_dims_alloc, &ents_dims_size );
     429                 :            :     }
     430                 :            :     else
     431                 :            :     {
     432                 :          9 :         result = ASSOCPAIRI->get_dims( iface_no, sets, ents_size, &ents_dims[0] );
     433                 :            :     }
     434                 :            : 
     435 [ -  + ][ #  # ]:         18 :     if( iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result ) return result;
     436                 :            : 
     437                 :         18 :     return iBase_SUCCESS;
     438                 :            : }
     439                 :            : 
     440                 :          9 : static void iRel_inferArrArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ents1,
     441                 :            :                                        const int ents1_size, int ent_or_set1, iBase_EntityHandle* ents2,
     442                 :            :                                        const int ents2_size, int ent_or_set2, int* err )
     443                 :            : {
     444                 :            :     int result;
     445                 :            : 
     446 [ +  - ][ +  - ]:         18 :     std::vector< int > ents_gids, ents_dims;
     447 [ +  - ][ +  + ]:         90 :     std::map< const int, iBase_EntityHandle > ents_gid_map[4];
                 [ +  + ]
           [ #  #  #  # ]
     448                 :            : 
     449         [ +  - ]:          9 :     get_gids_and_dims( pair, 0, ents1, ents1_size, ent_or_set1, ents_gids, ents_dims );
     450         [ +  + ]:        107 :     for( int i = 0; i < ents1_size; i++ )
     451                 :            :     {
     452         [ +  - ]:         98 :         int dim = ents_dims[i];
     453 [ +  - ][ +  - ]:         98 :         if( 0 <= dim && 3 >= dim ) ents_gid_map[dim][ents_gids[i]] = ents1[i];
         [ +  - ][ +  - ]
     454                 :            :     }
     455                 :            : 
     456         [ +  - ]:          9 :     get_gids_and_dims( pair, 1, ents2, ents2_size, ent_or_set2, ents_gids, ents_dims );
     457         [ +  + ]:        112 :     for( int i = 0; i < ents2_size; i++ )
     458                 :            :     {
     459         [ +  - ]:        103 :         int dim = ents_dims[i];
     460                 :            : 
     461                 :            :         // only check entities for which the dimension entry is in a reasonable
     462                 :            :         // range
     463 [ +  - ][ -  + ]:        103 :         if( 0 > dim || 3 < dim ) continue;
     464                 :            : 
     465                 :            :         // there's a match if there's an entity with that dimension with matching id
     466 [ +  - ][ +  - ]:        103 :         std::map< const int, iBase_EntityHandle >::iterator iter = ents_gid_map[dim].find( ents_gids[i] );
     467                 :            : 
     468                 :            :         // if it matches, set the relation tags for those entities
     469 [ +  - ][ +  + ]:        103 :         if( iter != ents_gid_map[dim].end() )
     470                 :            :         {
     471 [ +  - ][ -  + ]:         75 :             if( ent_or_set1 == iRel_ENTITY && ent_or_set2 == iRel_ENTITY )
     472 [ #  # ][ #  # ]:          0 :             { result = ASSOCPAIRI->set_relation( ( *iter ).second, ents2[i] ); }
     473 [ -  + ][ #  # ]:         75 :             else if( ent_or_set1 != iRel_ENTITY && ent_or_set2 == iRel_ENTITY )
     474                 :            :             {
     475 [ #  # ][ #  # ]:          0 :                 result = ASSOCPAIRI->set_relation( ( iBase_EntitySetHandle )( *iter ).second, ents2[i] );
     476                 :            :             }
     477 [ +  - ][ +  - ]:         75 :             else if( ent_or_set1 == iRel_ENTITY && ent_or_set2 != iRel_ENTITY )
     478                 :            :             {
     479 [ +  - ][ +  - ]:         75 :                 result = ASSOCPAIRI->set_relation( ( *iter ).second, (iBase_EntitySetHandle)ents2[i] );
     480                 :            :             }
     481                 :            :             else
     482                 :            :             {  // ent_or_set1 != iRel_ENTITY && ent_or_set2 != iRel_ENTITY
     483         [ #  # ]:          0 :                 result = ASSOCPAIRI->set_relation( ( iBase_EntitySetHandle )( *iter ).second,
     484         [ #  # ]:          0 :                                                    (iBase_EntitySetHandle)ents2[i] );
     485                 :            :             }
     486                 :            : 
     487         [ -  + ]:        103 :             CHK_ERROR( result );
     488                 :            :         }
     489                 :            :     }
     490                 :            : 
     491 [ +  - ][ #  # ]:         18 :     RETURN( iBase_SUCCESS );
     492                 :            : }
     493                 :            : 
     494                 :          0 : void iRel_inferEntArrEntArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ents1,
     495                 :            :                                       const int ents1_size, iBase_EntityHandle* ents2, const int ents2_size, int* err )
     496                 :            : {
     497                 :          0 :     iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, 0, ents2, ents2_size, 0, err );
     498                 :          0 : }
     499                 :            : 
     500                 :          0 : void iRel_inferEntArrSetArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ents1,
     501                 :            :                                       const int ents1_size, iBase_EntitySetHandle* ents2, const int ents2_size,
     502                 :            :                                       int* err )
     503                 :            : {
     504                 :          0 :     iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, 0, (iBase_EntityHandle*)ents2, ents2_size, 1, err );
     505                 :          0 : }
     506                 :            : 
     507                 :          0 : void iRel_inferSetArrEntArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* ents1,
     508                 :            :                                       const int ents1_size, iBase_EntityHandle* ents2, const int ents2_size, int* err )
     509                 :            : {
     510                 :          0 :     iRel_inferArrArrRelations( instance, pair, (iBase_EntityHandle*)ents1, ents1_size, 1, ents2, ents2_size, 0, err );
     511                 :          0 : }
     512                 :            : 
     513                 :          0 : void iRel_inferSetArrSetArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* ents1,
     514                 :            :                                       const int ents1_size, int /*is_set1*/, iBase_EntitySetHandle* ents2,
     515                 :            :                                       const int ents2_size, int /*is_set2*/, int* err )
     516                 :            : 
     517                 :            : {
     518                 :            :     iRel_inferArrArrRelations( instance, pair, (iBase_EntityHandle*)ents1, ents1_size, 1, (iBase_EntityHandle*)ents2,
     519                 :          0 :                                ents2_size, 1, err );
     520                 :          0 : }
     521                 :            : 
     522                 :          3 : void iRel_inferAllRelations( iRel_Instance instance, iRel_PairHandle pair, int* err )
     523                 :            : {
     524 [ -  + ][ #  # ]:          6 :     CHK_PAIR();
     525                 :            : 
     526                 :            :     // get all entities in those interfaces
     527                 :            :     int result;
     528                 :            : 
     529                 :          3 :     iBase_EntityHandle* ents1 = NULL;
     530                 :          3 :     int ents1_alloc           = 0, ents1_size;
     531 [ +  - ][ -  + ]:          3 :     if( ASSOCPAIRI->relation_type( 0 ) != iRel_ENTITY )
     532         [ #  # ]:          0 :         result = ASSOCPAIRI->get_all_sets( 0, (iBase_EntitySetHandle**)&ents1, &ents1_alloc, &ents1_size );
     533                 :            :     else
     534 [ +  - ][ -  + ]:          3 :         result = ASSOCPAIRI->get_all_entities( 0, -1, &ents1, &ents1_alloc, &ents1_size );CHK_ERROR( result );
     535                 :            : 
     536                 :          3 :     iBase_EntityHandle* ents2 = NULL;
     537                 :          3 :     int ents2_alloc           = 0, ents2_size;
     538 [ +  - ][ +  - ]:          3 :     if( ASSOCPAIRI->relation_type( 1 ) != iRel_ENTITY )
     539         [ +  - ]:          3 :         result = ASSOCPAIRI->get_all_sets( 1, (iBase_EntitySetHandle**)&ents2, &ents2_alloc, &ents2_size );
     540                 :            :     else
     541 [ #  # ][ -  + ]:          3 :         result = ASSOCPAIRI->get_all_entities( 1, -1, &ents2, &ents2_alloc, &ents2_size );CHK_ERROR( result );
     542                 :            : 
     543         [ +  - ]:          3 :     iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, ASSOCPAIRI->relation_type( 0 ), ents2, ents2_size,
     544 [ +  - ][ +  - ]:          6 :                                ASSOCPAIRI->relation_type( 1 ), &result );
     545                 :            : 
     546                 :          3 :     free( ents1 );
     547         [ -  + ]:          3 :     free( ents2 );CHK_ERROR( result );
     548                 :            : }
     549                 :            : 
     550                 :          0 : void iRel_inferAllRelationsAndType( iRel_Instance instance, iRel_PairHandle* /*pair*/, int* err )
     551                 :            : {
     552                 :          0 :     ERROR( iBase_NOT_SUPPORTED, "Not currently supported." );
     553                 :            : }
     554                 :            : 
     555                 :          0 : void iRel_inferEntRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle entity, int iface_no,
     556                 :            :                              int* err )
     557                 :            : {
     558                 :          0 :     iRel_inferEntArrRelations( instance, pair, &entity, 1, iface_no, err );
     559                 :          0 : }
     560                 :            : 
     561                 :          0 : void iRel_inferSetRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle entity, int iface_no,
     562                 :            :                              int* err )
     563                 :            : {
     564                 :          0 :     iRel_inferSetArrRelations( instance, pair, &entity, 1, iface_no, err );
     565                 :          0 : }
     566                 :            : 
     567                 :          6 : static void iRel_inferArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* entities,
     568                 :            :                                     int entities_size, bool is_set, int iface_no, int* err )
     569                 :            : {
     570 [ -  + ][ #  # ]:         12 :     CHK_PAIR();
     571                 :            : 
     572 [ +  - ][ -  + ]:          6 :     if( 0 > iface_no || 1 < iface_no ) { ERROR( iBase_INVALID_ARGUMENT, "Interface number must be 0 or 1" ); }
                 [ #  # ]
     573 [ +  + ][ +  - ]:          9 :     else if( ( is_set && ASSOCPAIRI->relation_type( iface_no ) == iRel_ENTITY ) ||
         [ +  - ][ +  + ]
                 [ -  + ]
     574 [ +  - ][ -  + ]:          3 :              ( !is_set && ASSOCPAIRI->relation_type( iface_no ) != iRel_ENTITY ) )
     575                 :            :     {
     576         [ #  # ]:          0 :         ERROR( iBase_INVALID_ARGUMENT, "is_set must match entOrSet in call to "
     577                 :            :                                        "inferArrRelations" );
     578                 :            :     }
     579                 :            : 
     580                 :            :     // get all entities in iface2
     581                 :            :     int result;
     582                 :          6 :     iBase_EntityHandle* ents1 = entities;
     583                 :          6 :     int ents1_size            = entities_size;
     584                 :          6 :     iBase_EntityHandle* ents2 = NULL;
     585                 :          6 :     int ents2_alloc           = 0, ents2_size;
     586 [ +  - ][ +  + ]:          6 :     if( ASSOCPAIRI->relation_type( 1 - iface_no ) != iRel_ENTITY )
     587         [ +  - ]:          3 :         result = ASSOCPAIRI->get_all_sets( !iface_no, (iBase_EntitySetHandle**)&ents2, &ents2_alloc, &ents2_size );
     588                 :            :     else
     589 [ +  - ][ -  + ]:          6 :         result = ASSOCPAIRI->get_all_entities( !iface_no, -1, &ents2, &ents2_alloc, &ents2_size );CHK_ERROR( result );
     590                 :            : 
     591                 :            :     // switch so that entity lists always go into inferArrArrRelations in
     592                 :            :     // forward order wrt pair
     593         [ +  + ]:          6 :     if( 1 == iface_no )
     594                 :            :     {
     595                 :          3 :         std::swap( ents1, ents2 );
     596                 :          3 :         std::swap( ents1_size, ents2_size );
     597                 :            :     }
     598                 :            : 
     599         [ +  - ]:          6 :     iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, ASSOCPAIRI->relation_type( 0 ), ents2, ents2_size,
     600 [ +  - ][ +  - ]:         12 :                                ASSOCPAIRI->relation_type( 1 ), &result );
     601                 :            : 
     602         [ +  + ]:          6 :     free( 1 == iface_no ? ents1 : ents2 );
     603                 :            : 
     604         [ -  + ]:          6 :     CHK_ERROR( result );
     605                 :            : }
     606                 :            : 
     607                 :          3 : void iRel_inferEntArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* entities,
     608                 :            :                                 int entities_size, int iface_no, int* err )
     609                 :            : {
     610                 :          3 :     iRel_inferArrRelations( instance, pair, entities, entities_size, false, iface_no, err );
     611                 :          3 : }
     612                 :            : 
     613                 :          3 : void iRel_inferSetArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* entities,
     614                 :            :                                 int entities_size, int iface_no, int* err )
     615                 :            : {
     616                 :          3 :     iRel_inferArrRelations( instance, pair, (iBase_EntityHandle*)entities, entities_size, true, iface_no, err );
     617 [ +  - ][ +  - ]:         20 : }

Generated by: LCOV version 1.11