LCOV - code coverage report
Current view: top level - src - MeshTag.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 47 114 41.2 %
Date: 2020-12-16 07:07:30 Functions: 11 27 40.7 %
Branches: 22 126 17.5 %

           Branch data     Line data    Source code
       1                 :            : /** \file   MeshTag.cpp
       2                 :            :  *  \author Jason Kraftcheck
       3                 :            :  *  \date   2010-12-14
       4                 :            :  */
       5                 :            : 
       6                 :            : #include "moab/Interface.hpp"
       7                 :            : #include "MeshTag.hpp"
       8                 :            : #include "SysUtil.hpp"
       9                 :            : #include "moab/Error.hpp"
      10                 :            : #include "moab/CN.hpp"
      11                 :            : #include "Internals.hpp"
      12                 :            : 
      13                 :            : namespace moab
      14                 :            : {
      15                 :            : 
      16                 :          0 : inline static ErrorCode not_root_set( const std::string& /*name*/, EntityHandle /*h*/ )
      17                 :            : {
      18                 :            :     // MB_TAG_NOT_FOUND could be a non-error condition, do not call MB_SET_ERR on it
      19                 :            :     // Print warning messages for debugging only
      20                 :            : #if 0
      21                 :            :   MB_SET_ERR(MB_VARIABLE_DATA_LENGTH, "Cannot get/set mesh/global tag " << name << " on non-root-set " << CN::EntityTypeName(TYPE_FROM_HANDLE(h)) << " " << (unsigned long)ID_FROM_HANDLE(h));
      22                 :            : #endif
      23                 :            : 
      24                 :          0 :     return MB_TAG_NOT_FOUND;
      25                 :            : }
      26                 :            : 
      27                 :          6 : inline static bool all_root_set( std::string name, const EntityHandle* array, size_t len )
      28                 :            : {
      29         [ +  + ]:         12 :     for( size_t i = 0; i < len; ++i )
      30                 :            :     {
      31         [ -  + ]:          6 :         if( array[i] )
      32                 :            :         {
      33                 :          0 :             not_root_set( name, array[i] );
      34                 :          0 :             return false;
      35                 :            :         }
      36                 :            :     }
      37                 :            : 
      38                 :          6 :     return true;
      39                 :            : }
      40                 :            : 
      41                 :          0 : inline static ErrorCode not_found( const std::string& /*name*/ )
      42                 :            : {
      43                 :            :     // MB_TAG_NOT_FOUND could be a non-error condition, do not call MB_SET_ERR on it
      44                 :            : #if 0
      45                 :            :   fprintf(stderr, "[Warning]: No mesh tag %s value for global/mesh tag\n", name.c_str());
      46                 :            : #endif
      47                 :            : 
      48                 :          0 :     return MB_TAG_NOT_FOUND;
      49                 :            : }
      50                 :            : 
      51                 :          5 : MeshTag::MeshTag( const char* name, int size, DataType type, const void* default_value, int default_value_size )
      52         [ +  - ]:          5 :     : TagInfo( name, size, type, default_value, default_value_size )
      53                 :            : {
      54                 :          5 : }
      55                 :            : 
      56         [ -  + ]:         20 : MeshTag::~MeshTag() {}
      57                 :            : 
      58                 :          9 : TagType MeshTag::get_storage_type() const
      59                 :            : {
      60                 :          9 :     return MB_TAG_MESH;
      61                 :            : }
      62                 :            : 
      63                 :          5 : ErrorCode MeshTag::release_all_data( SequenceManager*, Error*, bool )
      64                 :            : {
      65                 :          5 :     return MB_SUCCESS;
      66                 :            : }
      67                 :            : 
      68                 :          2 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const EntityHandle* entities,
      69                 :            :                              size_t num_entities, void* data ) const
      70                 :            : {
      71         [ -  + ]:          2 :     if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
      72                 :            : 
      73                 :            :     const void* ptr;
      74                 :            :     int len;
      75                 :            : 
      76         [ +  + ]:          2 :     if( !mValue.empty() )
      77                 :            :     {
      78                 :          1 :         ptr = &mValue[0];
      79                 :          1 :         len = mValue.size();
      80                 :            :     }
      81         [ +  - ]:          1 :     else if( get_default_value() )
      82                 :            :     {
      83                 :          1 :         ptr = get_default_value();
      84                 :          1 :         len = get_default_value_size();
      85                 :            :     }
      86                 :            :     else
      87                 :            :     {
      88                 :          0 :         return not_found( get_name() );
      89                 :            :     }
      90                 :            : 
      91                 :          2 :     SysUtil::setmem( data, ptr, len, num_entities );
      92                 :          2 :     return MB_SUCCESS;
      93                 :            : }
      94                 :            : 
      95                 :          0 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const Range& r, void* ) const
      96                 :            : {
      97         [ #  # ]:          0 :     if( variable_length() )
      98                 :            :     {
      99 [ #  # ][ #  # ]:          0 :         MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No length specified for variable-length tag " << get_name() << " value" );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     100                 :            :     }
     101         [ #  # ]:          0 :     else if( r.empty() )
     102                 :          0 :         return MB_SUCCESS;
     103                 :            :     else
     104                 :          0 :         return not_root_set( get_name(), r.front() );
     105                 :            : }
     106                 :            : 
     107                 :          2 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const EntityHandle* entities,
     108                 :            :                              size_t num_entities, const void** data_ptrs, int* data_lengths ) const
     109                 :            : {
     110                 :            :     const void* ptr;
     111                 :            :     int len;
     112                 :            : 
     113         [ +  - ]:          2 :     if( !mValue.empty() )
     114                 :            :     {
     115                 :          2 :         ptr = &mValue[0];
     116                 :          2 :         len = mValue.size();
     117                 :            :     }
     118         [ #  # ]:          0 :     else if( get_default_value() )
     119                 :            :     {
     120                 :          0 :         ptr = get_default_value();
     121                 :          0 :         len = get_default_value_size();
     122                 :            :     }
     123                 :            :     else
     124                 :            :     {
     125                 :          0 :         return not_found( get_name() );
     126                 :            :     }
     127                 :            : 
     128         [ +  + ]:          4 :     for( size_t i = 0; i < num_entities; ++i )
     129                 :            :     {
     130         [ -  + ]:          2 :         if( entities[i] ) return not_root_set( get_name(), entities[i] );  // Not root set
     131                 :          2 :         data_ptrs[i] = ptr;
     132         [ +  - ]:          2 :         if( data_lengths ) data_lengths[i] = len;
     133                 :            :     }
     134                 :            : 
     135                 :          2 :     return MB_SUCCESS;
     136                 :            : }
     137                 :            : 
     138                 :          0 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const Range& range, const void**, int* ) const
     139                 :            : {
     140         [ #  # ]:          0 :     if( range.empty() )
     141                 :          0 :         return MB_SUCCESS;
     142                 :            :     else
     143                 :          0 :         return not_root_set( get_name(), range.front() );
     144                 :            : }
     145                 :            : 
     146                 :          2 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const EntityHandle* entities, size_t num_entities,
     147                 :            :                              const void* data )
     148                 :            : {
     149         [ -  + ]:          2 :     if( variable_length() )
     150                 :            :     {
     151 [ #  # ][ #  # ]:          0 :         MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No length specified for variable-length tag " << get_name() << " value" );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     152                 :            :     }
     153         [ -  + ]:          2 :     if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
     154                 :            : 
     155         [ +  - ]:          2 :     if( num_entities > 0 )
     156                 :            :     {
     157                 :          2 :         mValue.resize( get_size() );
     158                 :          2 :         const unsigned char* bytes = reinterpret_cast< const unsigned char* >( data );
     159                 :          2 :         memcpy( &mValue[0], bytes + get_size() * ( num_entities - 1 ), get_size() );
     160                 :            :     }
     161                 :            : 
     162                 :          2 :     return MB_SUCCESS;
     163                 :            : }
     164                 :            : 
     165                 :          0 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const Range& range, const void* )
     166                 :            : {
     167         [ #  # ]:          0 :     if( variable_length() )
     168                 :            :     {
     169 [ #  # ][ #  # ]:          0 :         MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No length specified for variable-length tag " << get_name() << " value" );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     170                 :            :     }
     171         [ #  # ]:          0 :     else if( range.empty() )
     172                 :          0 :         return MB_SUCCESS;
     173                 :            :     else
     174                 :          0 :         return not_root_set( get_name(), range.front() );
     175                 :            : }
     176                 :            : 
     177                 :          2 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const EntityHandle* entities, size_t num_entities,
     178                 :            :                              void const* const* data_ptrs, const int* data_lengths )
     179                 :            : {
     180         [ -  + ]:          2 :     if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
     181                 :            : 
     182 [ -  + ][ #  # ]:          2 :     ErrorCode valid = validate_lengths( NULL, data_lengths, num_entities );MB_CHK_ERR( valid );
     183                 :            : 
     184         [ +  - ]:          2 :     if( num_entities > 0 )
     185                 :            :     {
     186                 :          2 :         mValue.resize( data_lengths[num_entities - 1] );
     187                 :          2 :         memcpy( &mValue[0], data_ptrs[num_entities - 1], mValue.size() );
     188                 :            :     }
     189                 :            : 
     190                 :          2 :     return MB_SUCCESS;
     191                 :            : }
     192                 :            : 
     193                 :          0 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const Range& range, void const* const*, const int* )
     194                 :            : {
     195         [ #  # ]:          0 :     if( range.empty() )
     196                 :          0 :         return MB_SUCCESS;
     197                 :            :     else
     198                 :          0 :         return not_root_set( get_name(), range.front() );
     199                 :            : }
     200                 :            : 
     201                 :          0 : ErrorCode MeshTag::clear_data( SequenceManager*, Error* /* error */, const EntityHandle* entities, size_t num_entities,
     202                 :            :                                const void* value_ptr, int value_len )
     203                 :            : {
     204         [ #  # ]:          0 :     if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
     205                 :            : 
     206 [ #  # ][ #  # ]:          0 :     ErrorCode valid = validate_lengths( NULL, value_len ? &value_len : 0, 1 );MB_CHK_ERR( valid );
                 [ #  # ]
     207                 :            : 
     208         [ #  # ]:          0 :     if( num_entities > 0 )
     209                 :            :     {
     210                 :          0 :         mValue.resize( value_len );
     211                 :          0 :         memcpy( &mValue[0], value_ptr, value_len );
     212                 :            :     }
     213                 :            : 
     214                 :          0 :     return MB_SUCCESS;
     215                 :            : }
     216                 :            : 
     217                 :          0 : ErrorCode MeshTag::clear_data( SequenceManager*, Error* /* error */, const Range& range, const void*, int )
     218                 :            : {
     219         [ #  # ]:          0 :     if( range.empty() )
     220                 :          0 :         return MB_SUCCESS;
     221                 :            :     else
     222                 :          0 :         return not_root_set( get_name(), range.front() );
     223                 :            : }
     224                 :            : 
     225                 :          0 : ErrorCode MeshTag::remove_data( SequenceManager*, Error* /* error */, const EntityHandle* entities,
     226                 :            :                                 size_t num_entities )
     227                 :            : {
     228         [ #  # ]:          0 :     if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
     229                 :            : 
     230         [ #  # ]:          0 :     if( num_entities ) mValue.clear();
     231                 :            : 
     232                 :          0 :     return MB_SUCCESS;
     233                 :            : }
     234                 :            : 
     235                 :          0 : ErrorCode MeshTag::remove_data( SequenceManager*, Error* /* error */, const Range& range )
     236                 :            : {
     237         [ #  # ]:          0 :     if( range.empty() )
     238                 :          0 :         return MB_SUCCESS;
     239                 :            :     else
     240                 :          0 :         return not_root_set( get_name(), range.front() );
     241                 :            : }
     242                 :            : 
     243                 :          0 : ErrorCode MeshTag::tag_iterate( SequenceManager*, Error* /* error */, Range::iterator& beg, const Range::iterator& end,
     244                 :            :                                 void*&, bool )
     245                 :            : {
     246         [ #  # ]:          0 :     if( beg == end )
     247                 :          0 :         return MB_SUCCESS;
     248                 :            :     else
     249                 :          0 :         return not_root_set( get_name(), *beg );
     250                 :            : }
     251                 :            : 
     252                 :          0 : ErrorCode MeshTag::get_tagged_entities( const SequenceManager*, Range&, EntityType, const Range* ) const
     253                 :            : {
     254                 :          0 :     return MB_SUCCESS;
     255                 :            : }
     256                 :            : 
     257                 :          0 : ErrorCode MeshTag::num_tagged_entities( const SequenceManager*, size_t&, EntityType, const Range* ) const
     258                 :            : {
     259                 :          0 :     return MB_SUCCESS;
     260                 :            : }
     261                 :            : 
     262                 :          0 : ErrorCode MeshTag::find_entities_with_value( const SequenceManager*, Error*, Range&, const void*, int, EntityType,
     263                 :            :                                              const Range* ) const
     264                 :            : {
     265                 :          0 :     return MB_SUCCESS;
     266                 :            : }
     267                 :            : 
     268                 :          0 : bool MeshTag::is_tagged( const SequenceManager*, EntityHandle h ) const
     269                 :            : {
     270 [ #  # ][ #  # ]:          0 :     return ( 0 == h ) && ( !mValue.empty() );
     271                 :            : }
     272                 :            : 
     273                 :          0 : ErrorCode MeshTag::get_memory_use( const SequenceManager*, unsigned long& total, unsigned long& per_entity ) const
     274                 :            : {
     275                 :          0 :     total      = TagInfo::get_memory_use() + sizeof( *this ) + mValue.size();
     276                 :          0 :     per_entity = 0;
     277                 :          0 :     return MB_SUCCESS;
     278                 :            : }
     279                 :            : 
     280 [ +  - ][ +  - ]:        228 : }  // namespace moab

Generated by: LCOV version 1.11