LCOV - code coverage report
Current view: top level - src - SequenceManager.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 241 418 57.7 %
Date: 2020-12-16 07:07:30 Functions: 27 37 73.0 %
Branches: 280 878 31.9 %

           Branch data     Line data    Source code
       1                 :            : #include "SequenceManager.hpp"
       2                 :            : #include "VertexSequence.hpp"
       3                 :            : #include "UnstructuredElemSeq.hpp"
       4                 :            : #include "ScdVertexData.hpp"
       5                 :            : #include "MeshSetSequence.hpp"
       6                 :            : #include "SweptElementSeq.hpp"
       7                 :            : #include "StructuredElementSeq.hpp"
       8                 :            : #include "moab/HomXform.hpp"
       9                 :            : #include "PolyElementSeq.hpp"
      10                 :            : #include "SysUtil.hpp"
      11                 :            : #include "moab/Error.hpp"
      12                 :            : 
      13                 :            : #include <assert.h>
      14                 :            : #include <new>
      15                 :            : #include <algorithm>
      16                 :            : 
      17                 :            : #ifndef NDEBUG
      18                 :            : #include <iostream>
      19                 :            : #endif
      20                 :            : 
      21                 :            : namespace moab
      22                 :            : {
      23                 :            : 
      24                 :            : const EntityID SequenceManager::DEFAULT_VERTEX_SEQUENCE_SIZE  = 512 * 1024;
      25                 :            : const EntityID SequenceManager::DEFAULT_ELEMENT_SEQUENCE_SIZE = DEFAULT_VERTEX_SEQUENCE_SIZE;
      26                 :            : const EntityID SequenceManager::DEFAULT_POLY_SEQUENCE_SIZE    = 16 * 1024;
      27                 :            : const EntityID SequenceManager::DEFAULT_MESHSET_SEQUENCE_SIZE = DEFAULT_VERTEX_SEQUENCE_SIZE;
      28                 :            : 
      29                 :            : const int UNUSED_SIZE = 0;
      30                 :            : 
      31                 :         28 : EntityID SequenceManager::default_poly_sequence_size( int conn_len )
      32                 :            : {
      33         [ +  - ]:         28 :     return std::max( DEFAULT_POLY_SEQUENCE_SIZE / conn_len, (EntityID)1 );
      34                 :            : }
      35                 :            : 
      36                 :       5180 : SequenceManager::~SequenceManager()
      37                 :            : {
      38                 :            :     // Release variable-length tag data
      39         [ +  + ]:       1000 :     for( unsigned i = 0; i < tagSizes.size(); ++i )
      40         [ -  + ]:        630 :         if( tagSizes[i] == MB_VARIABLE_LENGTH ) release_tag_array( 0, i, false );
      41 [ +  - ][ +  + ]:       4810 : }
      42                 :            : 
      43                 :         66 : void SequenceManager::clear()
      44                 :            : {
      45                 :            :     // reset sequence multiplier
      46                 :         66 :     sequence_multiplier = 1.0;
      47                 :            : 
      48                 :            :     // Destroy all TypeSequenceManager instances
      49 [ +  - ][ +  + ]:        858 :     for( EntityType t = MBVERTEX; t < MBMAXTYPE; ++t )
      50                 :        792 :         typeData[t].~TypeSequenceManager();
      51                 :            : 
      52                 :            :     // Now re-create TypeSequenceManager instances
      53 [ +  - ][ +  + ]:        858 :     for( EntityType t = MBVERTEX; t < MBMAXTYPE; ++t )
      54 [ +  - ][ +  - ]:        792 :         new( typeData + t ) TypeSequenceManager();
      55                 :         66 : }
      56                 :            : 
      57                 :        490 : void SequenceManager::get_entities( Range& entities_out ) const
      58                 :            : {
      59 [ +  - ][ +  + ]:       6370 :     for( EntityType t = MBENTITYSET; t >= MBVERTEX; --t )
      60         [ +  - ]:       5880 :         typeData[t].get_entities( entities_out );
      61                 :        490 : }
      62                 :            : 
      63                 :          1 : void SequenceManager::get_entities( std::vector< EntityHandle >& entities_out ) const
      64                 :            : {
      65 [ +  - ][ +  + ]:         13 :     for( EntityType t = MBVERTEX; t != MBMAXTYPE; ++t )
      66         [ +  - ]:         12 :         typeData[t].get_entities( entities_out );
      67                 :          1 : }
      68                 :            : 
      69                 :          1 : EntityID SequenceManager::get_number_entities() const
      70                 :            : {
      71                 :          1 :     EntityID sum = 0;
      72 [ +  - ][ +  + ]:         13 :     for( EntityType t = MBVERTEX; t != MBMAXTYPE; ++t )
      73         [ +  - ]:         12 :         sum += typeData[t].get_number_entities();
      74                 :            : 
      75                 :          1 :     return sum;
      76                 :            : }
      77                 :            : 
      78                 :        300 : ErrorCode SequenceManager::check_valid_entities( Error* /* error */, const Range& entities ) const
      79                 :            : {
      80                 :            :     ErrorCode rval;
      81         [ +  - ]:        300 :     Range::const_pair_iterator i;
      82 [ +  - ][ +  - ]:      13187 :     for( i = entities.const_pair_begin(); i != entities.const_pair_end(); ++i )
         [ +  - ][ +  - ]
                 [ +  + ]
      83                 :            :     {
      84 [ +  - ][ +  - ]:      12893 :         const EntityType type1 = TYPE_FROM_HANDLE( i->first );
      85 [ +  - ][ +  - ]:      12893 :         const EntityType type2 = TYPE_FROM_HANDLE( i->second );
      86         [ +  - ]:      12893 :         if( type1 == type2 )
      87                 :            :         {
      88 [ +  - ][ +  - ]:      12893 :             rval = typeData[type1].check_valid_handles( NULL, i->first, i->second );
                 [ +  - ]
      89         [ +  + ]:      12893 :             if( MB_SUCCESS != rval ) return rval;
      90                 :            :         }
      91                 :            :         else
      92                 :            :         {
      93                 :            :             int junk;
      94         [ #  # ]:          0 :             EntityHandle split = CREATE_HANDLE( type2, 0, junk );
      95 [ #  # ][ #  # ]:          0 :             rval               = typeData[type1].check_valid_handles( NULL, i->first, split - 1 );
      96         [ #  # ]:          0 :             if( MB_SUCCESS != rval ) return rval;
      97 [ #  # ][ #  # ]:          0 :             rval = typeData[type2].check_valid_handles( NULL, split, i->second );
      98         [ #  # ]:          0 :             if( MB_SUCCESS != rval ) return rval;
      99                 :            :         }
     100                 :            :     }
     101                 :            : 
     102                 :        300 :     return MB_SUCCESS;
     103                 :            : }
     104                 :            : 
     105                 :    4278583 : ErrorCode SequenceManager::check_valid_entities( Error* /* error_handler */, const EntityHandle* entities,
     106                 :            :                                                  size_t num_entities, bool root_set_okay ) const
     107                 :            : {
     108                 :            :     ErrorCode rval;
     109                 :    4278583 :     const EntitySequence* ptr = 0;
     110                 :            : 
     111                 :    4278583 :     const EntityHandle* const end = entities + num_entities;
     112         [ +  + ]:    8557376 :     for( ; entities < end; ++entities )
     113                 :            :     {
     114         [ +  - ]:    4278809 :         rval = find( *entities, ptr );
     115 [ +  + ][ +  + ]:    4278809 :         if( MB_SUCCESS != rval && !( root_set_okay && !*entities ) )
                 [ +  + ]
     116                 :            :         {
     117                 :            :             if( MB_ENTITY_NOT_FOUND == rval )
     118                 :            :             {
     119                 :            :                 // MB_ENTITY_NOT_FOUND could be a non-error condition, do not call MB_SET_ERR on it
     120                 :            : #if 0
     121                 :            :         fprintf(stderr, "[Warning]: Invalid entity handle: 0x%lx\n", (unsigned long)*entities);
     122                 :            : #endif
     123                 :            :             }
     124                 :         16 :             return rval;
     125                 :            :         }
     126                 :            :     }
     127                 :            : 
     128                 :    4278583 :     return MB_SUCCESS;
     129                 :            : }
     130                 :            : 
     131                 :      30113 : ErrorCode SequenceManager::delete_entity( Error* /* error */, EntityHandle entity )
     132                 :            : {
     133                 :      30113 :     return typeData[TYPE_FROM_HANDLE( entity )].erase( NULL, entity );
     134                 :            : }
     135                 :            : 
     136                 :         56 : ErrorCode SequenceManager::delete_entities( Error* /* error */, const Range& entities )
     137                 :            : {
     138         [ +  - ]:         56 :     ErrorCode rval = check_valid_entities( NULL, entities );
     139         [ -  + ]:         56 :     if( MB_SUCCESS != rval ) return rval;
     140                 :            : 
     141                 :         56 :     ErrorCode result = MB_SUCCESS;
     142         [ +  - ]:         56 :     Range::const_pair_iterator i;
     143 [ +  - ][ +  - ]:      12329 :     for( i = entities.const_pair_begin(); i != entities.const_pair_end(); ++i )
         [ +  - ][ +  - ]
                 [ +  + ]
     144                 :            :     {
     145 [ +  - ][ +  - ]:      12273 :         const EntityType type1 = TYPE_FROM_HANDLE( i->first );
     146 [ +  - ][ +  - ]:      12273 :         const EntityType type2 = TYPE_FROM_HANDLE( i->second );
     147         [ +  - ]:      12273 :         if( type1 == type2 )
     148                 :            :         {
     149 [ +  - ][ +  - ]:      12273 :             rval = typeData[type1].erase( NULL, i->first, i->second );
                 [ +  - ]
     150         [ -  + ]:      12273 :             if( MB_SUCCESS != rval ) return result = rval;
     151                 :            :         }
     152                 :            :         else
     153                 :            :         {
     154                 :            :             int junk;
     155         [ #  # ]:          0 :             EntityHandle split = CREATE_HANDLE( type2, 0, junk );
     156 [ #  # ][ #  # ]:          0 :             rval               = typeData[type1].erase( NULL, i->first, split - 1 );
     157         [ #  # ]:          0 :             if( MB_SUCCESS != rval ) return result = rval;
     158 [ #  # ][ #  # ]:          0 :             rval = typeData[type2].erase( NULL, split, i->second );
     159         [ #  # ]:          0 :             if( MB_SUCCESS != rval ) return result = rval;
     160                 :            :         }
     161                 :            :     }
     162                 :            : 
     163                 :         56 :     return result;
     164                 :            : }
     165                 :            : 
     166                 :    2114879 : ErrorCode SequenceManager::create_vertex( const double coords[3], EntityHandle& handle )
     167                 :            : {
     168         [ +  - ]:    2114879 :     const EntityHandle start = CREATE_HANDLE( MBVERTEX, MB_START_ID );
     169         [ +  - ]:    2114879 :     const EntityHandle end   = CREATE_HANDLE( MBVERTEX, MB_END_ID );
     170                 :            :     bool append;
     171         [ +  - ]:    2114879 :     TypeSequenceManager::iterator seq = typeData[MBVERTEX].find_free_handle( start, end, append );
     172                 :            :     VertexSequence* vseq;
     173                 :            : 
     174 [ +  - ][ +  - ]:    2114879 :     if( seq == typeData[MBVERTEX].end() )
                 [ +  + ]
     175                 :            :     {
     176                 :        217 :         SequenceData* seq_data = 0;
     177                 :        217 :         EntityID seq_data_size = 0;
     178                 :            :         handle =
     179         [ +  - ]:        217 :             typeData[MBVERTEX].find_free_sequence( DEFAULT_VERTEX_SEQUENCE_SIZE, start, end, seq_data, seq_data_size );
     180         [ -  + ]:        217 :         if( !handle ) return MB_FAILURE;
     181                 :            : 
     182         [ -  + ]:        217 :         if( seq_data )
     183 [ #  # ][ #  # ]:          0 :             vseq = new VertexSequence( handle, 1, seq_data );
     184                 :            :         else
     185 [ +  - ][ +  - ]:        217 :             vseq = new VertexSequence( handle, 1, DEFAULT_VERTEX_SEQUENCE_SIZE );
     186                 :            : 
     187         [ +  - ]:        217 :         ErrorCode rval = typeData[MBVERTEX].insert_sequence( vseq );
     188         [ -  + ]:        217 :         if( MB_SUCCESS != rval )
     189                 :            :         {
     190         [ #  # ]:          0 :             SequenceData* vdata = vseq->data();
     191         [ #  # ]:          0 :             delete vseq;
     192 [ #  # ][ #  # ]:          0 :             if( !seq_data ) delete vdata;
     193                 :            : 
     194                 :        217 :             return rval;
     195                 :            :         }
     196                 :            :     }
     197                 :            :     else
     198                 :            :     {
     199         [ +  - ]:    2114662 :         vseq = reinterpret_cast< VertexSequence* >( *seq );
     200         [ +  - ]:    2114662 :         if( append )
     201                 :            :         {
     202         [ +  - ]:    2114662 :             vseq->push_back( 1 );
     203         [ +  - ]:    2114662 :             handle = vseq->end_handle();
     204         [ +  - ]:    2114662 :             typeData[MBVERTEX].notify_appended( seq );
     205                 :            :         }
     206                 :            :         else
     207                 :            :         {
     208         [ #  # ]:          0 :             vseq->push_front( 1 );
     209         [ #  # ]:          0 :             handle = vseq->start_handle();
     210         [ #  # ]:          0 :             typeData[MBVERTEX].notify_prepended( seq );
     211                 :            :         }
     212                 :            :     }
     213                 :            : 
     214         [ +  - ]:    2114879 :     return vseq->set_coordinates( handle, coords );
     215                 :            : }
     216                 :            : 
     217                 :     417601 : ErrorCode SequenceManager::create_element( EntityType type, const EntityHandle* conn, unsigned conn_len,
     218                 :            :                                            EntityHandle& handle )
     219                 :            : {
     220 [ +  - ][ -  + ]:     417601 :     if( type <= MBVERTEX || type >= MBENTITYSET ) return MB_TYPE_OUT_OF_RANGE;
     221                 :            : 
     222         [ +  - ]:     417601 :     const EntityHandle start = CREATE_HANDLE( type, MB_START_ID );
     223         [ +  - ]:     417601 :     const EntityHandle end   = CREATE_HANDLE( type, MB_END_ID );
     224                 :            :     bool append;
     225         [ +  - ]:     417601 :     TypeSequenceManager::iterator seq = typeData[type].find_free_handle( start, end, append, conn_len );
     226                 :            :     UnstructuredElemSeq* eseq;
     227                 :            : 
     228 [ +  - ][ +  - ]:     417601 :     if( seq == typeData[type].end() )
                 [ +  + ]
     229                 :            :     {
     230                 :        390 :         SequenceData* seq_data = 0;
     231                 :        390 :         unsigned size          = DEFAULT_ELEMENT_SEQUENCE_SIZE;
     232 [ +  + ][ +  + ]:        390 :         if( type == MBPOLYGON || type == MBPOLYHEDRON ) { size = default_poly_sequence_size( conn_len ); }
                 [ +  - ]
     233                 :        390 :         EntityID seq_data_size = 0;
     234         [ +  - ]:        390 :         handle = typeData[type].find_free_sequence( size, start, end, seq_data, seq_data_size, conn_len );
     235         [ -  + ]:        390 :         if( !handle ) return MB_FAILURE;
     236                 :            : 
     237 [ +  + ][ +  + ]:        390 :         if( MBPOLYGON == type || MBPOLYHEDRON == type )
     238                 :            :         {
     239         [ -  + ]:         56 :             if( seq_data )
     240 [ #  # ][ #  # ]:          0 :                 eseq = new PolyElementSeq( handle, 1, conn_len, seq_data );
     241                 :            :             else
     242 [ +  - ][ +  - ]:         28 :                 eseq = new PolyElementSeq( handle, 1, conn_len, size );
     243                 :            :         }
     244                 :            :         else
     245                 :            :         {
     246         [ -  + ]:        362 :             if( seq_data )
     247 [ #  # ][ #  # ]:          0 :                 eseq = new UnstructuredElemSeq( handle, 1, conn_len, seq_data );
     248                 :            :             else
     249 [ +  - ][ +  - ]:        362 :                 eseq = new UnstructuredElemSeq( handle, 1, conn_len, size );
     250                 :            :         }
     251                 :            : 
     252         [ +  - ]:        390 :         ErrorCode rval = typeData[type].insert_sequence( eseq );
     253         [ -  + ]:        390 :         if( MB_SUCCESS != rval )
     254                 :            :         {
     255         [ #  # ]:          0 :             SequenceData* vdata = eseq->data();
     256         [ #  # ]:          0 :             delete eseq;
     257 [ #  # ][ #  # ]:          0 :             if( !seq_data ) delete vdata;
     258                 :            : 
     259                 :        390 :             return rval;
     260                 :            :         }
     261                 :            :     }
     262                 :            :     else
     263                 :            :     {
     264         [ +  - ]:     417211 :         eseq = reinterpret_cast< UnstructuredElemSeq* >( *seq );
     265         [ +  + ]:     417211 :         if( append )
     266                 :            :         {
     267         [ +  - ]:     417177 :             eseq->push_back( 1 );
     268         [ +  - ]:     417177 :             handle = eseq->end_handle();
     269         [ +  - ]:     417177 :             typeData[type].notify_appended( seq );
     270                 :            :         }
     271                 :            :         else
     272                 :            :         {
     273         [ +  - ]:         34 :             eseq->push_front( 1 );
     274         [ +  - ]:         34 :             handle = eseq->start_handle();
     275         [ +  - ]:         34 :             typeData[type].notify_prepended( seq );
     276                 :            :         }
     277                 :            :     }
     278                 :            : 
     279         [ +  - ]:     417601 :     return eseq->set_connectivity( handle, conn, conn_len );
     280                 :            : }
     281                 :            : 
     282                 :      31176 : ErrorCode SequenceManager::create_mesh_set( unsigned flags, EntityHandle& handle )
     283                 :            : {
     284         [ +  - ]:      31176 :     const EntityHandle start = CREATE_HANDLE( MBENTITYSET, MB_START_ID );
     285         [ +  - ]:      31176 :     const EntityHandle end   = CREATE_HANDLE( MBENTITYSET, MB_END_ID );
     286                 :            :     bool append;
     287         [ +  - ]:      31176 :     TypeSequenceManager::iterator seq = typeData[MBENTITYSET].find_free_handle( start, end, append );
     288                 :            :     MeshSetSequence* msseq;
     289                 :            : 
     290 [ +  - ][ +  - ]:      31176 :     if( seq == typeData[MBENTITYSET].end() )
                 [ +  + ]
     291                 :            :     {
     292                 :        286 :         SequenceData* seq_data = 0;
     293                 :        286 :         EntityID seq_data_size = 0;
     294                 :            :         handle = typeData[MBENTITYSET].find_free_sequence( DEFAULT_MESHSET_SEQUENCE_SIZE, start, end, seq_data,
     295         [ +  - ]:        286 :                                                            seq_data_size );
     296         [ -  + ]:        286 :         if( !handle ) return MB_FAILURE;
     297                 :            : 
     298         [ -  + ]:        286 :         if( seq_data )
     299 [ #  # ][ #  # ]:          0 :             msseq = new MeshSetSequence( handle, 1, flags, seq_data );
     300                 :            :         else
     301 [ +  - ][ +  - ]:        286 :             msseq = new MeshSetSequence( handle, 1, flags, DEFAULT_MESHSET_SEQUENCE_SIZE );
     302                 :            : 
     303         [ +  - ]:        286 :         ErrorCode rval = typeData[MBENTITYSET].insert_sequence( msseq );
     304         [ -  + ]:        286 :         if( MB_SUCCESS != rval )
     305                 :            :         {
     306         [ #  # ]:          0 :             SequenceData* vdata = msseq->data();
     307         [ #  # ]:          0 :             delete msseq;
     308 [ #  # ][ #  # ]:          0 :             if( !seq_data ) delete vdata;
     309                 :            : 
     310                 :        286 :             return rval;
     311                 :            :         }
     312                 :            :     }
     313                 :            :     else
     314                 :            :     {
     315         [ +  - ]:      30890 :         msseq = reinterpret_cast< MeshSetSequence* >( *seq );
     316         [ +  - ]:      30890 :         if( append )
     317                 :            :         {
     318         [ +  - ]:      30890 :             msseq->push_back( 1, &flags );
     319         [ +  - ]:      30890 :             handle = msseq->end_handle();
     320         [ +  - ]:      30890 :             typeData[MBENTITYSET].notify_appended( seq );
     321                 :            :         }
     322                 :            :         else
     323                 :            :         {
     324         [ #  # ]:          0 :             msseq->push_front( 1, &flags );
     325         [ #  # ]:          0 :             handle = msseq->start_handle();
     326         [ #  # ]:          0 :             typeData[MBENTITYSET].notify_prepended( seq );
     327                 :            :         }
     328                 :            :     }
     329                 :            : 
     330                 :      31176 :     return MB_SUCCESS;
     331                 :            : }
     332                 :            : 
     333                 :          0 : ErrorCode SequenceManager::allocate_mesh_set( EntityHandle handle, unsigned flags )
     334                 :            : {
     335                 :          0 :     SequenceData* data = 0;
     336         [ #  # ]:          0 :     TypeSequenceManager::iterator seqptr;
     337                 :          0 :     EntityHandle block_start = 1, block_end = 0;
     338         [ #  # ]:          0 :     ErrorCode rval = typeData[MBENTITYSET].is_free_handle( handle, seqptr, data, block_start, block_end );
     339         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
     340                 :            : 
     341                 :            :     MeshSetSequence* seq;
     342 [ #  # ][ #  # ]:          0 :     if( seqptr != typeData[MBENTITYSET].end() )
                 [ #  # ]
     343                 :            :     {
     344         [ #  # ]:          0 :         seq = static_cast< MeshSetSequence* >( *seqptr );
     345 [ #  # ][ #  # ]:          0 :         if( seq->start_handle() - 1 == handle )
     346                 :            :         {
     347         [ #  # ]:          0 :             rval = seq->push_front( 1, &flags );
     348         [ #  # ]:          0 :             if( MB_SUCCESS == rval )
     349                 :            :             {
     350         [ #  # ]:          0 :                 rval = typeData[MBENTITYSET].notify_prepended( seqptr );
     351 [ #  # ][ #  # ]:          0 :                 if( MB_SUCCESS != rval ) seq->pop_front( 1 );
     352                 :            :             }
     353                 :          0 :             return rval;
     354                 :            :         }
     355 [ #  # ][ #  # ]:          0 :         else if( seq->end_handle() + 1 == handle )
     356                 :            :         {
     357         [ #  # ]:          0 :             rval = seq->push_back( 1, &flags );
     358         [ #  # ]:          0 :             if( MB_SUCCESS == rval )
     359                 :            :             {
     360         [ #  # ]:          0 :                 rval = typeData[MBENTITYSET].notify_appended( seqptr );
     361 [ #  # ][ #  # ]:          0 :                 if( MB_SUCCESS != rval ) seq->pop_back( 1 );
     362                 :            :             }
     363                 :          0 :             return rval;
     364                 :            :         }
     365                 :            :         else
     366                 :          0 :             return MB_FAILURE;  // Should be unreachable
     367                 :            :     }
     368                 :            :     else
     369                 :            :     {
     370 [ #  # ][ #  # ]:          0 :         if( data ) { seq = new MeshSetSequence( handle, 1, flags, data ); }
                 [ #  # ]
     371                 :            :         else
     372                 :            :         {
     373 [ #  # ][ #  # ]:          0 :             assert( handle >= block_start && handle <= block_end );
     374         [ #  # ]:          0 :             trim_sequence_block( handle, block_end, DEFAULT_MESHSET_SEQUENCE_SIZE );
     375 [ #  # ][ #  # ]:          0 :             seq = new MeshSetSequence( handle, 1, flags, block_end - handle + 1 );
     376                 :            :         }
     377                 :            : 
     378         [ #  # ]:          0 :         rval = typeData[MBENTITYSET].insert_sequence( seq );
     379         [ #  # ]:          0 :         if( MB_SUCCESS != rval )
     380                 :            :         {
     381         [ #  # ]:          0 :             SequenceData* vdata = seq->data();
     382         [ #  # ]:          0 :             delete seq;
     383 [ #  # ][ #  # ]:          0 :             if( !data ) delete vdata;
     384                 :          0 :             return rval;
     385                 :            :         }
     386                 :            : 
     387                 :          0 :         return MB_SUCCESS;
     388                 :            :     }
     389                 :            : }
     390                 :            : 
     391                 :          0 : void SequenceManager::trim_sequence_block( EntityHandle start_handle, EntityHandle& end_handle, unsigned max_size )
     392                 :            : {
     393         [ #  # ]:          0 :     assert( end_handle >= start_handle );
     394         [ #  # ]:          0 :     assert( (int)max_size > 0 );  // Cast to int also prohibits some ridiculously large values
     395                 :            : 
     396                 :            :     // If input range is larger than preferred size, trim it
     397         [ #  # ]:          0 :     if( end_handle - start_handle >= max_size ) end_handle = start_handle + max_size - 1;
     398                 :          0 : }
     399                 :            : 
     400                 :        677 : EntityHandle SequenceManager::sequence_start_handle( EntityType type, EntityID count, int size, EntityID start,
     401                 :            :                                                      SequenceData*& data, EntityID& data_size )
     402                 :            : {
     403                 :        677 :     TypeSequenceManager& tsm = typeData[type];
     404                 :        677 :     data                     = 0;
     405                 :        677 :     EntityHandle handle      = CREATE_HANDLE( type, start );
     406 [ +  + ][ +  + ]:        677 :     if( start < MB_START_ID || !tsm.is_free_sequence( handle, count, data, size ) )
                 [ +  + ]
     407                 :            :     {
     408                 :        416 :         EntityHandle pstart = CREATE_HANDLE( type, MB_START_ID );
     409                 :        416 :         EntityHandle pend   = CREATE_HANDLE( type, MB_END_ID );
     410                 :        416 :         handle              = tsm.find_free_sequence( count, pstart, pend, data, data_size, size );
     411                 :            :     }
     412                 :            : 
     413                 :        677 :     return handle;
     414                 :            : }
     415                 :            : 
     416                 :        466 : EntityID SequenceManager::new_sequence_size( EntityHandle start, EntityID requested_size, int sequence_size ) const
     417                 :            : {
     418                 :            : 
     419                 :        466 :     requested_size = ( EntityID )( this->sequence_multiplier * requested_size );
     420                 :            : 
     421         [ +  - ]:        466 :     if( sequence_size < (int)requested_size ) return requested_size;
     422                 :            : 
     423                 :          0 :     EntityHandle last = typeData[TYPE_FROM_HANDLE( start )].last_free_handle( start );
     424         [ #  # ]:          0 :     if( !last )
     425                 :            :     {
     426                 :          0 :         assert( false );
     427                 :            :         return 0;
     428                 :            :     }
     429                 :            : 
     430                 :          0 :     EntityID available_size = last - start + 1;
     431         [ #  # ]:          0 :     if( sequence_size < available_size )
     432                 :          0 :         return sequence_size;
     433                 :            :     else
     434                 :          0 :         return available_size;
     435                 :            : }
     436                 :            : 
     437                 :        551 : ErrorCode SequenceManager::create_entity_sequence( EntityType type, EntityID count, int size, EntityID start,
     438                 :            :                                                    EntityHandle& handle, EntitySequence*& sequence, int sequence_size )
     439                 :            : {
     440                 :        551 :     SequenceData* data = NULL;
     441                 :        551 :     EntityID data_size = 0;
     442         [ +  - ]:        551 :     handle             = sequence_start_handle( type, count, size, start, data, data_size );
     443                 :            : 
     444         [ -  + ]:        551 :     if( !handle ) return MB_MEMORY_ALLOCATION_FAILED;
     445                 :            : 
     446   [ -  +  -  + ]:        551 :     switch( type )
     447                 :            :     {
     448                 :            :         case MBENTITYSET:
     449                 :            :         case MBMAXTYPE:
     450                 :          0 :             return MB_TYPE_OUT_OF_RANGE;
     451                 :            : 
     452                 :            :         case MBVERTEX:
     453         [ -  + ]:        233 :             if( size != 0 ) return MB_INDEX_OUT_OF_RANGE;
     454                 :            : 
     455         [ +  + ]:        233 :             if( data )
     456 [ +  - ][ +  - ]:         42 :                 sequence = new VertexSequence( handle, count, data );
     457                 :            :             else
     458                 :            :             {
     459 [ +  - ][ +  - ]:        191 :                 if( !data_size ) data_size = new_sequence_size( handle, count, sequence_size );
     460 [ +  - ][ +  - ]:        191 :                 sequence = new VertexSequence( handle, count, data_size );
     461                 :            :             }
     462                 :        233 :             break;
     463                 :            : 
     464                 :            :         case MBPOLYGON:
     465                 :            :         case MBPOLYHEDRON:
     466         [ #  # ]:          0 :             if( size == 0 ) return MB_INDEX_OUT_OF_RANGE;
     467                 :            : 
     468         [ #  # ]:          0 :             if( data )
     469 [ #  # ][ #  # ]:          0 :                 sequence = new PolyElementSeq( handle, count, size, data );
     470                 :            :             else
     471                 :            :             {
     472         [ #  # ]:          0 :                 if( !data_size )
     473                 :            :                     data_size = new_sequence_size(
     474 [ #  # ][ #  # ]:          0 :                         handle, count, ( -1 == sequence_size ? default_poly_sequence_size( size ) : sequence_size ) );
                 [ #  # ]
     475 [ #  # ][ #  # ]:          0 :                 sequence = new PolyElementSeq( handle, count, size, data_size );
     476                 :            :             }
     477                 :          0 :             break;
     478                 :            : 
     479                 :            :         default:
     480         [ -  + ]:        318 :             if( size == 0 ) return MB_INDEX_OUT_OF_RANGE;
     481                 :            : 
     482         [ +  + ]:        318 :             if( data )
     483 [ +  - ][ +  - ]:         43 :                 sequence = new UnstructuredElemSeq( handle, count, size, data );
     484                 :            :             else
     485                 :            :             {
     486 [ +  - ][ +  - ]:        275 :                 if( !data_size ) data_size = new_sequence_size( handle, count, sequence_size );
     487 [ +  - ][ +  - ]:        275 :                 sequence = new UnstructuredElemSeq( handle, count, size, data_size );
     488                 :            :             }
     489                 :            :             // tjt calling new_sequence_size 'cuz don't have a sequence data;
     490                 :            :             // start 41467, count 246
     491                 :        318 :             break;
     492                 :            :     }
     493                 :            : 
     494         [ +  - ]:        551 :     ErrorCode result = typeData[type].insert_sequence( sequence );
     495         [ -  + ]:        551 :     if( MB_SUCCESS != result )
     496                 :            :     {
     497                 :            :         // Change to NULL if had an existing data or if no existing data,
     498                 :            :         // change to the new data created
     499 [ #  # ][ #  # ]:          0 :         data = data ? 0 : sequence->data();
     500         [ #  # ]:          0 :         delete sequence;
     501         [ #  # ]:          0 :         delete data;
     502                 :          0 :         return result;
     503                 :            :     }
     504                 :            : 
     505                 :        551 :     return MB_SUCCESS;
     506                 :            : }
     507                 :            : 
     508                 :         67 : ErrorCode SequenceManager::create_meshset_sequence( EntityID count, EntityID start, const unsigned* flags,
     509                 :            :                                                     EntityHandle& handle, EntitySequence*& sequence )
     510                 :            : {
     511                 :         67 :     SequenceData* data = 0;
     512                 :         67 :     EntityID data_size = 0;
     513         [ +  - ]:         67 :     handle             = sequence_start_handle( MBENTITYSET, count, 0, start, data, data_size );
     514                 :            : 
     515         [ -  + ]:         67 :     if( !handle ) return MB_MEMORY_ALLOCATION_FAILED;
     516                 :            : 
     517         [ +  + ]:         67 :     if( data )
     518 [ +  - ][ +  - ]:         23 :         sequence = new MeshSetSequence( handle, count, flags, data );
     519                 :            :     else
     520 [ +  - ][ +  - ]:         44 :         sequence = new MeshSetSequence( handle, count, flags, count );
     521                 :            : 
     522         [ +  - ]:         67 :     ErrorCode result = typeData[MBENTITYSET].insert_sequence( sequence );
     523         [ -  + ]:         67 :     if( MB_SUCCESS != result )
     524                 :            :     {
     525                 :            :         // Change to NULL if had an existing data or if no existing data,
     526                 :            :         // change to the new data created
     527 [ #  # ][ #  # ]:          0 :         data = data ? 0 : sequence->data();
     528         [ #  # ]:          0 :         delete sequence;
     529         [ #  # ]:          0 :         delete data;
     530                 :          0 :         return result;
     531                 :            :     }
     532                 :            : 
     533                 :         67 :     return MB_SUCCESS;
     534                 :            : }
     535                 :            : 
     536                 :          0 : ErrorCode SequenceManager::create_meshset_sequence( EntityID count, EntityID start, unsigned flags,
     537                 :            :                                                     EntityHandle& handle, EntitySequence*& sequence )
     538                 :            : {
     539                 :          0 :     SequenceData* data = 0;
     540                 :          0 :     EntityID data_size = 0;
     541         [ #  # ]:          0 :     handle             = sequence_start_handle( MBENTITYSET, count, 0, start, data, data_size );
     542         [ #  # ]:          0 :     if( !handle ) return MB_MEMORY_ALLOCATION_FAILED;
     543                 :            : 
     544         [ #  # ]:          0 :     if( data )
     545 [ #  # ][ #  # ]:          0 :         sequence = new MeshSetSequence( handle, count, flags, data );
     546                 :            :     else
     547 [ #  # ][ #  # ]:          0 :         sequence = new MeshSetSequence( handle, count, flags, count );
     548                 :            : 
     549         [ #  # ]:          0 :     ErrorCode result = typeData[MBENTITYSET].insert_sequence( sequence );
     550         [ #  # ]:          0 :     if( MB_SUCCESS != result )
     551                 :            :     {
     552                 :            :         // Change to NULL if had an existing data or if no existing data,
     553                 :            :         // change to the new data created
     554 [ #  # ][ #  # ]:          0 :         data = data ? 0 : sequence->data();
     555         [ #  # ]:          0 :         delete sequence;
     556         [ #  # ]:          0 :         delete data;
     557                 :          0 :         return result;
     558                 :            :     }
     559                 :            : 
     560                 :          0 :     return MB_SUCCESS;
     561                 :            : }
     562                 :            : 
     563                 :         59 : ErrorCode SequenceManager::create_scd_sequence( int imin, int jmin, int kmin, int imax, int jmax, int kmax,
     564                 :            :                                                 EntityType type, EntityID start_id_hint, EntityHandle& handle,
     565                 :            :                                                 EntitySequence*& sequence, int* is_periodic )
     566                 :            : {
     567         [ +  - ]:         59 :     int this_dim = CN::Dimension( type );
     568                 :            : 
     569                 :            :     // Use > instead of != in the following assert to also catch cases where imin > imax, etc.
     570 [ +  + ][ +  - ]:         59 :     assert( ( this_dim < 3 || kmax > kmin ) && ( this_dim < 2 || jmax > jmin ) && ( this_dim < 1 || imax > imin ) );
         [ +  + ][ +  - ]
         [ +  + ][ -  + ]
     571                 :            : 
     572                 :            :     // Compute # entities; not as easy as it would appear...
     573                 :            :     EntityID num_ent;
     574         [ +  + ]:         59 :     if( MBVERTEX == type )
     575                 :         31 :         num_ent = ( EntityID )( imax - imin + 1 ) * ( EntityID )( jmax - jmin + 1 ) * ( EntityID )( kmax - kmin + 1 );
     576                 :            :     else
     577                 :            :     {
     578 [ +  + ][ +  + ]:         51 :         num_ent = ( imax - imin + ( is_periodic && is_periodic[0] ? 1 : 0 ) ) *
                 [ +  + ]
     579 [ +  + ][ +  + ]:         51 :                   ( this_dim >= 2 ? ( jmax - jmin + ( is_periodic && is_periodic[1] ? 1 : 0 ) ) : 1 ) *
                 [ +  + ]
     580                 :         28 :                   ( this_dim >= 3 ? ( kmax - kmin ) : 1 );
     581                 :            :     }
     582                 :            : 
     583 [ +  + ][ -  + ]:         59 :     if( MBVERTEX == type && ( is_periodic && ( is_periodic[0] || is_periodic[1] ) ) ) return MB_FAILURE;
         [ #  # ][ #  # ]
     584                 :            : 
     585                 :            :     // Get a start handle
     586                 :         59 :     SequenceData* data = 0;
     587                 :         59 :     EntityID data_size = 0;
     588         [ +  - ]:         59 :     handle             = sequence_start_handle( type, num_ent, -1, start_id_hint, data, data_size );
     589                 :            : 
     590         [ -  + ]:         59 :     if( !handle ) return MB_MEMORY_ALLOCATION_FAILED;
     591         [ -  + ]:         59 :     assert( !data );
     592                 :            : 
     593      [ +  +  - ]:         59 :     switch( type )
     594                 :            :     {
     595                 :            :         case MBVERTEX:
     596 [ +  - ][ +  - ]:         31 :             data     = new ScdVertexData( handle, imin, jmin, kmin, imax, jmax, kmax );
     597 [ +  - ][ +  - ]:         31 :             sequence = new VertexSequence( handle, data->size(), data );
                 [ +  - ]
     598                 :         31 :             break;
     599                 :            :         case MBEDGE:
     600                 :            :         case MBQUAD:
     601                 :            :         case MBHEX:
     602 [ +  - ][ +  - ]:         28 :             sequence = new StructuredElementSeq( handle, imin, jmin, kmin, imax, jmax, kmax, is_periodic );
     603                 :         28 :             break;
     604                 :            :         default:
     605                 :          0 :             return MB_TYPE_OUT_OF_RANGE;
     606                 :            :     }
     607                 :            : 
     608         [ +  - ]:         59 :     ErrorCode result = typeData[type].insert_sequence( sequence );
     609         [ -  + ]:         59 :     if( MB_SUCCESS != result )
     610                 :            :     {
     611         [ #  # ]:          0 :         data = sequence->data();
     612         [ #  # ]:          0 :         delete sequence;
     613         [ #  # ]:          0 :         delete data;
     614                 :          0 :         return result;
     615                 :            :     }
     616                 :            : 
     617                 :         59 :     return MB_SUCCESS;
     618                 :            : }
     619                 :            : 
     620                 :         59 : ErrorCode SequenceManager::create_scd_sequence( const HomCoord& coord_min, const HomCoord& coord_max, EntityType type,
     621                 :            :                                                 EntityID start_id_hint, EntityHandle& first_handle_out,
     622                 :            :                                                 EntitySequence*& sequence_out, int* is_periodic )
     623                 :            : {
     624                 :            :     return create_scd_sequence( coord_min.i(), coord_min.j(), coord_min.k(), coord_max.i(), coord_max.j(),
     625                 :         59 :                                 coord_max.k(), type, start_id_hint, first_handle_out, sequence_out, is_periodic );
     626                 :            : }
     627                 :            : 
     628                 :          0 : ErrorCode SequenceManager::create_sweep_sequence( int imin, int jmin, int kmin, int imax, int jmax, int kmax, int* Cq,
     629                 :            :                                                   EntityType type, EntityID start_id_hint, EntityHandle& handle,
     630                 :            :                                                   EntitySequence*& sequence )
     631                 :            : {
     632         [ #  # ]:          0 :     int this_dim = CN::Dimension( type );
     633                 :            : 
     634 [ #  # ][ #  # ]:          0 :     assert( ( this_dim < 3 || kmax > kmin ) && ( this_dim < 2 || jmax > jmin ) && ( this_dim < 1 || imax > imin ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     635                 :            : 
     636                 :            :     EntityID num_ent;
     637         [ #  # ]:          0 :     if( MBVERTEX == type )
     638                 :          0 :         num_ent = ( EntityID )( imax - imin + 1 ) * ( EntityID )( jmax - jmin + 1 ) * ( EntityID )( kmax - kmin + 1 );
     639                 :            :     else
     640                 :            :     {
     641 [ #  # ][ #  # ]:          0 :         num_ent = ( imax - imin ) * ( this_dim >= 2 ? ( jmax - jmin ) : 1 ) * ( this_dim >= 3 ? ( kmax - kmin ) : 1 );
     642                 :            :     }
     643                 :            : 
     644                 :            :     // Get a start handle
     645                 :          0 :     SequenceData* data = 0;
     646                 :          0 :     EntityID data_size = 0;
     647         [ #  # ]:          0 :     handle             = sequence_start_handle( type, num_ent, -1, start_id_hint, data, data_size );
     648                 :            : 
     649         [ #  # ]:          0 :     if( !handle ) return MB_MEMORY_ALLOCATION_FAILED;
     650         [ #  # ]:          0 :     assert( !data );
     651                 :            : 
     652      [ #  #  # ]:          0 :     switch( type )
     653                 :            :     {
     654                 :            :         case MBVERTEX:
     655 [ #  # ][ #  # ]:          0 :             data     = new ScdVertexData( handle, imin, jmin, kmin, imax, jmax, kmax );
     656 [ #  # ][ #  # ]:          0 :             sequence = new VertexSequence( handle, data->size(), data );
                 [ #  # ]
     657                 :          0 :             break;
     658                 :            :         case MBEDGE:
     659                 :            :         case MBQUAD:
     660                 :            :         case MBHEX:
     661 [ #  # ][ #  # ]:          0 :             sequence = new SweptElementSeq( handle, imin, jmin, kmin, imax, jmax, kmax, Cq );
     662                 :          0 :             break;
     663                 :            :         default:
     664                 :          0 :             return MB_TYPE_OUT_OF_RANGE;
     665                 :            :     }
     666                 :            : 
     667         [ #  # ]:          0 :     ErrorCode result = typeData[type].insert_sequence( sequence );
     668         [ #  # ]:          0 :     if( MB_SUCCESS != result )
     669                 :            :     {
     670         [ #  # ]:          0 :         data = sequence->data();
     671         [ #  # ]:          0 :         delete sequence;
     672         [ #  # ]:          0 :         delete data;
     673                 :          0 :         return result;
     674                 :            :     }
     675                 :            : 
     676                 :          0 :     return MB_SUCCESS;
     677                 :            : }
     678                 :            : 
     679                 :          0 : ErrorCode SequenceManager::create_sweep_sequence( const HomCoord& coord_min, const HomCoord& coord_max, int* Cq,
     680                 :            :                                                   EntityType type, EntityID start_id_hint,
     681                 :            :                                                   EntityHandle& first_handle_out, EntitySequence*& sequence_out )
     682                 :            : {
     683                 :            :     return create_sweep_sequence( coord_min.i(), coord_min.j(), coord_min.k(), coord_max.i(), coord_max.j(),
     684                 :          0 :                                   coord_max.k(), Cq, type, start_id_hint, first_handle_out, sequence_out );
     685                 :            : }
     686                 :            : 
     687                 :          0 : ErrorCode SequenceManager::add_vsequence( EntitySequence* vert_seq, EntitySequence* elem_seq, const HomCoord& p1,
     688                 :            :                                           const HomCoord& q1, const HomCoord& p2, const HomCoord& q2,
     689                 :            :                                           const HomCoord& p3, const HomCoord& q3, bool bb_input, const HomCoord* bb_min,
     690                 :            :                                           const HomCoord* bb_max )
     691                 :            : {
     692                 :            :     // Check first that they're structured vtx/elem sequences
     693         [ #  # ]:          0 :     ScdVertexData* scd_vd = dynamic_cast< ScdVertexData* >( vert_seq->data() );
     694         [ #  # ]:          0 :     if( !scd_vd ) return MB_FAILURE;
     695                 :            : 
     696         [ #  # ]:          0 :     ScdElementData* scd_ed = dynamic_cast< ScdElementData* >( elem_seq->data() );
     697         [ #  # ]:          0 :     if( !scd_ed ) return MB_FAILURE;
     698                 :            : 
     699 [ #  # ][ #  # ]:          0 :     if( bb_min && bb_max )
     700                 :          0 :         return scd_ed->add_vsequence( scd_vd, p1, q1, p2, q2, p3, q3, bb_input, *bb_min, *bb_max );
     701                 :            :     else
     702                 :            :         return scd_ed->add_vsequence( scd_vd, p1, q1, p2, q2, p3, q3, bb_input, HomCoord::unitv[0],
     703                 :          0 :                                       HomCoord::unitv[0] );
     704                 :            : }
     705                 :            : 
     706                 :         13 : ErrorCode SequenceManager::replace_subsequence( EntitySequence* new_seq )
     707                 :            : {
     708                 :         13 :     const EntityType type = TYPE_FROM_HANDLE( new_seq->start_handle() );
     709                 :         13 :     return typeData[type].replace_subsequence( new_seq, &tagSizes[0], tagSizes.size() );
     710                 :            : }
     711                 :            : 
     712                 :          4 : void SequenceManager::get_memory_use( unsigned long long& total_entity_storage,
     713                 :            :                                       unsigned long long& total_storage ) const
     714                 :            : 
     715                 :            : {
     716                 :          4 :     total_entity_storage = 0;
     717                 :          4 :     total_storage        = 0;
     718                 :            :     unsigned long long temp_entity, temp_total;
     719 [ +  - ][ +  + ]:         52 :     for( EntityType i = MBVERTEX; i < MBMAXTYPE; ++i )
     720                 :            :     {
     721                 :         48 :         temp_entity = temp_total = 0;
     722         [ +  - ]:         48 :         get_memory_use( i, temp_entity, temp_total );
     723                 :         48 :         total_entity_storage += temp_entity;
     724                 :         48 :         total_storage += temp_total;
     725                 :            :     }
     726                 :          4 : }
     727                 :            : 
     728                 :         48 : void SequenceManager::get_memory_use( EntityType type, unsigned long long& total_entity_storage,
     729                 :            :                                       unsigned long long& total_storage ) const
     730                 :            : {
     731                 :         48 :     typeData[type].get_memory_use( total_entity_storage, total_storage );
     732                 :         48 : }
     733                 :            : 
     734                 :          4 : void SequenceManager::get_memory_use( const Range& entities, unsigned long long& total_entity_storage,
     735                 :            :                                       unsigned long long& total_amortized_storage ) const
     736                 :            : {
     737                 :          4 :     total_entity_storage    = 0;
     738                 :          4 :     total_amortized_storage = 0;
     739                 :            :     unsigned long long temp_entity, temp_total;
     740         [ +  - ]:          4 :     Range::const_pair_iterator i;
     741 [ +  - ][ +  - ]:          8 :     for( i = entities.const_pair_begin(); i != entities.const_pair_end(); ++i )
         [ +  - ][ +  - ]
                 [ +  + ]
     742                 :            :     {
     743 [ +  - ][ +  - ]:          4 :         const EntityType t1 = TYPE_FROM_HANDLE( i->first );
     744 [ +  - ][ +  - ]:          4 :         const EntityType t2 = TYPE_FROM_HANDLE( i->second );
     745         [ +  - ]:          4 :         if( t1 == t2 )
     746                 :            :         {
     747                 :          4 :             temp_entity = temp_total = 0;
     748 [ +  - ][ +  - ]:          4 :             typeData[t1].get_memory_use( i->first, i->second, temp_entity, temp_total );
                 [ +  - ]
     749                 :          4 :             total_entity_storage += temp_entity;
     750                 :          4 :             total_amortized_storage += temp_total;
     751                 :            :         }
     752                 :            :         else
     753                 :            :         {
     754                 :            :             int junk;
     755                 :            : 
     756                 :          0 :             temp_entity = temp_total = 0;
     757 [ #  # ][ #  # ]:          0 :             typeData[t1].get_memory_use( i->first, CREATE_HANDLE( t1, MB_END_ID, junk ), temp_entity, temp_total );
                 [ #  # ]
     758                 :          0 :             total_entity_storage += temp_entity;
     759                 :          0 :             total_amortized_storage += temp_total;
     760                 :            : 
     761                 :          0 :             temp_entity = temp_total = 0;
     762 [ #  # ][ #  # ]:          0 :             typeData[t2].get_memory_use( CREATE_HANDLE( t2, MB_START_ID, junk ), i->second, temp_entity, temp_total );
                 [ #  # ]
     763                 :          0 :             total_entity_storage += temp_entity;
     764                 :          0 :             total_amortized_storage += temp_total;
     765                 :            :         }
     766                 :            :     }
     767                 :          4 : }
     768                 :            : 
     769                 :        655 : ErrorCode SequenceManager::reserve_tag_array( Error* /* error_handler */, int size, int& index )
     770                 :            : {
     771 [ +  + ][ -  + ]:        655 :     if( size < 1 && size != MB_VARIABLE_LENGTH ) { MB_SET_ERR( MB_INVALID_SIZE, "Invalid tag size: " << size ); }
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     772                 :            : 
     773         [ +  - ]:        655 :     std::vector< int >::iterator i = std::find( tagSizes.begin(), tagSizes.end(), UNUSED_SIZE );
     774 [ +  - ][ +  + ]:        655 :     if( i == tagSizes.end() )
     775                 :            :     {
     776                 :        637 :         index = tagSizes.size();
     777         [ +  - ]:        637 :         tagSizes.push_back( size );
     778                 :            :     }
     779                 :            :     else
     780                 :            :     {
     781         [ +  - ]:         18 :         index = i - tagSizes.begin();
     782         [ +  - ]:         18 :         *i    = size;
     783                 :            :     }
     784                 :            : 
     785                 :        655 :     return MB_SUCCESS;
     786                 :            : }
     787                 :            : 
     788                 :        764 : ErrorCode SequenceManager::release_tag_array( Error* /* error_handler */, int index, bool release_id )
     789                 :            : {
     790 [ +  - ][ -  + ]:        764 :     if( (unsigned)index >= tagSizes.size() || UNUSED_SIZE == tagSizes[index] )
                 [ -  + ]
     791                 :            :     {
     792                 :            :         // MB_TAG_NOT_FOUND could be a non-error condition, do not call MB_SET_ERR on it
     793                 :            : #if 0
     794                 :            :     fprintf(stderr, "[Warning]: Invalid dense tag index: %d\n", index);
     795                 :            : #endif
     796                 :          0 :         return MB_TAG_NOT_FOUND;
     797                 :            :     }
     798                 :            : 
     799 [ +  - ][ +  + ]:       9932 :     for( EntityType t = MBVERTEX; t <= MBENTITYSET; ++t )
     800                 :            :     {
     801         [ +  - ]:       9168 :         TypeSequenceManager& seqs = entity_map( t );
     802 [ +  - ][ +  - ]:      20452 :         for( TypeSequenceManager::iterator i = seqs.begin(); i != seqs.end(); ++i )
         [ +  - ][ +  - ]
                 [ +  + ]
     803 [ +  - ][ +  - ]:      11284 :             ( *i )->data()->release_tag_data( index, tagSizes[index] );
         [ +  - ][ +  - ]
     804                 :            :     }
     805                 :            : 
     806         [ +  + ]:        764 :     if( release_id ) tagSizes[index] = UNUSED_SIZE;
     807                 :            : 
     808                 :        764 :     return MB_SUCCESS;
     809                 :            : }
     810                 :            : 
     811                 :            : // These are meant to be called from the debugger (not declared in any header)
     812                 :            : // so leave them out of release builds (-DNDEBUG).
     813                 :            : #ifndef NDEBUG
     814                 :            : 
     815                 :          0 : std::ostream& operator<<( std::ostream& s, const TypeSequenceManager& seq_man )
     816                 :            : {
     817                 :          0 :     const SequenceData* prev_data = 0;
     818 [ #  # ][ #  # ]:          0 :     for( TypeSequenceManager::const_iterator i = seq_man.begin(); i != seq_man.end(); ++i )
         [ #  # ][ #  # ]
                 [ #  # ]
     819                 :            :     {
     820         [ #  # ]:          0 :         const EntitySequence* seq = *i;
     821 [ #  # ][ #  # ]:          0 :         if( seq->data() != prev_data )
     822                 :            :         {
     823         [ #  # ]:          0 :             prev_data = seq->data();
     824 [ #  # ][ #  # ]:          0 :             s << "SequenceData [" << ID_FROM_HANDLE( seq->data()->start_handle() ) << ","
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     825 [ #  # ][ #  # ]:          0 :               << ID_FROM_HANDLE( seq->data()->end_handle() ) << "]" << std::endl;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     826                 :            :         }
     827 [ #  # ][ #  # ]:          0 :         s << "  Sequence [" << ID_FROM_HANDLE( seq->start_handle() ) << "," << ID_FROM_HANDLE( seq->end_handle() )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     828 [ #  # ][ #  # ]:          0 :           << "]" << std::endl;
     829                 :            :     }
     830                 :            : 
     831                 :          0 :     return s;
     832                 :            : }
     833                 :            : 
     834                 :          0 : std::ostream& operator<<( std::ostream& s, const SequenceManager& seq_man )
     835                 :            : {
     836 [ #  # ][ #  # ]:          0 :     for( EntityType t = MBVERTEX; t < MBMAXTYPE; ++t )
     837                 :            :     {
     838 [ #  # ][ #  # ]:          0 :         if( !seq_man.entity_map( t ).empty() )
                 [ #  # ]
     839         [ #  # ]:          0 :             s << std::endl
     840 [ #  # ][ #  # ]:          0 :               << "****************** " << CN::EntityTypeName( t ) << " ******************" << std::endl
         [ #  # ][ #  # ]
                 [ #  # ]
     841 [ #  # ][ #  # ]:          0 :               << seq_man.entity_map( t ) << std::endl;
                 [ #  # ]
     842                 :            :     }
     843                 :            : 
     844                 :          0 :     return s;
     845                 :            : }
     846                 :            : 
     847                 :          0 : void print_sequences( const SequenceManager& seqman )
     848                 :            : {
     849                 :          0 :     std::cout << seqman << std::endl;
     850                 :          0 : }
     851                 :            : 
     852                 :          0 : void print_sequences( const TypeSequenceManager& seqman )
     853                 :            : {
     854                 :          0 :     std::cout << seqman << std::endl;
     855                 :          0 : }
     856                 :            : 
     857                 :            : #endif
     858                 :            : 
     859 [ +  - ][ +  - ]:        228 : }  // namespace moab

Generated by: LCOV version 1.11