LCOV - code coverage report
Current view: top level - itaps/irel - AssocPair.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 126 233 54.1 %
Date: 2020-12-16 07:07:30 Functions: 20 30 66.7 %
Branches: 122 562 21.7 %

           Branch data     Line data    Source code
       1                 :            : #include "AssocPair.hpp"
       2                 :            : 
       3                 :            : #include <cstdlib>
       4                 :            : 
       5                 :            : #include "Lasso.hpp"
       6                 :            : 
       7                 :            : #ifdef ENABLE_IGEOM
       8                 :            : #include "GeomAssocPairSide.hpp"
       9                 :            : #endif
      10                 :            : #ifdef ENABLE_FBIGEOM
      11                 :            : #include "FBGeomAssocPairSide.hpp"
      12                 :            : #endif
      13                 :            : #ifdef ENABLE_IMESH
      14                 :            : #include "MeshAssocPairSide.hpp"
      15                 :            : #endif
      16                 :            : 
      17                 :            : int AssocPair::currId = 0;
      18                 :            : 
      19                 :          8 : AssocPair::AssocPair( iRel_Instance p_instance, iBase_Instance iface0, iRel_RelationType ent_or_set0,
      20                 :            :                       iRel_IfaceType type0, iRel_RelationStatus p_status0, iBase_Instance iface1,
      21                 :            :                       iRel_RelationType ent_or_set1, iRel_IfaceType type1, iRel_RelationStatus p_status1 )
      22                 :          8 :     : instance( p_instance )
      23                 :            : {
      24                 :          8 :     pairId = currId++;
      25                 :            : 
      26                 :          8 :     iBase_Instance ifaces[] = { iface0, iface1 };
      27                 :          8 :     iRel_IfaceType types[]  = { type0, type1 };
      28         [ +  + ]:         24 :     for( int i = 0; i < 2; i++ )
      29                 :            :     {
      30   [ +  +  +  - ]:         16 :         switch( types[i] )
      31                 :            :         {
      32                 :            : #ifdef ENABLE_IGEOM
      33                 :            :             case iRel_IGEOM_IFACE:
      34 [ +  - ][ +  - ]:          7 :                 relSides[i] = new GeomAssocPairSide( instance, ifaces[i], pairId );
      35                 :          7 :                 break;
      36                 :            : #endif
      37                 :            : #ifdef ENABLE_FBIGEOM
      38                 :            :             case iRel_FBIGEOM_IFACE:
      39 [ +  - ][ +  - ]:          1 :                 relSides[i] = new FBGeomAssocPairSide( instance, ifaces[i], pairId );
      40                 :          1 :                 break;
      41                 :            : #endif
      42                 :            : #ifdef ENABLE_IMESH
      43                 :            :             case iRel_IMESH_IFACE:
      44 [ +  - ][ +  - ]:          8 :                 relSides[i] = new MeshAssocPairSide( instance, ifaces[i], pairId );
      45                 :          8 :                 break;
      46                 :            : #endif
      47                 :            :             default:
      48                 :          0 :                 relSides[i] = NULL;
      49                 :            :         }
      50                 :            :     }
      51                 :            : 
      52                 :          8 :     entOrSet[0]  = ent_or_set0;
      53                 :          8 :     entOrSet[1]  = ent_or_set1;
      54                 :          8 :     relStatus[0] = p_status0;
      55                 :          8 :     relStatus[1] = p_status1;
      56                 :          8 : }
      57                 :            : 
      58                 :          8 : AssocPair::~AssocPair()
      59                 :            : {
      60         [ +  + ]:         24 :     for( int i = 0; i < 2; i++ )
      61         [ +  - ]:         16 :         delete relSides[i];
      62                 :          8 : }
      63                 :            : 
      64                 :          6 : int AssocPair::get_all_entities( int iface_no, int dimension, iBase_EntityHandle** entities, int* entities_alloc,
      65                 :            :                                  int* entities_size )
      66                 :            : {
      67                 :          6 :     return relSides[iface_no]->get_all_entities( dimension, entities, entities_alloc, entities_size );
      68                 :            : }
      69                 :            : 
      70                 :          6 : int AssocPair::get_all_sets( int iface_no, iBase_EntitySetHandle** sets, int* sets_alloc, int* sets_size )
      71                 :            : {
      72                 :          6 :     return relSides[iface_no]->get_all_sets( sets, sets_alloc, sets_size );
      73                 :            : }
      74                 :            : 
      75                 :          0 : int AssocPair::get_entities( int iface_no, int dimension, iBase_EntitySetHandle set_handle,
      76                 :            :                              iBase_EntityHandle** entities, int* entities_alloc, int* entities_size )
      77                 :            : {
      78                 :          0 :     return relSides[iface_no]->get_entities( dimension, set_handle, entities, entities_alloc, entities_size );
      79                 :            : }
      80                 :            : 
      81                 :          9 : int AssocPair::get_ents_dims( int iface_no, iBase_EntityHandle* entities, int entities_size, int** ent_types,
      82                 :            :                               int* ent_types_alloc, int* ent_types_size )
      83                 :            : {
      84                 :          9 :     return relSides[iface_no]->get_ents_dims( entities, entities_size, ent_types, ent_types_alloc, ent_types_size );
      85                 :            : }
      86                 :            : 
      87                 :          0 : int AssocPair::set_relation( iBase_EntityHandle ent1, iBase_EntityHandle ent2 )
      88                 :            : {
      89 [ #  # ][ #  # ]:          0 :     if( entOrSet[0] == iRel_SET || entOrSet[1] == iRel_SET ) ERRORR( iBase_FAILURE, "Invalid relation type" );
                 [ #  # ]
      90                 :            : 
      91                 :            :     // check that if we're passing in an ent for a 'both'-type
      92                 :            :     // assoc, there's already a set associated to the other ent
      93                 :            :     iBase_EntityHandle tmp_ent;
      94 [ #  # ][ #  # ]:          0 :     if( entOrSet[0] == iRel_BOTH && relSides[1]->get_relation_side( &ent2, 1, &tmp_ent ) != iBase_SUCCESS )
         [ #  # ][ #  # ]
      95         [ #  # ]:          0 :         ERRORR( iBase_FAILURE, "Couldn't find associated set on left side" );
      96 [ #  # ][ #  # ]:          0 :     if( entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side( &ent1, 1, &tmp_ent ) != iBase_SUCCESS )
         [ #  # ][ #  # ]
      97         [ #  # ]:          0 :         ERRORR( iBase_FAILURE, "Couldn't find associated set on right side" );
      98                 :            : 
      99                 :            :     // set ent1 => ent2
     100 [ #  # ][ #  # ]:          0 :     if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &ent1, 1, &ent2 ) );
                 [ #  # ]
     101                 :            : 
     102                 :            :     // set ent1 <= ent2
     103 [ #  # ][ #  # ]:          0 :     if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &ent2, 1, &ent1 ) );
                 [ #  # ]
     104                 :            : 
     105         [ #  # ]:          0 :     RETURNR( iBase_SUCCESS );
     106                 :            : }
     107                 :            : 
     108                 :        120 : int AssocPair::set_relation( iBase_EntityHandle ent1, iBase_EntitySetHandle set2 )
     109                 :            : {
     110 [ +  - ][ -  + ]:        120 :     if( entOrSet[0] == iRel_SET || entOrSet[1] == iRel_ENTITY ) ERRORR( iBase_FAILURE, "Invalid relation type" );
                 [ #  # ]
     111                 :            : 
     112                 :            :     // check that if we're passing in an ent for a 'both'-type
     113                 :            :     // assoc, there's already a set associated to the other ent
     114                 :            :     iBase_EntityHandle tmp_ent;
     115 [ -  + ][ #  # ]:        120 :     if( entOrSet[0] == iRel_BOTH && relSides[1]->get_relation_side( &set2, 1, &tmp_ent ) != iBase_SUCCESS )
         [ #  # ][ -  + ]
     116         [ #  # ]:          0 :         ERRORR( iBase_FAILURE, "Couldn't find associated set on left side" );
     117                 :            : 
     118                 :            :     // set ent1 => set2
     119 [ +  - ][ +  - ]:        120 :     if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &ent1, 1, &set2 ) );
                 [ -  + ]
     120                 :            : 
     121                 :            :     // set ent1 <= set2
     122 [ +  - ][ +  - ]:        120 :     if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &set2, 1, &ent1 ) );
                 [ -  + ]
     123                 :            : 
     124                 :            :     // if the right side is a 'both'-type association, set the contents of set2
     125                 :            :     // to point to ent1 as well
     126 [ +  + ][ +  - ]:        120 :     if( entOrSet[1] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 1, set2, ent1 ) );
                 [ -  + ]
     127                 :            : 
     128         [ +  - ]:        120 :     RETURNR( iBase_SUCCESS );
     129                 :            : }
     130                 :            : 
     131                 :          0 : int AssocPair::set_relation( iBase_EntitySetHandle set1, iBase_EntityHandle ent2 )
     132                 :            : {
     133 [ #  # ][ #  # ]:          0 :     if( entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_SET ) ERRORR( iBase_FAILURE, "Invalid relation type" );
                 [ #  # ]
     134                 :            : 
     135                 :            :     // check that if we're passing in an ent for a 'both'-type
     136                 :            :     // assoc, there's already a set associated to the other ent
     137                 :            :     iBase_EntityHandle tmp_ent;
     138 [ #  # ][ #  # ]:          0 :     if( entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side( &set1, 1, &tmp_ent ) != iBase_SUCCESS )
         [ #  # ][ #  # ]
     139         [ #  # ]:          0 :         ERRORR( iBase_FAILURE, "Couldn't find associated set on right side" );
     140                 :            : 
     141                 :            :     // set set1 => ent2
     142 [ #  # ][ #  # ]:          0 :     if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &set1, 1, &ent2 ) );
                 [ #  # ]
     143                 :            : 
     144                 :            :     // set ent1 <= set2
     145 [ #  # ][ #  # ]:          0 :     if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &ent2, 1, &set1 ) );
                 [ #  # ]
     146                 :            : 
     147                 :            :     // if the left side is a 'both'-type association, set the contents of set1
     148                 :            :     // to point to ent2 as well
     149 [ #  # ][ #  # ]:          0 :     if( entOrSet[0] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 0, set1, ent2 ) );
                 [ #  # ]
     150                 :            : 
     151         [ #  # ]:          0 :     RETURNR( iBase_SUCCESS );
     152                 :            : }
     153                 :            : 
     154                 :          4 : int AssocPair::set_relation( iBase_EntitySetHandle set1, iBase_EntitySetHandle set2 )
     155                 :            : {
     156 [ +  - ][ -  + ]:          4 :     if( entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_ENTITY ) ERRORR( iBase_FAILURE, "Invalid relation type" );
     157                 :            : 
     158                 :            :     // set set1 => set2
     159 [ +  + ][ -  + ]:          4 :     if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &set1, 1, &set2 ) );
     160                 :            : 
     161                 :            :     // set set1 <= set2
     162 [ +  - ][ -  + ]:          4 :     if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &set2, 1, &set1 ) );
     163                 :            : 
     164                 :            :     // if either side is a 'both'-type association, set the contents of set1
     165                 :            :     // to point to set2 as well (and/or vice-versa)
     166 [ -  + ][ #  # ]:          4 :     if( entOrSet[0] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 0, set1, set2 ) );
     167 [ -  + ][ #  # ]:          4 :     if( entOrSet[1] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 1, set2, set1 ) );
     168                 :            : 
     169                 :          4 :     RETURNR( iBase_SUCCESS );
     170                 :            : }
     171                 :            : 
     172                 :          6 : int AssocPair::get_relation( int iface_no, iBase_EntityHandle* entities, int num_entities,
     173                 :            :                              iBase_EntityHandle* tag_values )
     174                 :            : {
     175         [ -  + ]:          6 :     if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
     176         [ -  + ]:          6 :     if( entOrSet[!iface_no] != iRel_ENTITY )  // other iface is sets
     177                 :          0 :         ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected EntitySet, got Entity" );
     178                 :            : 
     179                 :          6 :     return relSides[iface_no]->get_relation_side( entities, num_entities, tag_values );
     180                 :            : }
     181                 :            : 
     182                 :          4 : int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets, iBase_EntityHandle* tag_values )
     183                 :            : {
     184         [ -  + ]:          4 :     if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
     185         [ -  + ]:          4 :     if( entOrSet[!iface_no] != iRel_ENTITY )  // other iface is sets
     186                 :          0 :         ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected EntitySet, got Entity" );
     187                 :            : 
     188                 :          4 :     return relSides[iface_no]->get_relation_side( sets, num_sets, tag_values );
     189                 :            : }
     190                 :            : 
     191                 :         12 : int AssocPair::get_relation( int iface_no, iBase_EntityHandle* entities, int num_entities,
     192                 :            :                              iBase_EntitySetHandle* tag_values )
     193                 :            : {
     194         [ -  + ]:         12 :     if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
     195         [ -  + ]:         12 :     if( entOrSet[!iface_no] == iRel_ENTITY )  // other iface is not sets
     196                 :          0 :         ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected Entity, got EntitySet" );
     197                 :            : 
     198                 :         12 :     return relSides[iface_no]->get_relation_side( entities, num_entities, tag_values );
     199                 :            : }
     200                 :            : 
     201                 :          6 : int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets,
     202                 :            :                              iBase_EntitySetHandle* tag_values )
     203                 :            : {
     204         [ +  + ]:          6 :     if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
     205         [ -  + ]:          5 :     if( entOrSet[!iface_no] == iRel_ENTITY )  // other iface is not sets
     206                 :          0 :         ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected Entity, got EntitySet" );
     207                 :            : 
     208                 :          5 :     return relSides[iface_no]->get_relation_side( sets, num_sets, tag_values );
     209                 :            : }
     210                 :            : 
     211                 :          0 : int AssocPair::get_relation( int iface_no, iBase_EntityHandle* entities, int num_entities,
     212                 :            :                              iBase_EntityIterator* tag_values )
     213                 :            : {
     214 [ #  # ][ #  # ]:          0 :     std::vector< iBase_EntitySetHandle > sets( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &sets[0] ) );
         [ #  # ][ #  # ]
     215                 :            : 
     216         [ #  # ]:          0 :     for( int i = 0; i < num_entities; i++ )
     217 [ #  # ][ #  # ]:          0 :         CHK_ERRORR( relSides[i]->get_iterator( sets[i], &tag_values[i] ) );
                 [ #  # ]
     218                 :            : 
     219         [ #  # ]:          0 :     RETURNR( iBase_SUCCESS );
     220                 :            : }
     221                 :            : 
     222                 :          0 : int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets, iBase_EntityIterator* tag_values )
     223                 :            : {
     224 [ #  # ][ #  # ]:          0 :     std::vector< iBase_EntitySetHandle > sets2( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &sets2[0] ) );
         [ #  # ][ #  # ]
     225                 :            : 
     226         [ #  # ]:          0 :     for( int i = 0; i < num_sets; i++ )
     227 [ #  # ][ #  # ]:          0 :         CHK_ERRORR( relSides[iface_no]->get_iterator( sets2[i], &tag_values[i] ) );
                 [ #  # ]
     228                 :            : 
     229         [ #  # ]:          0 :     RETURNR( iBase_SUCCESS );
     230                 :            : }
     231                 :            : 
     232                 :          3 : int AssocPair::rmv_relation( int iface_no, iBase_EntityHandle* entities, int num_entities )
     233                 :            : {
     234         [ -  + ]:          3 :     if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
     235                 :            : 
     236                 :            :     // TODO: handle "both" case
     237                 :            : 
     238                 :            :     // Remove the opposite side first
     239         [ +  - ]:          3 :     if( relStatus[!iface_no] == iRel_ACTIVE )
     240                 :            :     {
     241         [ -  + ]:          3 :         if( entOrSet[!iface_no] == iRel_ENTITY )
     242                 :            :         {
     243 [ #  # ][ #  # ]:          0 :             std::vector< iBase_EntityHandle > other_entities( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &other_entities[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_entities[0], num_entities ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     244                 :            :         }
     245                 :            :         else
     246                 :            :         {
     247 [ +  - ][ +  - ]:          3 :             std::vector< iBase_EntitySetHandle > other_sets( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &other_sets[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_sets[0], num_entities ) );
         [ +  - ][ -  + ]
         [ +  - ][ +  - ]
         [ -  + ][ +  - ]
     248                 :            :         }
     249                 :            :     }
     250                 :            : 
     251                 :          3 :     return relSides[iface_no]->rmv_relation_side( entities, num_entities );
     252                 :            : }
     253                 :            : 
     254                 :          0 : int AssocPair::rmv_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets )
     255                 :            : {
     256         [ #  # ]:          0 :     if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
     257                 :            : 
     258                 :            :     // TODO: handle "both" case
     259                 :            : 
     260                 :            :     // Remove the opposite side first
     261         [ #  # ]:          0 :     if( relStatus[!iface_no] == iRel_ACTIVE )
     262                 :            :     {
     263         [ #  # ]:          0 :         if( entOrSet[!iface_no] == iRel_ENTITY )
     264                 :            :         {
     265 [ #  # ][ #  # ]:          0 :             std::vector< iBase_EntityHandle > other_entities( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &other_entities[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_entities[0], num_sets ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     266                 :            :         }
     267                 :            :         else
     268                 :            :         {
     269 [ #  # ][ #  # ]:          0 :             std::vector< iBase_EntitySetHandle > other_sets( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &other_sets[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_sets[0], num_sets ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     270                 :            :         }
     271                 :            :     }
     272                 :            : 
     273                 :          0 :     return relSides[iface_no]->rmv_relation_side( sets, num_sets );
     274                 :            : }
     275                 :            : 
     276                 :          9 : int AssocPair::get_gids( int iface_no, iBase_EntityHandle* entities, int num_entities, int* tag_values )
     277                 :            : {
     278                 :          9 :     return relSides[iface_no]->get_gids( entities, num_entities, tag_values );
     279                 :            : }
     280                 :            : 
     281                 :          9 : int AssocPair::get_gids( int iface_no, iBase_EntitySetHandle* sets, int num_sets, int* tag_values )
     282                 :            : {
     283                 :          9 :     return relSides[iface_no]->get_gids( sets, num_sets, tag_values );
     284                 :            : }
     285                 :            : 
     286                 :          0 : int AssocPair::get_dims( int iface_no, iBase_EntityHandle* entities, int num_entities, int* tag_values )
     287                 :            : {
     288                 :          0 :     return relSides[iface_no]->get_dims( entities, num_entities, tag_values );
     289                 :            : }
     290                 :            : 
     291                 :          9 : int AssocPair::get_dims( int iface_no, iBase_EntitySetHandle* sets, int num_sets, int* tag_values )
     292                 :            : {
     293                 :          9 :     return relSides[iface_no]->get_dims( sets, num_sets, tag_values );
     294                 :            : }
     295                 :            : 
     296                 :          4 : int AssocPair::change_type( int iface_no, iRel_RelationType type )
     297                 :            : {
     298 [ +  + ][ +  - ]:          4 :     if( entOrSet[iface_no] == type ) RETURNR( iBase_SUCCESS );
     299 [ +  - ][ -  + ]:          2 :     if( entOrSet[iface_no] == iRel_ENTITY || type == iRel_ENTITY )
     300         [ #  # ]:          0 :         ERRORR( iBase_FAILURE, "Can only change type from \"set\" to \"both\", or "
     301                 :            :                                "vice-versa" );
     302                 :            : 
     303                 :          2 :     entOrSet[iface_no] = type;
     304 [ -  + ][ #  # ]:          2 :     if( relStatus[iface_no] != iRel_ACTIVE ) RETURNR( iBase_SUCCESS );
     305                 :            : 
     306                 :          2 :     iBase_EntitySetHandle* sets = NULL;
     307 [ +  - ][ -  + ]:          2 :     int set_alloc               = 0, set_size;CHK_ERRORR( relSides[iface_no]->get_related_sets( &sets, &set_alloc, &set_size ) );
     308         [ +  + ]:          2 :     if( type == iRel_BOTH )
     309                 :            :     {
     310         [ +  - ]:          1 :         if( entOrSet[!iface_no] == iRel_ENTITY )
     311                 :            :         {
     312 [ +  - ][ +  - ]:          1 :             std::vector< iBase_EntityHandle > related_ents( set_size );CHK_ERRORR( relSides[iface_no]->get_relation_side( sets, set_size, &related_ents[0] ) );
         [ +  - ][ -  + ]
     313                 :            : 
     314 [ +  + ][ +  - ]:          2 :             for( int i = 0; i < set_size; i++ )
     315 [ +  - ][ +  - ]:          2 :                 CHK_ERRORR( populate_recursive( iface_no, sets[i], related_ents[i] ) );
                 [ -  + ]
     316                 :            :         }
     317                 :            :         else
     318                 :            :         {
     319 [ #  # ][ #  # ]:          0 :             std::vector< iBase_EntitySetHandle > related_sets( set_size );CHK_ERRORR( relSides[iface_no]->get_relation_side( sets, set_size, &related_sets[0] ) );
         [ #  # ][ #  # ]
     320                 :            : 
     321 [ #  # ][ #  # ]:          0 :             for( int i = 0; i < set_size; i++ )
     322 [ #  # ][ #  # ]:          1 :                 CHK_ERRORR( populate_recursive( iface_no, sets[i], related_sets[i] ) );
                 [ #  # ]
     323                 :            :         }
     324                 :            :     }
     325         [ +  - ]:          1 :     else if( type == iRel_SET )
     326                 :            :     {
     327         [ +  + ]:          2 :         for( int i = 0; i < set_size; i++ )
     328 [ +  - ][ -  + ]:          1 :             CHK_ERRORR( unpopulate_recursive( iface_no, sets[i] ) );
     329                 :            :     }
     330                 :            : 
     331                 :          2 :     free( sets );
     332         [ +  - ]:          4 :     RETURNR( iBase_SUCCESS );
     333                 :            : }
     334                 :            : 
     335                 :          4 : int AssocPair::change_status( int iface_no, iRel_RelationStatus status )
     336                 :            : {
     337         [ +  + ]:          4 :     if( relStatus[iface_no] == status ) RETURNR( iBase_SUCCESS );
     338                 :            : 
     339                 :          2 :     relStatus[iface_no] = status;
     340                 :            : 
     341         [ -  + ]:          2 :     if( status == iRel_NOTEXIST )
     342                 :            :     {
     343                 :            :         // Destroy the assoc tag
     344         [ #  # ]:          0 :         CHK_ERRORR( relSides[iface_no]->destroy_relation_side() );
     345                 :            :     }
     346         [ -  + ]:          2 :     else if( status == iRel_INACTIVE )
     347                 :            :     {
     348                 :            :         // Create the assoc tag
     349         [ #  # ]:          0 :         CHK_ERRORR( relSides[iface_no]->create_relation_side() );
     350                 :            :     }
     351                 :            :     // Update the assoc tag
     352         [ +  - ]:          2 :     else if( status == iRel_ACTIVE )
     353                 :            :     {
     354 [ -  + ][ -  + ]:          2 :         CHK_ERRORR( relSides[iface_no]->destroy_relation_side() );CHK_ERRORR( relSides[iface_no]->create_relation_side() );
     355                 :            : 
     356         [ -  + ]:          2 :         if( entOrSet[!iface_no] == iRel_ENTITY )
     357                 :            :         {
     358                 :          0 :             iBase_EntityHandle* entities = NULL;
     359                 :          0 :             int ent_alloc                = 0, ent_size;
     360                 :            : 
     361 [ #  # ][ #  # ]:          0 :             CHK_ERRORR( relSides[!iface_no]->get_related_ents( &entities, &ent_alloc, &ent_size ) );
     362         [ #  # ]:          0 :             if( entOrSet[iface_no] == iRel_ENTITY )
     363                 :            :             {
     364         [ #  # ]:          0 :                 std::vector< iBase_EntityHandle > related_ents( ent_size );
     365 [ #  # ][ #  # ]:          0 :                 int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_ents[0] );
     366                 :            : 
     367         [ #  # ]:          0 :                 if( result == iBase_SUCCESS )
     368                 :            :                 {
     369         [ #  # ]:          0 :                     if( iface_no == 0 )
     370         [ #  # ]:          0 :                         for( int i = 0; i < ent_size; i++ )
     371 [ #  # ][ #  # ]:          0 :                             CHK_ERRORR( set_relation( related_ents[i], entities[i] ) );
                 [ #  # ]
     372                 :            :                     else
     373 [ #  # ][ #  # ]:          0 :                         for( int i = 0; i < ent_size; i++ )
     374 [ #  # ][ #  # ]:          0 :                             CHK_ERRORR( set_relation( entities[i], related_ents[i] ) );
                 [ #  # ]
     375                 :          0 :                 }
     376                 :            :             }
     377                 :            :             else
     378                 :            :             {
     379         [ #  # ]:          0 :                 std::vector< iBase_EntitySetHandle > related_sets( ent_size );
     380 [ #  # ][ #  # ]:          0 :                 int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_sets[0] );
     381                 :            : 
     382         [ #  # ]:          0 :                 if( result == iBase_SUCCESS )
     383                 :            :                 {
     384         [ #  # ]:          0 :                     if( iface_no == 0 )
     385         [ #  # ]:          0 :                         for( int i = 0; i < ent_size; i++ )
     386 [ #  # ][ #  # ]:          0 :                             CHK_ERRORR( set_relation( related_sets[i], entities[i] ) );
                 [ #  # ]
     387                 :            :                     else
     388 [ #  # ][ #  # ]:          0 :                         for( int i = 0; i < ent_size; i++ )
     389 [ #  # ][ #  # ]:          0 :                             CHK_ERRORR( set_relation( entities[i], related_sets[i] ) );
                 [ #  # ]
     390                 :          0 :                 }
     391                 :            :             }
     392                 :            : 
     393                 :          0 :             free( entities );
     394                 :            :         }
     395                 :            :         else
     396                 :            :         {
     397                 :          2 :             iBase_EntitySetHandle* sets = NULL;
     398                 :          2 :             int set_alloc               = 0, set_size;
     399                 :            : 
     400 [ +  - ][ -  + ]:          4 :             CHK_ERRORR( relSides[!iface_no]->get_related_sets( &sets, &set_alloc, &set_size ) );
     401         [ -  + ]:          2 :             if( entOrSet[iface_no] == iRel_ENTITY )
     402                 :            :             {
     403         [ #  # ]:          0 :                 std::vector< iBase_EntityHandle > related_ents( set_size );
     404 [ #  # ][ #  # ]:          0 :                 int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_ents[0] );
     405                 :            : 
     406         [ #  # ]:          0 :                 if( result == iBase_SUCCESS )
     407                 :            :                 {
     408         [ #  # ]:          0 :                     if( iface_no == 0 )
     409         [ #  # ]:          0 :                         for( int i = 0; i < set_size; i++ )
     410 [ #  # ][ #  # ]:          0 :                             CHK_ERRORR( set_relation( related_ents[i], sets[i] ) );
                 [ #  # ]
     411                 :            :                     else
     412 [ #  # ][ #  # ]:          0 :                         for( int i = 0; i < set_size; i++ )
     413 [ #  # ][ #  # ]:          0 :                             CHK_ERRORR( set_relation( sets[i], related_ents[i] ) );
                 [ #  # ]
     414                 :          0 :                 }
     415                 :            :             }
     416                 :            :             else
     417                 :            :             {
     418         [ +  - ]:          2 :                 std::vector< iBase_EntitySetHandle > related_sets( set_size );
     419 [ +  - ][ +  - ]:          2 :                 int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_sets[0] );
     420                 :            : 
     421         [ +  - ]:          2 :                 if( result == iBase_SUCCESS )
     422                 :            :                 {
     423         [ +  - ]:          2 :                     if( iface_no == 0 )
     424         [ +  + ]:          4 :                         for( int i = 0; i < set_size; i++ )
     425 [ +  - ][ +  - ]:          2 :                             CHK_ERRORR( set_relation( related_sets[i], sets[i] ) );
                 [ -  + ]
     426                 :            :                     else
     427 [ #  # ][ +  - ]:          2 :                         for( int i = 0; i < set_size; i++ )
     428 [ #  # ][ #  # ]:          0 :                             CHK_ERRORR( set_relation( sets[i], related_sets[i] ) );
                 [ #  # ]
     429                 :          2 :                 }
     430                 :            :             }
     431                 :            : 
     432                 :          2 :             free( sets );
     433                 :            :         }
     434                 :            :     }
     435                 :            :     else
     436                 :            :     {
     437                 :          0 :         ERRORR( iBase_INVALID_ARGUMENT, "Invalid argument for relation status" );
     438                 :            :     }
     439                 :            : 
     440                 :          4 :     RETURNR( iBase_SUCCESS );
     441                 :            : }
     442                 :            : 
     443                 :          0 : bool AssocPair::equivalent( iBase_Instance iface0, iBase_Instance iface1, bool* order_switched )
     444                 :            : {
     445 [ #  # ][ #  # ]:          0 :     if( iface0 == relSides[0]->instance() && iface1 == relSides[1]->instance() )
                 [ #  # ]
     446                 :            :     {
     447         [ #  # ]:          0 :         if( order_switched ) *order_switched = false;
     448                 :          0 :         return true;
     449                 :            :     }
     450 [ #  # ][ #  # ]:          0 :     else if( iface0 == relSides[1]->instance() && iface1 == relSides[0]->instance() )
                 [ #  # ]
     451                 :            :     {
     452         [ #  # ]:          0 :         if( order_switched ) *order_switched = true;
     453                 :          0 :         return true;
     454                 :            :     }
     455                 :            :     else
     456                 :          0 :         return false;
     457                 :            : }
     458                 :            : 
     459                 :          0 : bool AssocPair::equivalent( iRel_IfaceType type0, iRel_IfaceType type1, bool* order_switched )
     460                 :            : {
     461 [ #  # ][ #  # ]:          0 :     if( type0 == relSides[0]->type() && type1 == relSides[1]->type() )
                 [ #  # ]
     462                 :            :     {
     463         [ #  # ]:          0 :         if( order_switched ) *order_switched = false;
     464                 :          0 :         return true;
     465                 :            :     }
     466 [ #  # ][ #  # ]:          0 :     else if( type0 == relSides[1]->type() && type1 == relSides[0]->type() )
                 [ #  # ]
     467                 :            :     {
     468         [ #  # ]:          0 :         if( order_switched ) *order_switched = true;
     469                 :          0 :         return true;
     470                 :            :     }
     471                 :            :     else
     472                 :          0 :         return false;
     473                 :            : }
     474                 :            : 
     475                 :          6 : bool AssocPair::contains( iBase_Instance iface )
     476                 :            : {
     477 [ +  + ][ +  - ]:          6 :     return ( iface == relSides[0]->instance() || iface == relSides[1]->instance() );
     478                 :            : }
     479                 :            : 
     480                 :          3 : int AssocPair::populate_recursive( int iface_no, iBase_EntitySetHandle set, iBase_EntityHandle related_ent )
     481                 :            : {
     482                 :          3 :     iBase_EntityHandle* entities = NULL;
     483                 :          3 :     int entities_alloc           = 0, entities_size;
     484                 :            : 
     485 [ +  - ][ -  + ]:          3 :     CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );
     486                 :            : 
     487         [ +  + ]:         15 :     for( int i = 0; i < entities_size; i++ )
     488 [ +  - ][ -  + ]:         12 :         CHK_ERRORR( relSides[iface_no]->set_relation_side( entities + i, 1, &related_ent ) );
     489                 :            : 
     490                 :          3 :     free( entities );
     491         [ +  - ]:          3 :     RETURNR( iBase_SUCCESS );
     492                 :            : }
     493                 :            : 
     494                 :          0 : int AssocPair::populate_recursive( int iface_no, iBase_EntitySetHandle set, iBase_EntitySetHandle related_set )
     495                 :            : {
     496                 :          0 :     iBase_EntityHandle* entities = NULL;
     497                 :            :     int entities_alloc, entities_size;
     498                 :            : 
     499 [ #  # ][ #  # ]:          0 :     CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );
     500                 :            : 
     501         [ #  # ]:          0 :     for( int i = 0; i < entities_size; i++ )
     502 [ #  # ][ #  # ]:          0 :         CHK_ERRORR( relSides[iface_no]->set_relation_side( entities + i, 1, &related_set ) );
     503                 :            : 
     504                 :          0 :     free( entities );
     505         [ #  # ]:          0 :     RETURNR( iBase_SUCCESS );
     506                 :            : }
     507                 :            : 
     508                 :          1 : int AssocPair::unpopulate_recursive( int iface_no, iBase_EntitySetHandle set )
     509                 :            : {
     510                 :          1 :     iBase_EntityHandle* entities = NULL;
     511                 :          1 :     int entities_alloc           = 0, entities_size;
     512                 :            : 
     513 [ +  - ][ -  + ]:          1 :     CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );CHK_ERRORR( relSides[iface_no]->rmv_relation_side( entities, entities_size ) );
         [ +  - ][ -  + ]
     514                 :            : 
     515                 :          1 :     free( entities );
     516         [ +  - ]:          1 :     RETURNR( iBase_SUCCESS );
     517                 :            : }

Generated by: LCOV version 1.11