LCOV - code coverage report
Current view: top level - geom - CAGroup.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 166 286 58.0 %
Date: 2020-06-30 00:58:45 Functions: 11 14 78.6 %
Branches: 211 634 33.3 %

           Branch data     Line data    Source code
       1                 :            : //- Class:          CAGroup
       2                 :            : //- Owner:          Greg Nielson
       3                 :            : //- Description:    Cubit Attribute for groups.
       4                 :            : //- Checked By:
       5                 :            : //- Version:
       6                 :            : 
       7                 :            : #include "CAGroup.hpp"
       8                 :            : #include "RefEntity.hpp"
       9                 :            : #include "RefEntityFactory.hpp"
      10                 :            : #include "RefGroup.hpp"
      11                 :            : #include "CubitObserver.hpp"
      12                 :            : #include "DLIList.hpp"
      13                 :            : #include "CastTo.hpp"
      14                 :            : #include "TDCAGE.hpp"
      15                 :            : #include "GeometryQueryTool.hpp"
      16                 :            : 
      17                 :            : #include <stdlib.h>
      18                 :            : #include <time.h>
      19                 :            : 
      20                 :            : // initialize this CA's static members
      21                 :            : CubitBoolean CAGroup::initialize_rand = CUBIT_TRUE;
      22                 :            : 
      23                 :       6367 : CubitAttrib* CAGroup_creator(RefEntity* entity, const CubitSimpleAttrib &p_csa)
      24                 :            : {
      25         [ +  - ]:       6367 :   return new CAGroup(entity, p_csa);
      26                 :            : }
      27                 :            : 
      28                 :       6367 : CAGroup::CAGroup(RefEntity* new_attrib_owner,
      29                 :            :                  const CubitSimpleAttrib& csa_ptr)
      30 [ +  - ][ +  - ]:       6367 :         : CubitAttrib(new_attrib_owner)
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
      31                 :            : {
      32                 :            : 
      33         [ +  - ]:       6367 :   initialize();
      34                 :            : 
      35 [ +  - ][ +  + ]:       6367 :   if(!csa_ptr.isEmpty())
      36                 :            :   {
      37                 :            : 
      38         [ +  - ]:         11 :     const std::vector<int>& i_list = csa_ptr.int_data_list();
      39         [ +  - ]:         11 :     const std::vector<CubitString>& cs_list = csa_ptr.string_data_list();
      40                 :            : 
      41                 :            :       // first, the ints
      42                 :            : 
      43                 :         11 :     int offset = 0;
      44         [ +  - ]:         11 :     int num_groups = i_list[offset++];
      45                 :            : 
      46                 :            :       // groupID
      47                 :            :     int i;
      48         [ +  + ]:         22 :     for (i = num_groups; i > 0; i--)
      49 [ +  - ][ +  - ]:         11 :       groupID.append(i_list[offset++]);
      50                 :            : 
      51                 :            :         // uniqueID
      52         [ +  + ]:         22 :     for (i = num_groups; i > 0; i--)
      53 [ +  - ][ +  - ]:         11 :       uniqueID.append(i_list[offset++]);
      54                 :            : 
      55                 :            :         // sequenceNumbers
      56         [ +  + ]:         22 :     for (i = num_groups; i > 0; i--)
      57 [ +  - ][ +  - ]:         11 :       sequenceNumbers.append(i_list[offset++]);
      58                 :            : 
      59                 :            :       // numOwningGroups
      60         [ +  + ]:         22 :     for (i = num_groups; i > 0; i--)
      61 [ +  - ][ +  - ]:         11 :       numOwningGroups.append(i_list[offset++]);
      62                 :            : 
      63                 :            :       // total number of owning groups
      64         [ +  - ]:         11 :     int total_owning_groups = i_list[offset++];
      65                 :            : 
      66                 :            :       // owningGroupID
      67         [ -  + ]:         11 :     for (i = total_owning_groups; i > 0; i--)
      68 [ #  # ][ #  # ]:          0 :       owningGroupID.append(i_list[offset++]);
      69                 :            : 
      70                 :            :       // owningUniqueID
      71         [ -  + ]:         11 :     for (i = total_owning_groups; i > 0; i--)
      72 [ #  # ][ #  # ]:          0 :       owningUniqueID.append(i_list[offset++]);
      73                 :            : 
      74                 :            :       // owningSequenceNumbers
      75         [ -  + ]:         11 :     for (i = total_owning_groups; i > 0; i--)
      76 [ #  # ][ #  # ]:          0 :       owningSequenceNumbers.append(i_list[offset++]);
      77                 :            : 
      78                 :            :       // ancestor groups added after first implementation of CAGroup,
      79                 :            :       // therefore not all attributes may have ancestor groups
      80                 :            :       // setting total_ancestor_groups to zero first will short-circuit
      81                 :            :       // loops below if there aren't any ancestor groups, so no need for
      82                 :            :       // an 'if' statement
      83                 :            : 
      84                 :            :       // total number of ancestor groups
      85                 :         11 :     int total_ancestor_groups = 0;
      86                 :            : 
      87 [ +  - ][ +  - ]:         11 :     if (i_list.size() > (size_t)(4*num_groups + 3*total_owning_groups + 2))
      88         [ +  - ]:         11 :       total_ancestor_groups = i_list[offset++];
      89                 :            : 
      90                 :            :       // ancestorGroupID
      91         [ -  + ]:         11 :     for (i = total_ancestor_groups; i > 0; i--)
      92 [ #  # ][ #  # ]:          0 :       ancestorGroupID.append(i_list[offset++]);
      93                 :            : 
      94                 :            :       // ancestorUniqueID
      95         [ -  + ]:         11 :     for (i = total_ancestor_groups; i > 0; i--)
      96 [ #  # ][ #  # ]:          0 :       ancestorUniqueID.append(i_list[offset++]);
      97                 :            : 
      98                 :            :       // ancestorOwnedGroupUid
      99         [ -  + ]:         11 :     for (i = total_ancestor_groups; i > 0; i--)
     100 [ #  # ][ #  # ]:          0 :       ancestorOwnedGroupUid.append(i_list[offset++]);
     101                 :            : 
     102                 :            :        // ancestorSequenceNumbers
     103         [ -  + ]:         11 :     for (i = total_ancestor_groups; i > 0; i--)
     104 [ #  # ][ #  # ]:          0 :       ancestorSequenceNumbers.append(i_list[offset++]);
     105                 :            : 
     106                 :            :       // now, doubles (none)
     107                 :            : 
     108                 :            :       // now, strings
     109                 :            :       // attribute internal name (just pop the list)
     110                 :         11 :     offset = 1;
     111                 :            : 
     112                 :            :       // groupNames
     113         [ +  + ]:         22 :     for (i = num_groups; i > 0; i--)
     114 [ +  - ][ +  - ]:         11 :       groupNames.append(cs_list[offset++]);
     115                 :            : 
     116                 :            :       // owningGroupNames
     117         [ -  + ]:         11 :     for (i = total_owning_groups; i > 0; i--)
     118 [ #  # ][ #  # ]:          0 :       owningGroupNames.append(cs_list[offset++]);
     119                 :            : 
     120                 :            :       // ancestorGroupName
     121         [ -  + ]:         11 :     for (i = total_ancestor_groups; i > 0; i--)
     122 [ #  # ][ #  # ]:          0 :       ancestorGroupName.append(cs_list[offset++]);
     123                 :            : 
     124                 :            :       // ok, we're done
     125                 :            :   }
     126                 :       6367 : }
     127                 :            : 
     128 [ +  - ][ +  - ]:      19101 : CAGroup::~CAGroup()
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     129                 :            : {
     130         [ -  + ]:      12734 : }
     131                 :            : 
     132                 :       6367 : void CAGroup::initialize()
     133                 :            : {
     134         [ +  + ]:       6367 :   if(initialize_rand == CUBIT_TRUE)
     135                 :            :   {
     136                 :            : #if defined _WIN32 || defined CUBIT_LINUX
     137                 :         76 :     srand((unsigned)time(NULL));
     138                 :            : #else
     139                 :            :     srand48(time(NULL));
     140                 :            : #endif
     141                 :         76 :     initialize_rand = CUBIT_FALSE;
     142                 :            :   }
     143                 :       6367 : }
     144                 :            : 
     145                 :            : 
     146                 :            : 
     147                 :         11 : CubitStatus CAGroup::actuate()
     148                 :            : {
     149         [ -  + ]:         11 :   if (hasActuated == CUBIT_TRUE) return CUBIT_SUCCESS;
     150                 :            :   
     151                 :            :     // need to reset all the lists to keep them in sync
     152                 :         11 :   groupID.reset();
     153                 :         11 :   uniqueID.reset();
     154                 :         11 :   groupNames.reset();
     155                 :         11 :   sequenceNumbers.reset();
     156                 :         11 :   owningGroupID.reset();
     157                 :         11 :   owningUniqueID.reset();
     158                 :         11 :   owningGroupNames.reset();
     159                 :         11 :   owningSequenceNumbers.reset();
     160                 :         11 :   numOwningGroups.reset();
     161                 :            :   
     162                 :            :     // go through all the groups on this CA
     163                 :            :   int i;
     164         [ +  + ]:         22 :   for (i = groupID.size(); i > 0; i--) {
     165                 :            :       // pop the data for this group off the lists
     166         [ +  - ]:         11 :     int group_id = groupID.get_and_step();
     167         [ +  - ]:         11 :     int unique_id = uniqueID.get_and_step();
     168 [ +  - ][ +  - ]:         11 :     CubitString group_name = groupNames.get_and_step();
     169         [ +  - ]:         11 :     int seq_num = sequenceNumbers.get_and_step();
     170                 :            : 
     171                 :            :     RefGroup *ref_group =
     172                 :            :         assign_group(attribOwnerEntity, group_id, unique_id, 
     173         [ +  - ]:         11 :                      group_name, seq_num);
     174                 :            :     
     175                 :            :     
     176                 :            :       // check for groups owning this group
     177         [ +  - ]:         11 :     int owning_groups = numOwningGroups.get_and_step();
     178                 :            :   
     179         [ -  + ]:         11 :     for (int j = owning_groups; j > 0; j--)
     180                 :            :     {
     181         [ #  # ]:          0 :       int owning_group_id = owningGroupID.get_and_step();
     182         [ #  # ]:          0 :       int owning_unique_id = owningUniqueID.get_and_step();
     183 [ #  # ][ #  # ]:          0 :       CubitString owning_group_name = owningGroupNames.get_and_step();
     184         [ #  # ]:          0 :       seq_num = owningSequenceNumbers.get_and_step();
     185                 :            : 
     186                 :            :       assign_group(ref_group, owning_group_id, owning_unique_id,
     187         [ #  # ]:          0 :                    owning_group_name, seq_num);
     188         [ #  # ]:          0 :     }
     189                 :            : 
     190         [ +  - ]:         11 :   } // loop over all groups in this CAGroup
     191                 :            : 
     192                 :            :     // now do ancestors
     193                 :         11 :   ancestorGroupID.reset();
     194                 :         11 :   ancestorUniqueID.reset();
     195                 :         11 :   ancestorOwnedGroupUid.reset();
     196                 :         11 :   ancestorGroupName.reset();
     197                 :         11 :   ancestorSequenceNumbers.reset();
     198                 :            :   
     199         [ -  + ]:         11 :   for (i = ancestorGroupID.size(); i > 0; i--) {
     200                 :            :     /*RefGroup *ancestor_group = */
     201                 :          0 :       assign_ancestor_group(ancestorGroupID.get_and_step(), 
     202                 :          0 :                             ancestorUniqueID.get_and_step(),
     203                 :          0 :                             ancestorGroupName.get_and_step(),
     204                 :          0 :                             ancestorOwnedGroupUid.get_and_step(),
     205                 :          0 :                             ancestorSequenceNumbers.get_and_step());
     206                 :            :   }
     207                 :            :   
     208                 :         11 :   deleteAttrib = CUBIT_TRUE;
     209                 :         11 :   hasActuated = CUBIT_TRUE;
     210                 :            :   
     211                 :         11 :   return CUBIT_SUCCESS;
     212                 :            : }
     213                 :            : 
     214                 :         11 : RefGroup *CAGroup::assign_group(RefEntity *owned_entity,
     215                 :            :                                 const int group_id, const int unique_id,
     216                 :            :                                 const CubitString& group_name,
     217                 :            :                                 const int seq_num)
     218                 :            : {
     219                 :         11 :   RefGroup* parent_group = NULL;
     220                 :         11 :   CubitBoolean group_id_exists = CUBIT_FALSE;
     221                 :            : 
     222                 :            :     // search for the group corresponding to this id and unique id
     223                 :         11 :   RefGroup *ref_group = GeometryQueryTool::instance()->get_last_ref_group();
     224 [ -  + ][ #  # ]:         11 :   for(int i = GeometryQueryTool::instance()->num_ref_groups(); i > 0 && !parent_group; i--)
     225                 :            :   {
     226                 :          0 :     ref_group = GeometryQueryTool::instance()->get_next_ref_group();
     227         [ #  # ]:          0 :     if(ref_group->id() == group_id)
     228                 :            :     {
     229                 :          0 :       group_id_exists = CUBIT_TRUE;
     230                 :            :     }
     231                 :            : 
     232                 :          0 :     ToolData *td_temp = ref_group->get_TD(&TDCAGE::is_cage);
     233 [ #  # ][ #  # ]:          0 :     TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL);
     234 [ #  # ][ #  # ]:          0 :     if (td_cagroup != NULL && td_cagroup->unique_id() == unique_id)
                 [ #  # ]
     235                 :          0 :       parent_group = ref_group;
     236                 :            :   }
     237                 :            :   
     238         [ +  - ]:         11 :   if(!parent_group)
     239                 :            :   {
     240                 :            :       // else make a new group, and assign id and unique id
     241                 :            :       // also assign group name
     242                 :         11 :     parent_group = RefEntityFactory::instance()->construct_RefGroup();
     243         [ +  - ]:         11 :     if(!group_id_exists) {
     244                 :         11 :       parent_group->set_id(0);
     245                 :         11 :       parent_group->set_id(group_id);
     246                 :            :     }
     247                 :            :     else
     248         [ #  # ]:          0 :       PRINT_INFO("Creating group %d to hold attribute group %d\n",
     249         [ #  # ]:          0 :                  parent_group->id(), group_id);
     250                 :            : 
     251                 :            :       // put a td on this new group with the right unique_id
     252         [ +  - ]:         11 :     TDCAGE *td_cagroup = new TDCAGE(unique_id);
     253                 :         11 :     parent_group->add_TD(td_cagroup);
     254                 :            : 
     255                 :            :       // add the attribOwnerEntity to the group and name the group
     256         [ +  - ]:         11 :     parent_group->entity_name(group_name);
     257                 :            :   }
     258                 :            : 
     259                 :            :     // add the entity to the group with the proper sequence number
     260                 :         11 :   TDCAGE::insert_entity(owned_entity, seq_num, parent_group);
     261                 :            :   
     262                 :         11 :   return parent_group;
     263                 :            : }
     264                 :            :   
     265                 :          0 : RefGroup *CAGroup::assign_ancestor_group(const int ancestor_id,
     266                 :            :                                          const int ancestor_uid,
     267                 :            :                                          const CubitString& ancestor_name,
     268                 :            :                                          const int owned_group_uid,
     269                 :            :                                          const int seq_num)
     270                 :            : {
     271                 :            :     // for each call of this function, we:
     272                 :            :     // - get an ancestor group with ancestor_id, ancestor_uid and
     273                 :            :     //   ancestor_name (make one if it doesn't exist)
     274                 :            :     // - add group with owned_group_uid to that ancestor group
     275                 :            :     //   (owned_group_uid should exist, error if not)
     276                 :            :     // search for the group corresponding to this id and unique id
     277                 :          0 :   RefGroup* ancestor_group = NULL;
     278                 :          0 :   RefGroup *owned_group = NULL;
     279                 :          0 :   CubitBoolean ancestor_id_exists = CUBIT_FALSE;
     280                 :            : 
     281                 :          0 :   RefGroup *ref_group = GeometryQueryTool::instance()->get_last_ref_group();
     282                 :            :   
     283 [ #  # ][ #  # ]:          0 :   for(int i = GeometryQueryTool::instance()->num_ref_groups(); i > 0 && 
     284         [ #  # ]:          0 :         (!ancestor_group || !owned_group); i--)
     285                 :            :   {
     286                 :          0 :     ref_group = GeometryQueryTool::instance()->get_next_ref_group();
     287                 :            :   
     288         [ #  # ]:          0 :     if(ref_group->id() == ancestor_id)
     289                 :            :     {
     290                 :          0 :       ancestor_id_exists = CUBIT_TRUE;
     291                 :            :     }
     292                 :            :     
     293                 :          0 :     ToolData *td_temp = ref_group->get_TD(&TDCAGE::is_cage);
     294 [ #  # ][ #  # ]:          0 :     TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL);
     295 [ #  # ][ #  # ]:          0 :     if (td_cagroup != NULL && td_cagroup->unique_id() == ancestor_uid) {
                 [ #  # ]
     296                 :          0 :       ancestor_group = ref_group;
     297                 :            :     }
     298                 :            :         
     299 [ #  # ][ #  # ]:          0 :     if (td_cagroup != NULL && td_cagroup->unique_id() == owned_group_uid) {
                 [ #  # ]
     300                 :          0 :       owned_group = ref_group;
     301                 :            :     }
     302                 :            :   }
     303                 :            : 
     304         [ #  # ]:          0 :   assert(owned_group != 0);
     305                 :            :   
     306         [ #  # ]:          0 :   if (!ancestor_group)
     307                 :            :   {
     308                 :            :       // make a new group, and assign id and unique id
     309                 :            :       // also assign group name
     310                 :          0 :     ancestor_group = RefEntityFactory::instance()->construct_RefGroup();
     311                 :            : ;
     312         [ #  # ]:          0 :     if(!ancestor_id_exists) {
     313                 :          0 :       ancestor_group->set_id(0);
     314                 :          0 :       ancestor_group->set_id(ancestor_id);
     315                 :            :     }
     316                 :            :     else
     317         [ #  # ]:          0 :       PRINT_INFO("Creating group %d to hold attribute group %d\n",
     318         [ #  # ]:          0 :                  ancestor_group->id(), ancestor_id);
     319                 :            : 
     320                 :            :       // put a td on this new group with the right unique_id
     321         [ #  # ]:          0 :     TDCAGE *td_cagroup = new TDCAGE(ancestor_uid);
     322                 :          0 :     ancestor_group->add_TD(td_cagroup);
     323                 :            : 
     324                 :            :       // add the owned group to the group and name the group
     325         [ #  # ]:          0 :     ancestor_group->entity_name(ancestor_name);
     326                 :            :   }
     327                 :            : 
     328                 :            :     // add the entity to the group with the proper sequence number
     329                 :          0 :   TDCAGE::insert_entity(owned_group, seq_num, ancestor_group);
     330                 :            : 
     331                 :          0 :   return ancestor_group;
     332                 :            : }
     333                 :            :   
     334                 :       6356 : CubitStatus CAGroup::update()
     335                 :            : {
     336         [ -  + ]:       6356 :   if (hasUpdated) return CUBIT_SUCCESS;
     337                 :            :   
     338                 :            :     // set the updated flag
     339                 :       6356 :   hasUpdated = CUBIT_TRUE;
     340                 :            : 
     341                 :            :     // get the groups containing attribOwnerEntity
     342                 :            :   RefGroup* ref_group;
     343         [ +  - ]:       6356 :   DLIList<RefGroup*> ref_group_list;
     344                 :            :   int i;
     345                 :            : 
     346         [ +  - ]:       6356 :   RefGroup::get_groups_within(attribOwnerEntity, ref_group_list, CUBIT_FALSE);
     347                 :            : 
     348 [ +  - ][ +  + ]:       6356 :   if( ref_group_list.size() == 0)
     349                 :            :   {
     350         [ +  - ]:       6345 :     delete_attrib(CUBIT_TRUE);
     351                 :       6345 :     return CUBIT_SUCCESS;
     352                 :            :   }
     353                 :            : 
     354                 :            :     // else, this entity is owned by groups
     355                 :            :   RefGroup* parent_ref_group;
     356                 :            : 
     357                 :            :     // get a td_cage onto the attribOwnerEntity, to keep sequence numbers
     358                 :            :     // for the owning groups
     359         [ +  - ]:         11 :   TDCAGE *td_entity = (TDCAGE *) attribOwnerEntity->get_TD(&TDCAGE::is_cage);
     360         [ +  - ]:         11 :   if (!td_entity) {
     361 [ +  - ][ +  - ]:         11 :     td_entity = new TDCAGE(-1);
     362         [ +  - ]:         11 :     attribOwnerEntity->add_TD(td_entity);
     363                 :            :   }
     364                 :            : 
     365                 :            :     // now, initialize that tdcage
     366         [ +  - ]:         11 :   td_entity->initialize_group_sequence_list(attribOwnerEntity);
     367                 :            :   
     368                 :            :     // ok, now write the data for the groups to this attribute
     369 [ +  - ][ +  + ]:         22 :   for(i = ref_group_list.size(); i > 0; i--)
     370                 :            :   {
     371                 :            :       // get the refgroup which gets assigned to this CAGroup
     372         [ +  - ]:         11 :     ref_group = ref_group_list.get_and_step();
     373                 :            : 
     374                 :            :       // First, make sure there's a TDCAGE on the RefGroup
     375         [ +  - ]:         11 :     ToolData *td_temp = ref_group->get_TD(&TDCAGE::is_cage);
     376 [ -  + ][ #  # ]:         11 :     TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL);
     377         [ +  - ]:         11 :     if (td_cagroup == NULL) {
     378                 :            : #if defined _WIN32 || defined CUBIT_LINUX
     379 [ +  - ][ +  - ]:         11 :       td_cagroup = new TDCAGE(rand());
     380                 :            : #else
     381                 :            :       td_cagroup = new TDCAGE((int)lrand48());
     382                 :            : #endif
     383         [ +  - ]:         11 :       ref_group->add_TD(td_cagroup);
     384         [ +  - ]:         11 :       td_cagroup->initialize_group_sequence_list(ref_group);
     385                 :            :     }
     386                 :            :     
     387                 :            :       // append to this CAGroup the id and the unique id of the group;
     388                 :            :       // also append the group name
     389 [ +  - ][ +  - ]:         11 :     groupID.append(ref_group->id());
     390 [ +  - ][ +  - ]:         11 :     uniqueID.append(td_cagroup->unique_id());
     391 [ +  - ][ +  - ]:         11 :     groupNames.append(ref_group->entity_name());
                 [ +  - ]
     392                 :            : 
     393                 :            :       // get and append the sequence number of the attribOwnerEntity
     394                 :            :       // in this group
     395         [ +  - ]:         11 :     int seq_number = td_entity->td_sequence_number(ref_group);
     396         [ -  + ]:         11 :     assert(seq_number != -1);
     397         [ +  - ]:         11 :     sequenceNumbers.append(seq_number);
     398                 :            : 
     399                 :            :       // check this group for containing (parent) groups
     400         [ +  - ]:         11 :     DLIList<RefGroup*> parent_ref_group_list;
     401         [ +  - ]:         11 :     RefGroup::get_groups_within(ref_group, parent_ref_group_list, CUBIT_FALSE);
     402                 :            : 
     403                 :            :       // append the number of parent groups to the right list
     404 [ +  - ][ +  - ]:         11 :     numOwningGroups.append(parent_ref_group_list.size());
     405                 :            :     
     406                 :            :       // for each parent group, do essentially the same thing, adding the
     407                 :            :       // data to the owningGroup lists
     408 [ +  - ][ -  + ]:         11 :     for(int j = parent_ref_group_list.size(); j>0; j--)
     409                 :            :     {
     410         [ #  # ]:          0 :       parent_ref_group = parent_ref_group_list.get_and_step();
     411         [ #  # ]:          0 :       td_temp = parent_ref_group->get_TD(&TDCAGE::is_cage);
     412 [ #  # ][ #  # ]:          0 :       TDCAGE *td_parent = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL);
     413         [ #  # ]:          0 :       if (td_parent == NULL) {
     414                 :            : #if defined _WIN32 || defined CUBIT_LINUX
     415 [ #  # ][ #  # ]:          0 :         td_parent = new TDCAGE(rand());
     416                 :            : #else
     417                 :            :         td_parent = new TDCAGE((int)lrand48());
     418                 :            : #endif
     419         [ #  # ]:          0 :         parent_ref_group->add_TD(td_parent);
     420         [ #  # ]:          0 :         td_parent->initialize_group_sequence_list(parent_ref_group);
     421                 :            :       }
     422                 :            : 
     423                 :            :         // append to this CAGroup the id and the unique id of the group;
     424                 :            :         // also append the group name
     425 [ #  # ][ #  # ]:          0 :       owningGroupID.append(parent_ref_group->id());
     426 [ #  # ][ #  # ]:          0 :       owningUniqueID.append(td_parent->unique_id());
     427 [ #  # ][ #  # ]:          0 :       owningGroupNames.append(parent_ref_group->entity_name());
                 [ #  # ]
     428                 :            : 
     429                 :            :         // get and append the sequence number of the group in the parent
     430                 :            :         // group
     431         [ #  # ]:          0 :       seq_number = td_cagroup->td_sequence_number(parent_ref_group);
     432         [ #  # ]:          0 :       assert(seq_number != -1);
     433         [ #  # ]:          0 :       owningSequenceNumbers.append(seq_number);
     434                 :            : 
     435                 :            :         // finally, build a list of distant ancestors, in case there are
     436                 :            :         // groups more than twice removed from any real entities; make
     437                 :            :         // it a recursive function, so that it goes all the way up the chain
     438                 :            :         // of ancestors
     439         [ #  # ]:          0 :       build_ancestor_list(parent_ref_group);
     440                 :            : 
     441                 :            :     } // loop over parent groups
     442         [ +  - ]:         11 :   } // loop over groups containing attribOwnerEntity
     443                 :            : 
     444         [ +  - ]:       6356 :   return CUBIT_SUCCESS;
     445                 :            : }
     446                 :            : 
     447                 :          0 : CubitStatus CAGroup::reset()
     448                 :            : {
     449                 :          0 :   groupID.clean_out();
     450                 :            :     //- group ids containing attribOwnerEntity
     451                 :            :   
     452                 :          0 :   uniqueID.clean_out();
     453                 :            :     //- unique ids of groups containing attribOwnerEntity
     454                 :            : 
     455                 :          0 :   groupNames.clean_out();
     456                 :            :     //- names of groups containing attribOwnerEntity
     457                 :            : 
     458                 :          0 :   sequenceNumbers.clean_out();
     459                 :            :     //- sequence numbers of this entity in the groups
     460                 :            : 
     461                 :          0 :   numOwningGroups.clean_out();
     462                 :            :     //- for each group in groupID, number of groups owning those groups
     463                 :            : 
     464                 :          0 :   owningGroupID.clean_out();
     465                 :            :     //- group ids containing groups containing attribOwnerEntity
     466                 :            :   
     467                 :          0 :   owningUniqueID.clean_out();
     468                 :            :     //- unique ids of groups containing groups containing attribOwnerEntity
     469                 :            : 
     470                 :          0 :   owningGroupNames.clean_out();
     471                 :            :     //- names of groups containing groups containing attribOwnerEntity
     472                 :            : 
     473                 :          0 :   owningSequenceNumbers.clean_out();
     474                 :            :     //- sequence numbers of groups in owning groups
     475                 :            :   
     476                 :            :     //- for each ancestor (a group which owns only other groups, with those
     477                 :            :     //- those groups owning only other groups), we store the group id, uid,
     478                 :            :     //- name, and the uid of the owned group to which this is an ancestor
     479                 :          0 :   ancestorGroupID.clean_out();
     480                 :          0 :   ancestorUniqueID.clean_out();
     481                 :          0 :   ancestorGroupName.clean_out();
     482                 :          0 :   ancestorOwnedGroupUid.clean_out();
     483                 :          0 :   ancestorSequenceNumbers.clean_out();
     484                 :            :   
     485                 :          0 :   return CUBIT_SUCCESS;
     486                 :            : }
     487                 :            : 
     488                 :          0 : void CAGroup::build_ancestor_list(RefGroup *parent_ref_group)
     489                 :            : {
     490         [ #  # ]:          0 :   DLIList<RefGroup*> ancestor_ref_group_list;
     491         [ #  # ]:          0 :   RefGroup::get_groups_within(parent_ref_group, ancestor_ref_group_list, CUBIT_FALSE);
     492                 :            : 
     493                 :            :     // now, recursively work on ancestor list, adding owning group id,
     494                 :            :     // uid and name, and owned group uid, to lists
     495         [ #  # ]:          0 :   ToolData *td_temp = parent_ref_group->get_TD(&TDCAGE::is_cage);
     496 [ #  # ][ #  # ]:          0 :   TDCAGE *td_parent = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL);
     497                 :            : 
     498 [ #  # ][ #  # ]:          0 :   for (int j = ancestor_ref_group_list.size(); j > 0; j--) {
     499         [ #  # ]:          0 :     RefGroup *ancestor = ancestor_ref_group_list.get_and_step();
     500         [ #  # ]:          0 :     td_temp = ancestor->get_TD(&TDCAGE::is_cage);
     501 [ #  # ][ #  # ]:          0 :     TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL);
     502         [ #  # ]:          0 :     if (td_cagroup == NULL) {
     503                 :            : #if defined _WIN32 || defined CUBIT_LINUX
     504 [ #  # ][ #  # ]:          0 :       td_cagroup = new TDCAGE(rand());
     505                 :            : #else
     506                 :            :       td_cagroup = new TDCAGE((int)lrand48());
     507                 :            : #endif
     508         [ #  # ]:          0 :       ancestor->add_TD(td_cagroup);
     509         [ #  # ]:          0 :       td_cagroup->initialize_group_sequence_list(ancestor);
     510                 :            :     }
     511                 :            : 
     512 [ #  # ][ #  # ]:          0 :     ancestorGroupID.append(ancestor->id());
     513 [ #  # ][ #  # ]:          0 :     ancestorUniqueID.append(td_cagroup->unique_id());
     514 [ #  # ][ #  # ]:          0 :     ancestorGroupName.append(ancestor->entity_name());
                 [ #  # ]
     515 [ #  # ][ #  # ]:          0 :     ancestorOwnedGroupUid.append(td_parent->unique_id());
     516                 :            :     
     517                 :            :       // get and append the sequence number of the group in the parent
     518                 :            :       // group
     519         [ #  # ]:          0 :     int seq_number = td_parent->td_sequence_number(ancestor);
     520         [ #  # ]:          0 :     assert(seq_number != -1);
     521         [ #  # ]:          0 :     ancestorSequenceNumbers.append(seq_number);
     522                 :            : 
     523         [ #  # ]:          0 :     build_ancestor_list(ancestor);
     524         [ #  # ]:          0 :   }
     525                 :          0 : }
     526                 :            :       
     527                 :       6378 : CubitSimpleAttrib CAGroup::cubit_simple_attrib()
     528                 :            : {
     529         [ +  - ]:       6378 :   std::vector<CubitString> cs_list;
     530 [ +  - ][ +  - ]:      12756 :   std::vector<double> d_list;
     531 [ +  - ][ +  - ]:      12756 :   std::vector<int> i_list;
     532                 :            : 
     533                 :            :     // first, the ints
     534                 :            :     // groupID
     535         [ +  - ]:       6378 :   groupID.reset();
     536 [ +  - ][ +  - ]:       6378 :   i_list.push_back(groupID.size());
     537                 :            :   int i;
     538 [ +  - ][ +  + ]:       6411 :   for (i = groupID.size(); i > 0; i--)
     539 [ +  - ][ +  - ]:         33 :     i_list.push_back(groupID.get_and_step());
     540                 :            :     
     541                 :            :     // uniqueID
     542         [ +  - ]:       6378 :   uniqueID.reset();
     543 [ +  - ][ +  + ]:       6411 :   for (i = uniqueID.size(); i > 0; i--)
     544 [ +  - ][ +  - ]:         33 :     i_list.push_back(uniqueID.get_and_step());
     545                 :            :     
     546                 :            :     // sequenceNumbers
     547         [ +  - ]:       6378 :   sequenceNumbers.reset();
     548 [ +  - ][ +  + ]:       6411 :   for (i = sequenceNumbers.size(); i > 0; i--)
     549 [ +  - ][ +  - ]:         33 :     i_list.push_back(sequenceNumbers.get_and_step());
     550                 :            :     
     551                 :            :     // numOwningGroups
     552         [ +  - ]:       6378 :   numOwningGroups.reset();
     553 [ +  - ][ +  + ]:       6411 :   for (i = numOwningGroups.size(); i > 0; i--)
     554 [ +  - ][ +  - ]:         33 :     i_list.push_back(numOwningGroups.get_and_step());
     555                 :            : 
     556                 :            :     // size of owningGroupID
     557 [ +  - ][ +  - ]:       6378 :   i_list.push_back(owningGroupID.size());
     558                 :            :   
     559                 :            :     // owningGroupID
     560         [ +  - ]:       6378 :   owningGroupID.reset();
     561 [ +  - ][ -  + ]:       6378 :   for (i = owningGroupID.size(); i > 0; i--)
     562 [ #  # ][ #  # ]:          0 :     i_list.push_back(owningGroupID.get_and_step());
     563                 :            :     
     564                 :            :     // owningUniqueID
     565         [ +  - ]:       6378 :   owningUniqueID.reset();
     566 [ +  - ][ -  + ]:       6378 :   for (i = owningUniqueID.size(); i > 0; i--)
     567 [ #  # ][ #  # ]:          0 :     i_list.push_back(owningUniqueID.get_and_step());
     568                 :            :     
     569                 :            :     // owningSequenceNumbers
     570         [ +  - ]:       6378 :   owningSequenceNumbers.reset();
     571 [ +  - ][ -  + ]:       6378 :   for (i = owningSequenceNumbers.size(); i > 0; i--)
     572 [ #  # ][ #  # ]:          0 :     i_list.push_back(owningSequenceNumbers.get_and_step());
     573                 :            :     
     574                 :            :     // size of ancestorGroupID
     575 [ +  - ][ +  - ]:       6378 :   i_list.push_back(ancestorGroupID.size());
     576                 :            :   
     577                 :            :     // ancestorGroupID
     578         [ +  - ]:       6378 :   ancestorGroupID.reset();
     579 [ +  - ][ -  + ]:       6378 :   for (i = ancestorGroupID.size(); i > 0; i--)
     580 [ #  # ][ #  # ]:          0 :     i_list.push_back(ancestorGroupID.get_and_step());
     581                 :            : 
     582                 :            :     // ancestorUniqueID
     583         [ +  - ]:       6378 :   ancestorUniqueID.reset();
     584 [ +  - ][ -  + ]:       6378 :   for (i = ancestorUniqueID.size(); i > 0; i--)
     585 [ #  # ][ #  # ]:          0 :     i_list.push_back(ancestorUniqueID.get_and_step());
     586                 :            : 
     587                 :            :     // ancestorOwnedGroupUid
     588         [ +  - ]:       6378 :   ancestorOwnedGroupUid.reset();
     589 [ +  - ][ -  + ]:       6378 :   for (i = ancestorOwnedGroupUid.size(); i > 0; i--)
     590 [ #  # ][ #  # ]:          0 :     i_list.push_back(ancestorOwnedGroupUid.get_and_step());
     591                 :            : 
     592                 :            :     // ancestorSequenceNumbers
     593         [ +  - ]:       6378 :   ancestorSequenceNumbers.reset();
     594 [ +  - ][ -  + ]:       6378 :   for (i = ancestorSequenceNumbers.size(); i > 0; i--)
     595 [ #  # ][ #  # ]:          0 :     i_list.push_back(ancestorSequenceNumbers.get_and_step());
     596                 :            : 
     597                 :            :     // now, doubles (none)
     598                 :            : 
     599                 :            :     // now, strings
     600                 :            :     // attribute internal name
     601 [ +  - ][ +  - ]:       6378 :   cs_list.push_back(att_internal_name());
         [ +  - ][ +  - ]
     602                 :            : 
     603                 :            :     // groupNames
     604         [ +  - ]:       6378 :   groupNames.reset();
     605 [ +  - ][ +  + ]:       6411 :   for (i = groupID.size(); i > 0; i--)
     606 [ +  - ][ +  - ]:         33 :     cs_list.push_back(groupNames.get_and_step());
     607                 :            : 
     608                 :            :     // owningGroupNames
     609         [ +  - ]:       6378 :   owningGroupNames.reset();
     610 [ +  - ][ -  + ]:       6378 :   for (i = owningGroupNames.size(); i > 0; i--)
     611 [ #  # ][ #  # ]:          0 :     cs_list.push_back(owningGroupNames.get_and_step());
     612                 :            : 
     613                 :            :     // ancestorGroupName
     614         [ +  - ]:       6378 :   ancestorGroupName.reset();
     615 [ +  - ][ -  + ]:       6378 :   for (i = ancestorGroupName.size(); i > 0; i--)
     616 [ #  # ][ #  # ]:          0 :     cs_list.push_back(ancestorGroupName.get_and_step());
     617                 :            : 
     618 [ +  - ][ +  - ]:      12756 :   return CubitSimpleAttrib(&cs_list, &d_list, &i_list);
     619                 :            : }
     620                 :            : 
     621                 :       6367 : void CAGroup::has_written(CubitBoolean has_written)
     622                 :            : {
     623                 :            :     //- overloaded has_written function, resets td_cage on owner
     624 [ +  + ][ +  - ]:       6367 :   if (has_written == CUBIT_TRUE && hasWritten == CUBIT_FALSE)
     625                 :            :       // reset the td_cage on the owner
     626                 :         11 :     attribOwnerEntity->delete_TD(&TDCAGE::is_cage);
     627                 :            :     
     628                 :       6367 :   hasWritten = has_written;
     629 [ +  - ][ +  - ]:       6540 : }

Generated by: LCOV version 1.11