![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "TagInfo.hpp"
00002 #include "moab/Error.hpp"
00003 #include "moab/ErrorHandler.hpp"
00004 #include /* memcpy */
00005 #include /* realloc & free */
00006 #include
00007
00008 namespace moab
00009 {
00010
00011 TagInfo::TagInfo( const char* name, int size, DataType type, const void* default_value, int default_value_size )
00012 : mDefaultValue( NULL ), mMeshValue( NULL ), mDefaultValueSize( default_value_size ), mMeshValueSize( 0 ),
00013 mDataSize( size ), dataType( type )
00014 {
00015 if( default_value )
00016 {
00017 mDefaultValue = malloc( mDefaultValueSize );
00018 memcpy( mDefaultValue, default_value, mDefaultValueSize );
00019 }
00020 if( name ) mTagName = name;
00021 }
00022
00023 TagInfo::~TagInfo()
00024 {
00025 free( mDefaultValue );
00026 mDefaultValue = 0;
00027 mDefaultValueSize = 0;
00028 }
00029
00030 int TagInfo::size_from_data_type( DataType t )
00031 {
00032 static const int sizes[] = { 1, sizeof( int ), sizeof( double ), 1, sizeof( EntityHandle ), 0 };
00033 return sizes[t];
00034 }
00035
00036 bool TagInfo::equals_default_value( const void* data, int size ) const
00037 {
00038 if( !get_default_value() ) return false;
00039
00040 if( variable_length() && size != get_default_value_size() ) return false;
00041
00042 if( !variable_length() && size >= 0 && size != get_size() ) return false;
00043
00044 if( get_data_type() == MB_TYPE_BIT )
00045 {
00046 assert( get_size() <= 8 && get_default_value_size() == 1 );
00047 unsigned char byte1 = *reinterpret_cast< const unsigned char* >( data );
00048 unsigned char byte2 = *reinterpret_cast< const unsigned char* >( get_default_value() );
00049 unsigned char mask = (unsigned char)( ( 1u << get_size() ) - 1 );
00050 return ( byte1 & mask ) == ( byte2 & mask );
00051 }
00052 else
00053 {
00054 return !memcmp( data, get_default_value(), get_default_value_size() );
00055 }
00056 }
00057
00058 // Check that all lengths are valid multiples of the type size.
00059 // Returns true if all lengths are valid, false otherwise.
00060 bool TagInfo::check_valid_sizes( const int* sizes, int num_sizes ) const
00061 {
00062 const unsigned size = size_from_data_type( get_data_type() );
00063 if( 1 == size ) return true;
00064
00065 unsigned sum = 0;
00066 for( int i = 0; i < num_sizes; ++i )
00067 sum |= ( (unsigned)sizes[i] ) % size;
00068
00069 return ( 0 == sum );
00070 }
00071
00072 ErrorCode TagInfo::validate_lengths( Error* /* error_handler */, const int* lengths, size_t num_lengths ) const
00073 {
00074 int bits = 0;
00075 if( variable_length() )
00076 {
00077 if( !lengths )
00078 {
00079 MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag" );
00080 }
00081 const unsigned type_size = size_from_data_type( get_data_type() );
00082 if( type_size == 1 ) return MB_SUCCESS;
00083 for( size_t i = 0; i < num_lengths; ++i )
00084 bits |= lengths[i] % type_size;
00085 }
00086 else if( lengths )
00087 {
00088 for( size_t i = 0; i < num_lengths; ++i )
00089 bits |= lengths[i] - get_size();
00090 }
00091 if( 0 == bits ) return MB_SUCCESS;
00092
00093 MB_SET_ERR( MB_INVALID_SIZE, "Tag data with invalid size" );
00094 }
00095
00096 } // namespace moab