Go to the documentation of this file. 1 #include "TagInfo.hpp"
2 #include "moab/Error.hpp"
3 #include "moab/ErrorHandler.hpp"
4 #include <cstring>
5 #include <cstdlib>
6 #include <cassert>
7
8 namespace moab
9 {
10
11 TagInfo::TagInfo( const char* name, int size, DataType type, const void* default_value, int default_value_size )
12 : mDefaultValue( NULL ), mMeshValue( NULL ), mDefaultValueSize( default_value_size ), mMeshValueSize( 0 ),
13 mDataSize( size ), dataType( type )
14 {
15 if( default_value )
16 {
17 mDefaultValue = malloc( mDefaultValueSize );
18 memcpy( mDefaultValue, default_value, mDefaultValueSize );
19 }
20 if( name ) mTagName = name;
21 }
22
23 TagInfo::~TagInfo()
24 {
25 free( mDefaultValue );
26 mDefaultValue = 0;
27 mDefaultValueSize = 0;
28 }
29
30 int TagInfo::size_from_data_type( DataType t )
31 {
32 static const int sizes[] = { 1, sizeof( int ), sizeof( double ), 1, sizeof( EntityHandle ), 0 };
33 return sizes[t];
34 }
35
36 bool TagInfo::equals_default_value( const void* data, int size ) const
37 {
38 if( !get_default_value() ) return false;
39
40 if( variable_length() && size != get_default_value_size() ) return false;
41
42 if( !variable_length() && size >= 0 && size != get_size() ) return false;
43
44 if( get_data_type() == MB_TYPE_BIT )
45 {
46 assert( get_size() <= 8 && get_default_value_size() == 1 );
47 unsigned char byte1 = *reinterpret_cast< const unsigned char* >( data );
48 unsigned char byte2 = *reinterpret_cast< const unsigned char* >( get_default_value() );
49 unsigned char mask = (unsigned char)( ( 1u << get_size() ) - 1 );
50 return ( byte1 & mask ) == ( byte2 & mask );
51 }
52 else
53 {
54 return !memcmp( data, get_default_value(), get_default_value_size() );
55 }
56 }
57
58
59
60 bool TagInfo::check_valid_sizes( const int* sizes, int num_sizes ) const
61 {
62 const unsigned size = size_from_data_type( get_data_type() );
63 if( 1 == size ) return true;
64
65 unsigned sum = 0;
66 for( int i = 0; i < num_sizes; ++i )
67 sum |= ( (unsigned)sizes[i] ) % size;
68
69 return ( 0 == sum );
70 }
71
72 ErrorCode TagInfo::validate_lengths( Error* , const int* lengths, size_t num_lengths ) const
73 {
74 int bits = 0;
75 if( variable_length() )
76 {
77 if( !lengths )
78 {
79 MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag" );
80 }
81 const unsigned type_size = size_from_data_type( get_data_type() );
82 if( type_size == 1 ) return MB_SUCCESS;
83 for( size_t i = 0; i < num_lengths; ++i )
84 bits |= lengths[i] % type_size;
85 }
86 else if( lengths )
87 {
88 for( size_t i = 0; i < num_lengths; ++i )
89 bits |= lengths[i] - get_size();
90 }
91 if( 0 == bits ) return MB_SUCCESS;
92
93 MB_SET_ERR( MB_INVALID_SIZE, "Tag data with invalid size" );
94 }
95
96 }