LCOV - code coverage report
Current view: top level - src - iRel_Lasso.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 167 304 54.9 %
Date: 2015-08-05 10:04:16 Functions: 24 47 51.1 %
Branches: 135 376 35.9 %

           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) {
      38                 :          0 :     strcpy(descr, "iRel_getDescription: Invalid instance");
      39                 :            :   }
      40                 :            :   else {
      41                 :          0 :     unsigned int len = std::min(strlen(LASSOI->lastErrorDescription),
      42                 :          0 :                                 static_cast<size_t>(descr_len));
      43                 :          0 :     strncpy(descr, LASSOI->lastErrorDescription, len);
      44                 :          0 :     descr[len] = '\0';
      45                 :            :   }
      46                 :          0 : }
      47                 :            : 
      48                 :          4 : void iRel_create(/* in */ const char * /* options */,
      49                 :            :                  iRel_Instance *instance,
      50                 :            :                  int *err,
      51                 :            :                  const int options_len)
      52                 :            : {
      53         [ -  + ]:          4 :   if (0 != options_len) {
      54                 :          0 :     *instance = NULL;
      55                 :          0 :     *err = iBase_NOT_SUPPORTED;
      56                 :            :   }
      57                 :            : 
      58         [ +  - ]:          4 :   *instance = new Lasso();
      59                 :          4 :   *err = iBase_SUCCESS;
      60                 :          4 : }
      61                 :            : 
      62                 :          4 : void iRel_destroy(iRel_Instance instance, int *err)
      63                 :            : {
      64         [ +  - ]:          4 :   delete LASSOI;
      65                 :          4 :   *err = iBase_SUCCESS;
      66                 :          4 : }
      67                 :            : 
      68                 :          7 : void iRel_createPair (
      69                 :            :   iRel_Instance instance,
      70                 :            :   iBase_Instance iface1,
      71                 :            :   const int ent_or_set1,
      72                 :            :   const int iface_type1,
      73                 :            :   const int irel_status1,
      74                 :            :   iBase_Instance iface2,
      75                 :            :   const int ent_or_set2,
      76                 :            :   const int iface_type2,
      77                 :            :   const int irel_status2,
      78                 :            :   iRel_PairHandle *pair,
      79                 :            :   int *err)
      80                 :            : {
      81                 :            :   AssocPair *assoc_pair = new AssocPair(
      82                 :            :     instance,
      83                 :            :     iface1, static_cast<iRel_RelationType>(ent_or_set1),
      84                 :            :     static_cast<iRel_IfaceType>(iface_type1),
      85                 :            :     static_cast<iRel_RelationStatus>(irel_status1),
      86                 :            :     iface2, static_cast<iRel_RelationType>(ent_or_set2),
      87                 :            :     static_cast<iRel_IfaceType>(iface_type2),
      88                 :            :     static_cast<iRel_RelationStatus>(irel_status2)
      89         [ +  - ]:          7 :   );
      90                 :          7 :   LASSOI->insert_pair(assoc_pair);
      91                 :            : 
      92                 :          7 :   *pair = reinterpret_cast<iRel_PairHandle>(assoc_pair);
      93                 :          7 :   RETURN(iBase_SUCCESS);
      94                 :            : }
      95                 :            : 
      96                 :          2 : void iRel_getPairInfo (
      97                 :            :   iRel_Instance instance,
      98                 :            :   iRel_PairHandle pair,
      99                 :            :   iBase_Instance *iface1,
     100                 :            :   int *ent_or_set1,
     101                 :            :   int *iface_type1,
     102                 :            :   int *irel_status1,
     103                 :            :   iBase_Instance *iface2,
     104                 :            :   int *ent_or_set2,
     105                 :            :   int *iface_type2,
     106                 :            :   int *irel_status2,
     107                 :            :   int *err)
     108                 :            : {
     109         [ -  + ]:          2 :   CHK_PAIR();
     110                 :            : 
     111                 :          2 :   *iface1       = ASSOCPAIRI->iface_instance(0);
     112                 :          2 :   *ent_or_set1  = ASSOCPAIRI->relation_type(0);
     113                 :          2 :   *iface_type1  = ASSOCPAIRI->iface_type(0);
     114                 :          2 :   *irel_status1 = ASSOCPAIRI->relation_status(0);
     115                 :          2 :   *iface2       = ASSOCPAIRI->iface_instance(1);
     116                 :          2 :   *iface_type2  = ASSOCPAIRI->iface_type(1);
     117                 :          2 :   *ent_or_set2  = ASSOCPAIRI->relation_type(1);
     118                 :          2 :   *irel_status2 = ASSOCPAIRI->relation_status(1);
     119                 :            : 
     120                 :          2 :   RETURN(iBase_SUCCESS);
     121                 :            : }
     122                 :            : 
     123                 :          2 : void iRel_changePairType (
     124                 :            :   iRel_Instance instance,
     125                 :            :   iRel_PairHandle pair,
     126                 :            :   int ent_or_set1,
     127                 :            :   int ent_or_set2,
     128                 :            :   int *err)
     129                 :            : {
     130         [ -  + ]:          2 :   CHK_PAIR();
     131                 :            : 
     132         [ -  + ]:          2 :   CHK_ERROR( ASSOCPAIRI->change_type(0, static_cast<iRel_RelationType>(
     133                 :            :                                      ent_or_set1)) );
     134         [ -  + ]:          2 :   CHK_ERROR( ASSOCPAIRI->change_type(1, static_cast<iRel_RelationType>(
     135                 :            :                                      ent_or_set2)) );
     136                 :            : }
     137                 :            : 
     138                 :          2 : void iRel_changePairStatus (
     139                 :            :   iRel_Instance instance,
     140                 :            :   iRel_PairHandle pair,
     141                 :            :   int irel_status1,
     142                 :            :   int irel_status2,
     143                 :            :   int *err)
     144                 :            : {
     145         [ -  + ]:          2 :   CHK_PAIR();
     146                 :            : 
     147         [ -  + ]:          2 :   CHK_ERROR( ASSOCPAIRI->change_status(0, static_cast<iRel_RelationStatus>(
     148                 :            :                                        irel_status1)) );
     149         [ -  + ]:          2 :   CHK_ERROR( ASSOCPAIRI->change_status(1, static_cast<iRel_RelationStatus>(
     150                 :            :                                        irel_status2)) );
     151                 :            : }
     152                 :            : 
     153                 :          0 : void iRel_destroyPair (
     154                 :            :   iRel_Instance instance,
     155                 :            :   iRel_PairHandle pair,
     156                 :            :   int *err)
     157                 :            : {
     158         [ #  # ]:          0 :   CHK_PAIR();
     159                 :            : 
     160         [ #  # ]:          0 :   CHK_ERROR( LASSOI->erase_pair(ASSOCPAIRI) );
     161                 :            : }
     162                 :            : 
     163                 :          4 : void iRel_findPairs (
     164                 :            :   iRel_Instance instance,
     165                 :            :   iBase_Instance iface,
     166                 :            :   iRel_PairHandle **pairs,
     167                 :            :   int *pairs_allocated,
     168                 :            :   int *pairs_size,
     169                 :            :   int *err
     170                 :            :   )
     171                 :            : {
     172                 :          4 :   std::vector<AssocPair*> tmp_pairs;
     173         [ +  - ]:          4 :   LASSOI->find_pairs(iface, tmp_pairs);
     174                 :            : 
     175 [ +  - ][ +  - ]:          4 :   ALLOC_CHECK_ARRAY_NOFAIL(pairs, tmp_pairs.size());
         [ +  - ][ +  - ]
     176 [ +  - ][ +  + ]:          8 :   for (size_t i=0; i<tmp_pairs.size(); ++i) {
     177         [ +  - ]:          4 :     (*pairs)[i] = reinterpret_cast<iRel_PairHandle>(tmp_pairs[i]);
     178                 :            :   }
     179                 :            : 
     180 [ +  - ][ +  - ]:          4 :   RETURN(iBase_SUCCESS);
     181                 :            : }
     182                 :            : 
     183                 :          0 : void iRel_setEntEntRelation (
     184                 :            :   iRel_Instance instance,
     185                 :            :   iRel_PairHandle pair,
     186                 :            :   iBase_EntityHandle ent1,
     187                 :            :   iBase_EntityHandle ent2,
     188                 :            :   int *err)
     189                 :            : {
     190         [ #  # ]:          0 :   CHK_PAIR();
     191         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->set_relation(ent1, ent2) );
     192                 :            : }
     193                 :            : 
     194                 :          3 : void iRel_setEntSetRelation (
     195                 :            :   iRel_Instance instance,
     196                 :            :   iRel_PairHandle pair,
     197                 :            :   iBase_EntityHandle ent1,
     198                 :            :   iBase_EntitySetHandle set2,
     199                 :            :   int *err)
     200                 :            : {
     201         [ -  + ]:          3 :   CHK_PAIR();
     202         [ -  + ]:          3 :   CHK_ERROR( ASSOCPAIRI->set_relation(ent1, set2) );
     203                 :            : }
     204                 :            : 
     205                 :          0 : void iRel_setSetEntRelation (
     206                 :            :   iRel_Instance instance,
     207                 :            :   iRel_PairHandle pair,
     208                 :            :   iBase_EntitySetHandle set1,
     209                 :            :   iBase_EntityHandle ent2,
     210                 :            :   int *err)
     211                 :            : {
     212         [ #  # ]:          0 :   CHK_PAIR();
     213         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->set_relation(set1, ent2) );
     214                 :            : }
     215                 :            : 
     216                 :          2 : void iRel_setSetSetRelation (
     217                 :            :   iRel_Instance instance,
     218                 :            :   iRel_PairHandle pair,
     219                 :            :   iBase_EntitySetHandle set1,
     220                 :            :   iBase_EntitySetHandle set2,
     221                 :            :   int *err)
     222                 :            : {
     223         [ -  + ]:          2 :   CHK_PAIR();
     224         [ -  + ]:          2 :   CHK_ERROR( ASSOCPAIRI->set_relation(set1, set2) );
     225                 :            : }
     226                 :            : 
     227                 :          0 : void iRel_setEntArrEntArrRelation (
     228                 :            :   iRel_Instance instance,
     229                 :            :   iRel_PairHandle pair,
     230                 :            :   iBase_EntityHandle *ent_array_1,
     231                 :            :   int num_entities1,
     232                 :            :   iBase_EntityHandle *ent_array_2,
     233                 :            :   int num_entities2,
     234                 :            :   int *err)
     235                 :            : {
     236         [ #  # ]:          0 :   CHK_PAIR();
     237                 :            : 
     238         [ #  # ]:          0 :   if (num_entities1 != num_entities2)
     239                 :          0 :     ERROR(iBase_INVALID_ENTITY_COUNT, "setEntArrEntArrRelation doesn't support "
     240                 :            :           "different #'s of entities.");
     241                 :            : 
     242                 :          0 :   int result = iBase_SUCCESS;
     243                 :            :   char descr[200];
     244         [ #  # ]:          0 :   for (int i = 0; i < num_entities1; i++) {
     245                 :          0 :     int tmp_result = ASSOCPAIRI->set_relation(ent_array_1[i], ent_array_2[i]);
     246 [ #  # ][ #  # ]:          0 :     if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
     247                 :          0 :       result = tmp_result;
     248                 :          0 :       iRel_getDescription(instance, descr, sizeof(descr));
     249                 :            :     }
     250                 :            :   }
     251                 :            : 
     252         [ #  # ]:          0 :   if (result != iBase_SUCCESS)
     253                 :          0 :     ERROR(result, descr);
     254                 :          0 :   RETURN(iBase_SUCCESS);
     255                 :            : }
     256                 :            : 
     257                 :          2 : void iRel_setEntArrSetArrRelation (
     258                 :            :   iRel_Instance instance,
     259                 :            :   iRel_PairHandle pair,
     260                 :            :   iBase_EntityHandle *ent_array_1,
     261                 :            :   int num_entities1,
     262                 :            :   iBase_EntitySetHandle *set_array_2,
     263                 :            :   int num_sets2,
     264                 :            :   int *err)
     265                 :            : {
     266         [ -  + ]:          2 :   CHK_PAIR();
     267                 :            : 
     268         [ -  + ]:          2 :   if (num_entities1 != num_sets2)
     269                 :          0 :     ERROR(iBase_INVALID_ENTITY_COUNT, "setEntArrSetArrRelation doesn't support "
     270                 :            :           "different #'s of entities.");
     271                 :            : 
     272                 :          2 :   int result = iBase_SUCCESS;
     273                 :            :   char descr[200];
     274         [ +  + ]:         44 :   for (int i = 0; i < num_entities1; i++) {
     275                 :         42 :     int tmp_result = ASSOCPAIRI->set_relation(ent_array_1[i], set_array_2[i]);
     276 [ +  - ][ -  + ]:         42 :     if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
     277                 :          0 :       result = tmp_result;
     278                 :          0 :       iRel_getDescription(instance, descr, sizeof(descr));
     279                 :            :     }
     280                 :            :   }
     281                 :            : 
     282         [ -  + ]:          2 :   if (result != iBase_SUCCESS)
     283                 :          0 :     ERROR(result, descr);
     284                 :          2 :   RETURN(iBase_SUCCESS);
     285                 :            : }
     286                 :            : 
     287                 :          0 : void iRel_setSetArrEntArrRelation (
     288                 :            :   iRel_Instance instance,
     289                 :            :   iRel_PairHandle pair,
     290                 :            :   iBase_EntitySetHandle *set_array_1,
     291                 :            :   int num_sets1,
     292                 :            :   iBase_EntityHandle *ent_array_2,
     293                 :            :   int num_entities2,
     294                 :            :   int *err)
     295                 :            : {
     296         [ #  # ]:          0 :   CHK_PAIR();
     297                 :            : 
     298         [ #  # ]:          0 :   if (num_sets1 != num_entities2)
     299                 :          0 :     ERROR(iBase_INVALID_ENTITY_COUNT, "setSetArrEntArrRelation doesn't support "
     300                 :            :           "different #'s of entities.");
     301                 :            : 
     302                 :          0 :   int result = iBase_SUCCESS;
     303                 :            :   char descr[200];
     304         [ #  # ]:          0 :   for (int i = 0; i < num_sets1; i++) {
     305                 :          0 :     int tmp_result = ASSOCPAIRI->set_relation(set_array_1[i], ent_array_2[i]);
     306 [ #  # ][ #  # ]:          0 :     if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
     307                 :          0 :       result = tmp_result;
     308                 :          0 :       iRel_getDescription(instance, descr, sizeof(descr));
     309                 :            :     }
     310                 :            :   }
     311                 :            : 
     312         [ #  # ]:          0 :   if (result != iBase_SUCCESS)
     313                 :          0 :     ERROR(result, descr);
     314                 :          0 :   RETURN(iBase_SUCCESS);
     315                 :            : }
     316                 :            : 
     317                 :          0 : void iRel_setSetArrSetArrRelation (
     318                 :            :   iRel_Instance instance,
     319                 :            :   iRel_PairHandle pair,
     320                 :            :   iBase_EntitySetHandle *set_array_1,
     321                 :            :   int num_sets1,
     322                 :            :   iBase_EntitySetHandle *set_array_2,
     323                 :            :   int num_sets2,
     324                 :            :   int *err)
     325                 :            : {
     326         [ #  # ]:          0 :   CHK_PAIR();
     327                 :            : 
     328         [ #  # ]:          0 :   if (num_sets1 != num_sets2)
     329                 :          0 :     ERROR(iBase_INVALID_ENTITY_COUNT, "setSetArrSetArrRelation doesn't support "
     330                 :            :           "different #'s of entities.");
     331                 :            : 
     332                 :          0 :   int result = iBase_SUCCESS;
     333                 :            :   char descr[200];
     334         [ #  # ]:          0 :   for (int i = 0; i < num_sets1; i++) {
     335                 :          0 :     int tmp_result = ASSOCPAIRI->set_relation(set_array_1[i], set_array_2[i]);
     336 [ #  # ][ #  # ]:          0 :     if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
     337                 :          0 :       result = tmp_result;
     338                 :          0 :       iRel_getDescription(instance, descr, sizeof(descr));
     339                 :            :     }
     340                 :            :   }
     341                 :            : 
     342         [ #  # ]:          0 :   if (result != iBase_SUCCESS)
     343                 :          0 :     ERROR(result, descr);
     344                 :          0 :   RETURN(iBase_SUCCESS);
     345                 :            : }
     346                 :            : 
     347                 :          4 : void iRel_getEntEntRelation (
     348                 :            :   iRel_Instance instance,
     349                 :            :   iRel_PairHandle pair,
     350                 :            :   iBase_EntityHandle ent1,
     351                 :            :   int switch_order,
     352                 :            :   iBase_EntityHandle *ent2,
     353                 :            :   int *err)
     354                 :            : {
     355         [ -  + ]:          4 :   CHK_PAIR();
     356                 :            : 
     357         [ +  - ]:          4 :   int iface_no = (switch_order ? 1 : 0);
     358         [ +  - ]:          4 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &ent1, 1, ent2) );
     359                 :            : }
     360                 :            : 
     361                 :          0 : void iRel_getEntSetRelation (
     362                 :            :   iRel_Instance instance,
     363                 :            :   iRel_PairHandle pair,
     364                 :            :   iBase_EntityHandle ent1,
     365                 :            :   int switch_order,
     366                 :            :   iBase_EntitySetHandle *set2,
     367                 :            :   int *err)
     368                 :            : {
     369         [ #  # ]:          0 :   CHK_PAIR();
     370                 :            : 
     371         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);
     372         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &ent1, 1, set2) );
     373                 :            : }
     374                 :            : 
     375                 :          0 : void iRel_getSetEntRelation (
     376                 :            :   iRel_Instance instance,
     377                 :            :   iRel_PairHandle pair,
     378                 :            :   iBase_EntitySetHandle set1,
     379                 :            :   int switch_order,
     380                 :            :   iBase_EntityHandle *ent2,
     381                 :            :   int *err)
     382                 :            : {
     383         [ #  # ]:          0 :   CHK_PAIR();
     384                 :            : 
     385         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);
     386         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &set1, 1, ent2) );
     387                 :            : }
     388                 :            : 
     389                 :          6 : void iRel_getSetSetRelation (
     390                 :            :   iRel_Instance instance,
     391                 :            :   iRel_PairHandle pair,
     392                 :            :   iBase_EntitySetHandle set1,
     393                 :            :   int switch_order,
     394                 :            :   iBase_EntitySetHandle *set2,
     395                 :            :   int *err)
     396                 :            : {
     397         [ -  + ]:          6 :   CHK_PAIR();
     398                 :            : 
     399         [ +  + ]:          6 :   int iface_no = (switch_order ? 1 : 0);
     400         [ +  + ]:          6 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &set1, 1, set2) );
     401                 :            : }
     402                 :            : 
     403                 :          0 : void iRel_getEntSetIterRelation (
     404                 :            :   iRel_Instance instance,
     405                 :            :   iRel_PairHandle pair,
     406                 :            :   iBase_EntityHandle ent1,
     407                 :            :   int switch_order,
     408                 :            :   iBase_EntityIterator *entset2,
     409                 :            :   int *err)
     410                 :            : {
     411         [ #  # ]:          0 :   CHK_PAIR();
     412                 :            : 
     413         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);
     414         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &ent1, 1, entset2) );
     415                 :            : }
     416                 :            : 
     417                 :          2 : void iRel_getEntArrEntArrRelation(
     418                 :            :   iRel_Instance instance,
     419                 :            :   iRel_PairHandle pair,
     420                 :            :   iBase_EntityHandle *ent_array_1,
     421                 :            :   int ent_array_1_size,
     422                 :            :   int switch_order,
     423                 :            :   iBase_EntityHandle **ent_array_2,
     424                 :            :   int *ent_array_2_allocated,
     425                 :            :   int *ent_array_2_size,
     426                 :            :   int *err)
     427                 :            : {
     428         [ -  + ]:          2 :   CHK_PAIR();
     429                 :            : 
     430         [ +  - ]:          2 :   int iface_no = (switch_order ? 1 : 0);
     431         [ +  - ]:          2 :   ALLOC_CHECK_ARRAY(ent_array_2, ent_array_1_size);
     432 [ +  - ][ +  - ]:          2 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, ent_array_1, ent_array_1_size,
     433                 :            :                                         *ent_array_2) );
     434                 :            : 
     435         [ +  - ]:          2 :   KEEP_ARRAY(ent_array_2);
     436         [ +  - ]:          2 :   RETURN(iBase_SUCCESS);
     437                 :            : }
     438                 :            : 
     439                 :          6 : void iRel_getEntArrSetArrRelation(
     440                 :            :   iRel_Instance instance,
     441                 :            :   iRel_PairHandle pair,
     442                 :            :   iBase_EntityHandle *ent_array_1,
     443                 :            :   int ent_array_1_size,
     444                 :            :   int switch_order,
     445                 :            :   iBase_EntitySetHandle **set_array_2,
     446                 :            :   int *set_array_2_allocated,
     447                 :            :   int *set_array_2_size,
     448                 :            :   int *err)
     449                 :            : {
     450         [ -  + ]:          6 :   CHK_PAIR();
     451                 :            : 
     452         [ -  + ]:          6 :   int iface_no = (switch_order ? 1 : 0);
     453         [ +  - ]:          6 :   ALLOC_CHECK_ARRAY(set_array_2, ent_array_1_size);
     454 [ +  - ][ +  + ]:          6 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, ent_array_1, ent_array_1_size,
     455                 :            :                                         *set_array_2) );
     456                 :            : 
     457         [ +  - ]:          4 :   KEEP_ARRAY(set_array_2);
     458         [ +  - ]:          6 :   RETURN(iBase_SUCCESS);
     459                 :            : }
     460                 :            : 
     461                 :          4 : void iRel_getSetArrEntArrRelation(
     462                 :            :   iRel_Instance instance,
     463                 :            :   iRel_PairHandle pair,
     464                 :            :   iBase_EntitySetHandle *set_array_1,
     465                 :            :   int set_array_1_size,
     466                 :            :   int switch_order,
     467                 :            :   iBase_EntityHandle **ent_array_2,
     468                 :            :   int *ent_array_2_allocated,
     469                 :            :   int *ent_array_2_size,
     470                 :            :   int *err)
     471                 :            : {
     472         [ -  + ]:          4 :   CHK_PAIR();
     473                 :            : 
     474         [ +  - ]:          4 :   int iface_no = (switch_order ? 1 : 0);
     475         [ +  - ]:          4 :   ALLOC_CHECK_ARRAY(ent_array_2, set_array_1_size);
     476 [ +  - ][ +  - ]:          4 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, set_array_1, set_array_1_size,
     477                 :            :                                         *ent_array_2) );
     478                 :            : 
     479         [ +  - ]:          4 :   KEEP_ARRAY(ent_array_2);
     480         [ +  - ]:          4 :   RETURN(iBase_SUCCESS);
     481                 :            : }
     482                 :            : 
     483                 :          0 : void iRel_getSetArrSetArrRelation(
     484                 :            :   iRel_Instance instance,
     485                 :            :   iRel_PairHandle pair,
     486                 :            :   iBase_EntitySetHandle *set_array_1,
     487                 :            :   int set_array_1_size,
     488                 :            :   int switch_order,
     489                 :            :   iBase_EntitySetHandle **set_array_2,
     490                 :            :   int *set_array_2_allocated,
     491                 :            :   int *set_array_2_size,
     492                 :            :   int *err)
     493                 :            : {
     494         [ #  # ]:          0 :   CHK_PAIR();
     495                 :            : 
     496         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);
     497         [ #  # ]:          0 :   ALLOC_CHECK_ARRAY(set_array_2, set_array_1_size);
     498 [ #  # ][ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, set_array_1, set_array_1_size,
     499                 :            :                                         *set_array_2) );
     500                 :            : 
     501         [ #  # ]:          0 :   KEEP_ARRAY(set_array_2);
     502         [ #  # ]:          0 :   RETURN(iBase_SUCCESS);
     503                 :            : }
     504                 :            : 
     505                 :          0 : void iRel_getEntArrSetIterArrRelation (
     506                 :            :   iRel_Instance instance,
     507                 :            :   iRel_PairHandle pair,
     508                 :            :   iBase_EntityHandle *ent_array_1,
     509                 :            :   int ent_array_1_size,
     510                 :            :   int switch_order,
     511                 :            :   iBase_EntityIterator **entiter,
     512                 :            :   int *entiter_allocated,
     513                 :            :   int *entiter_size,
     514                 :            :   int *err)
     515                 :            : {
     516         [ #  # ]:          0 :   CHK_PAIR();
     517                 :            : 
     518         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);;
     519         [ #  # ]:          0 :   ALLOC_CHECK_ARRAY(entiter, ent_array_1_size);
     520 [ #  # ][ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, ent_array_1, ent_array_1_size,
     521                 :            :                                         *entiter) );
     522                 :            : 
     523         [ #  # ]:          0 :   KEEP_ARRAY(entiter);
     524         [ #  # ]:          0 :   RETURN(iBase_SUCCESS);
     525                 :            : }
     526                 :            : 
     527                 :            : 
     528                 :          0 : void iRel_rmvEntRelation(
     529                 :            :   iRel_Instance instance,
     530                 :            :   /*in*/ iRel_PairHandle pair,
     531                 :            :   /*in*/ iBase_EntityHandle ent,
     532                 :            :   /*in*/ int switch_order,
     533                 :            :   /*out*/ int *err)
     534                 :            : {
     535         [ #  # ]:          0 :   CHK_PAIR();
     536                 :            : 
     537         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);
     538         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, &ent, 1) );
     539                 :            : }
     540                 :            : 
     541                 :          0 : void iRel_rmvSetRelation(
     542                 :            :   iRel_Instance instance,
     543                 :            :   /*in*/ iRel_PairHandle pair,
     544                 :            :   /*in*/ iBase_EntitySetHandle entset,
     545                 :            :   /*in*/ int switch_order,
     546                 :            :   /*out*/ int *err)
     547                 :            : {
     548         [ #  # ]:          0 :   CHK_PAIR();
     549                 :            : 
     550         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);
     551         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, &entset, 1) );
     552                 :            : }
     553                 :            : 
     554                 :          2 : void iRel_rmvEntArrRelation(
     555                 :            :   iRel_Instance instance,
     556                 :            :   /*in*/ iRel_PairHandle pair,    
     557                 :            :   /*in*/ iBase_EntityHandle *ent_array,
     558                 :            :   /*in*/ int num_ent,
     559                 :            :   /*in*/ int switch_order,
     560                 :            :   /*out*/ int *err)
     561                 :            : {
     562         [ -  + ]:          2 :   CHK_PAIR();
     563                 :            : 
     564         [ -  + ]:          2 :   int iface_no = (switch_order ? 1 : 0);
     565         [ -  + ]:          2 :   CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, ent_array, num_ent) );
     566                 :            : }
     567                 :            : 
     568                 :          0 : void iRel_rmvSetArrRelation(
     569                 :            :   iRel_Instance instance,
     570                 :            :   /*in*/ iRel_PairHandle pair,    
     571                 :            :   /*in*/ iBase_EntitySetHandle *entset_array,
     572                 :            :   /*in*/ int num_ent,
     573                 :            :   /*in*/ int switch_order,
     574                 :            :   /*out*/ int *err)
     575                 :            : {
     576         [ #  # ]:          0 :   CHK_PAIR();
     577                 :            : 
     578         [ #  # ]:          0 :   int iface_no = (switch_order ? 1 : 0);
     579         [ #  # ]:          0 :   CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, entset_array, num_ent) );
     580                 :            : }
     581                 :            : 
     582                 :            : static int
     583                 :         12 : get_gids_and_dims(iRel_PairHandle pair,
     584                 :            :                   int iface_no,
     585                 :            :                   iBase_EntityHandle *ents,
     586                 :            :                   int ents_size,
     587                 :            :                   int ent_or_set,
     588                 :            :                   std::vector<int> &ents_gids,
     589                 :            :                   std::vector<int> &ents_dims)
     590                 :            : {
     591                 :            :   int result;
     592                 :         12 :   iBase_EntitySetHandle *sets = reinterpret_cast<iBase_EntitySetHandle*>(ents);
     593                 :            : 
     594                 :         12 :   ents_gids.resize(ents_size);
     595         [ +  + ]:         12 :   if (ent_or_set == iRel_ENTITY)
     596                 :          6 :     result = ASSOCPAIRI->get_gids(iface_no, ents, ents_size, &ents_gids[0]);
     597                 :            :   else
     598                 :          6 :     result = ASSOCPAIRI->get_gids(iface_no, sets, ents_size, &ents_gids[0]);
     599                 :            : 
     600 [ -  + ][ #  # ]:         12 :   if (iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result)
     601                 :          0 :     return result;
     602                 :            : 
     603                 :         12 :   ents_dims.resize(ents_size, -1);
     604         [ +  + ]:         12 :   if (ent_or_set == iRel_ENTITY) {
     605                 :          6 :     int *ents_dims_ptr = &ents_dims[0];
     606                 :          6 :     int ents_dims_alloc = ents_dims.size(), ents_dims_size;
     607                 :            :     result = ASSOCPAIRI->get_ents_dims(iface_no, ents, ents_size,
     608                 :            :                                        &ents_dims_ptr, &ents_dims_alloc,
     609                 :          6 :                                        &ents_dims_size);
     610                 :            :   }
     611                 :            :   else {
     612                 :          6 :     result = ASSOCPAIRI->get_dims(iface_no, sets, ents_size, &ents_dims[0]);
     613                 :            :   }
     614                 :            : 
     615 [ -  + ][ #  # ]:         12 :   if (iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result)
     616                 :          0 :     return result;
     617                 :            : 
     618                 :         12 :   return iBase_SUCCESS;
     619                 :            : }
     620                 :            : 
     621                 :            : static void
     622                 :          6 : iRel_inferArrArrRelations(iRel_Instance instance,
     623                 :            :                           iRel_PairHandle pair,
     624                 :            :                           iBase_EntityHandle *ents1,
     625                 :            :                           const int ents1_size,
     626                 :            :                           int ent_or_set1,
     627                 :            :                           iBase_EntityHandle *ents2,
     628                 :            :                           const int ents2_size,
     629                 :            :                           int ent_or_set2,
     630                 :            :                           int *err)
     631                 :            : {
     632                 :            :   int result;
     633                 :            : 
     634         [ +  - ]:          6 :   std::vector<int> ents_gids, ents_dims;
     635 [ +  - ][ +  + ]:         54 :   std::map<const int, iBase_EntityHandle> ents_gid_map[4];
         [ +  - ][ #  # ]
                 [ #  # ]
     636                 :            : 
     637                 :            :   get_gids_and_dims(pair, 0, ents1, ents1_size, ent_or_set1, ents_gids,
     638         [ +  - ]:          6 :                     ents_dims);
     639         [ +  + ]:        104 :   for (int i = 0; i < ents1_size; i++) {
     640         [ +  - ]:         98 :     int dim = ents_dims[i];
     641 [ +  - ][ +  - ]:         98 :     if (0 <= dim && 3 >= dim)
     642 [ +  - ][ +  - ]:         98 :       ents_gid_map[dim][ents_gids[i]] = ents1[i];
     643                 :            :   }
     644                 :            : 
     645                 :            :   get_gids_and_dims(pair, 1, ents2, ents2_size, ent_or_set2, ents_gids,
     646         [ +  - ]:          6 :                     ents_dims);
     647         [ +  + ]:        109 :   for (int i = 0; i < ents2_size; i++) {
     648         [ +  - ]:        103 :     int dim = ents_dims[i];
     649                 :            : 
     650                 :            :     // only check entities for which the dimension entry is in a reasonable
     651                 :            :     // range
     652 [ +  - ][ -  + ]:        103 :     if (0 > dim || 3 < dim) continue;
     653                 :            : 
     654                 :            :     // there's a match if there's an entity with that dimension with matching id
     655                 :            :     std::map<const int, iBase_EntityHandle>::iterator iter =
     656 [ +  - ][ +  - ]:        103 :       ents_gid_map[dim].find(ents_gids[i]);
     657                 :            : 
     658                 :            :       // if it matches, set the relation tags for those entities
     659 [ +  - ][ +  - ]:        103 :     if (iter != ents_gid_map[dim].end()) {
                 [ +  + ]
     660 [ +  - ][ -  + ]:         75 :       if (ent_or_set1 == iRel_ENTITY && ent_or_set2 == iRel_ENTITY) {
     661                 :            :         result = ASSOCPAIRI->set_relation(
     662         [ #  # ]:          0 :           (*iter).second,
     663         [ #  # ]:          0 :           ents2[i]);
     664                 :            :       }
     665 [ -  + ][ #  # ]:         75 :       else if (ent_or_set1 != iRel_ENTITY && ent_or_set2 == iRel_ENTITY) {
     666                 :            :         result = ASSOCPAIRI->set_relation(
     667         [ #  # ]:          0 :           (iBase_EntitySetHandle)(*iter).second,
     668         [ #  # ]:          0 :           ents2[i]);
     669                 :            :       }
     670 [ +  - ][ +  - ]:         75 :       else if (ent_or_set1 == iRel_ENTITY && ent_or_set2 != iRel_ENTITY) {
     671                 :            :         result = ASSOCPAIRI->set_relation(
     672         [ +  - ]:         75 :           (*iter).second,
     673         [ +  - ]:         75 :           (iBase_EntitySetHandle)ents2[i]);
     674                 :            :       }
     675                 :            :       else { // ent_or_set1 != iRel_ENTITY && ent_or_set2 != iRel_ENTITY
     676                 :            :         result = ASSOCPAIRI->set_relation(
     677         [ #  # ]:          0 :           (iBase_EntitySetHandle)(*iter).second,
     678         [ #  # ]:          0 :           (iBase_EntitySetHandle)ents2[i]);
     679                 :            :       }
     680                 :            : 
     681         [ +  - ]:         75 :       CHK_ERROR(result);
     682                 :            :     }
     683                 :            :   }
     684                 :            : 
     685 [ +  - ][ +  + ]:         30 :   RETURN(iBase_SUCCESS);
         [ +  - ][ #  # ]
     686                 :            : }
     687                 :            : 
     688                 :            : void
     689                 :          0 : iRel_inferEntArrEntArrRelations(iRel_Instance instance,
     690                 :            :                                 iRel_PairHandle pair,
     691                 :            :                                 iBase_EntityHandle *ents1,
     692                 :            :                                 const int ents1_size,
     693                 :            :                                 iBase_EntityHandle *ents2,
     694                 :            :                                 const int ents2_size,
     695                 :            :                                 int *err)
     696                 :            : {
     697                 :            :   iRel_inferArrArrRelations(instance, pair, ents1, ents1_size, 0,
     698                 :          0 :                             ents2, ents2_size, 0, err);
     699                 :          0 : }
     700                 :            : 
     701                 :            : void
     702                 :          0 : iRel_inferEntArrSetArrRelations(iRel_Instance instance,
     703                 :            :                                 iRel_PairHandle pair,
     704                 :            :                                 iBase_EntityHandle *ents1,
     705                 :            :                                 const int ents1_size,
     706                 :            :                                 iBase_EntitySetHandle *ents2,
     707                 :            :                                 const int ents2_size,
     708                 :            :                                 int *err)
     709                 :            : {
     710                 :            :   iRel_inferArrArrRelations(instance, pair, ents1, ents1_size, 0,
     711                 :          0 :                             (iBase_EntityHandle*)ents2, ents2_size, 1, err);
     712                 :          0 : }
     713                 :            : 
     714                 :            : void
     715                 :          0 : iRel_inferSetArrEntArrRelations(iRel_Instance instance,
     716                 :            :                                 iRel_PairHandle pair,
     717                 :            :                                 iBase_EntitySetHandle *ents1,
     718                 :            :                                 const int ents1_size,
     719                 :            :                                 iBase_EntityHandle *ents2,
     720                 :            :                                 const int ents2_size,
     721                 :            :                                 int *err)
     722                 :            : {
     723                 :            :   iRel_inferArrArrRelations(instance, pair, (iBase_EntityHandle*)ents1,
     724                 :          0 :                             ents1_size, 1, ents2, ents2_size, 0, err);
     725                 :          0 : }
     726                 :            : 
     727                 :            : void
     728                 :          0 : iRel_inferSetArrSetArrRelations(iRel_Instance instance,
     729                 :            :                                 iRel_PairHandle pair,
     730                 :            :                                 iBase_EntitySetHandle *ents1,
     731                 :            :                                 const int ents1_size,
     732                 :            :                                 int is_set1,
     733                 :            :                                 iBase_EntitySetHandle *ents2,
     734                 :            :                                 const int ents2_size,
     735                 :            :                                 int is_set2,
     736                 :            :                                 int *err)
     737                 :            : 
     738                 :            : {
     739                 :            :   iRel_inferArrArrRelations(instance, pair, (iBase_EntityHandle*)ents1,
     740                 :            :                             ents1_size, 1, (iBase_EntityHandle*)ents2,
     741                 :          0 :                             ents2_size, 1, err);
     742                 :          0 : }
     743                 :            : 
     744                 :          2 : void iRel_inferAllRelations (
     745                 :            :   iRel_Instance instance,
     746                 :            :   iRel_PairHandle pair,
     747                 :            :   int *err)
     748                 :            : {
     749         [ -  + ]:          2 :   CHK_PAIR();
     750                 :            : 
     751                 :            :   // get all entities in those interfaces
     752                 :            :   int result;
     753                 :            : 
     754                 :          2 :   iBase_EntityHandle *ents1 = NULL;
     755                 :          2 :   int ents1_alloc = 0, ents1_size;
     756         [ -  + ]:          2 :   if (ASSOCPAIRI->relation_type(0) != iRel_ENTITY)
     757                 :            :     result = ASSOCPAIRI->get_all_sets(0, (iBase_EntitySetHandle**)&ents1,
     758                 :          0 :                                       &ents1_alloc, &ents1_size);
     759                 :            :   else
     760                 :            :     result = ASSOCPAIRI->get_all_entities(0, -1, &ents1, &ents1_alloc,
     761                 :          2 :                                           &ents1_size);
     762         [ -  + ]:          2 :   CHK_ERROR(result);
     763                 :            : 
     764                 :          2 :   iBase_EntityHandle *ents2 = NULL;
     765                 :          2 :   int ents2_alloc = 0, ents2_size;
     766         [ +  - ]:          2 :   if (ASSOCPAIRI->relation_type(1) != iRel_ENTITY)
     767                 :            :     result = ASSOCPAIRI->get_all_sets(1, (iBase_EntitySetHandle**)&ents2,
     768                 :          2 :                                      &ents2_alloc, &ents2_size);
     769                 :            :   else
     770                 :            :   result = ASSOCPAIRI->get_all_entities(1, -1, &ents2, &ents2_alloc,
     771                 :          0 :                                        &ents2_size);
     772         [ -  + ]:          2 :   CHK_ERROR(result);
     773                 :            : 
     774                 :            :   iRel_inferArrArrRelations(instance, pair,
     775                 :          2 :                             ents1, ents1_size, ASSOCPAIRI->relation_type(0),
     776                 :          2 :                             ents2, ents2_size, ASSOCPAIRI->relation_type(1),
     777                 :          2 :                             &result);
     778                 :            : 
     779                 :          2 :   free(ents1); free(ents2);
     780         [ -  + ]:          2 :   CHK_ERROR(result);
     781                 :            : }
     782                 :            : 
     783                 :          0 : void iRel_inferAllRelationsAndType (
     784                 :            :   iRel_Instance instance,
     785                 :            :   iRel_PairHandle *pair,
     786                 :            :   int *err)
     787                 :            : {
     788                 :          0 :   ERROR(iBase_NOT_SUPPORTED, "Not currently supported.");
     789                 :            : }
     790                 :            : 
     791                 :          0 : void iRel_inferEntRelations (
     792                 :            :   iRel_Instance instance,
     793                 :            :   iRel_PairHandle pair,
     794                 :            :   iBase_EntityHandle entity,
     795                 :            :   int iface_no,
     796                 :            :   int *err)
     797                 :            : {
     798                 :          0 :   iRel_inferEntArrRelations(instance, pair, &entity, 1, iface_no, err);
     799                 :          0 : }
     800                 :            : 
     801                 :          0 : void iRel_inferSetRelations (
     802                 :            :   iRel_Instance instance,
     803                 :            :   iRel_PairHandle pair,
     804                 :            :   iBase_EntitySetHandle entity,
     805                 :            :   int iface_no,
     806                 :            :   int *err)
     807                 :            : {
     808                 :          0 :   iRel_inferSetArrRelations(instance, pair, &entity, 1, iface_no, err);
     809                 :          0 : }
     810                 :            : 
     811                 :          4 : static void iRel_inferArrRelations (
     812                 :            :   iRel_Instance instance,
     813                 :            :   iRel_PairHandle pair,
     814                 :            :   iBase_EntityHandle *entities,
     815                 :            :   int entities_size,
     816                 :            :   bool is_set,
     817                 :            :   int iface_no,
     818                 :            :   int *err)
     819                 :            : {
     820         [ -  + ]:          4 :   CHK_PAIR();
     821                 :            : 
     822 [ +  - ][ -  + ]:          4 :   if (0 > iface_no || 1 < iface_no) {
     823                 :          0 :     ERROR(iBase_INVALID_ARGUMENT, "Interface number must be 0 or 1");
     824                 :            :   }
     825 [ +  + ][ +  - ]:          6 :   else if (( is_set && ASSOCPAIRI->relation_type(iface_no) == iRel_ENTITY) ||
           [ +  +  -  + ]
                 [ -  + ]
     826                 :          2 :            (!is_set && ASSOCPAIRI->relation_type(iface_no) != iRel_ENTITY)) {
     827                 :          0 :     ERROR(iBase_INVALID_ARGUMENT, "is_set must match entOrSet in call to "
     828                 :            :           "inferArrRelations");
     829                 :            :   }
     830                 :            : 
     831                 :            :   // get all entities in iface2
     832                 :            :   int result;
     833                 :          4 :   iBase_EntityHandle *ents1 = entities;
     834                 :          4 :   int ents1_size = entities_size;
     835                 :          4 :   iBase_EntityHandle *ents2 = NULL;
     836                 :          4 :   int ents2_alloc = 0, ents2_size;
     837         [ +  + ]:          4 :   if (ASSOCPAIRI->relation_type(1-iface_no) != iRel_ENTITY)
     838                 :            :     result = ASSOCPAIRI->get_all_sets(!iface_no,
     839                 :            :                                      (iBase_EntitySetHandle**)&ents2,
     840                 :          2 :                                      &ents2_alloc, &ents2_size);
     841                 :            :   else
     842                 :            :     result = ASSOCPAIRI->get_all_entities(!iface_no, -1,
     843                 :          2 :                                          &ents2, &ents2_alloc, &ents2_size);
     844         [ -  + ]:          4 :   CHK_ERROR(result);
     845                 :            : 
     846                 :            :   // switch so that entity lists always go into inferArrArrRelations in
     847                 :            :   // forward order wrt pair
     848         [ +  + ]:          4 :   if (1 == iface_no) {
     849                 :          2 :     std::swap(ents1, ents2);
     850                 :          2 :     std::swap(ents1_size, ents2_size);
     851                 :            :   }
     852                 :            : 
     853                 :            :   iRel_inferArrArrRelations(instance, pair,
     854                 :            :                             ents1, ents1_size,
     855                 :          4 :                             ASSOCPAIRI->relation_type(0),
     856                 :            :                             ents2, ents2_size,
     857                 :          8 :                             ASSOCPAIRI->relation_type(1), &result);
     858                 :            : 
     859         [ +  + ]:          4 :   free(1 == iface_no ? ents1 : ents2);
     860                 :            : 
     861         [ -  + ]:          4 :   CHK_ERROR(result);
     862                 :            : }
     863                 :            : 
     864                 :          2 : void iRel_inferEntArrRelations (
     865                 :            :   iRel_Instance instance,
     866                 :            :   iRel_PairHandle pair,
     867                 :            :   iBase_EntityHandle *entities,
     868                 :            :   int entities_size,
     869                 :            :   int iface_no,
     870                 :            :   int *err)
     871                 :            : {
     872                 :            :   iRel_inferArrRelations(instance, pair, entities, entities_size, false,
     873                 :          2 :                          iface_no, err);
     874                 :          2 : }
     875                 :            : 
     876                 :          2 : void iRel_inferSetArrRelations (
     877                 :            :   iRel_Instance instance,
     878                 :            :   iRel_PairHandle pair,
     879                 :            :   iBase_EntitySetHandle *entities,
     880                 :            :   int entities_size,
     881                 :            :   int iface_no,
     882                 :            :   int *err)
     883                 :            : {
     884                 :            :   iRel_inferArrRelations(instance, pair, (iBase_EntityHandle*)entities,
     885                 :          2 :                          entities_size, true, iface_no, err);
     886 [ +  - ][ +  - ]:         14 : }

Generated by: LCOV version 1.11