LCOV - code coverage report
Current view: top level - src - AssocPair.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 146 295 49.5 %
Date: 2015-08-05 10:04:16 Functions: 20 30 66.7 %
Branches: 104 478 21.8 %

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

Generated by: LCOV version 1.11