moab
|
00001 00006 #include "moab/Interface.hpp" 00007 #include "MeshTag.hpp" 00008 #include "SysUtil.hpp" 00009 #include "moab/Error.hpp" 00010 #include "moab/CN.hpp" 00011 #include "Internals.hpp" 00012 00013 namespace moab { 00014 00015 00016 static ErrorCode not_root_set( Error* error, std::string name, EntityHandle h ) 00017 { 00018 error->set_last_error( "Cannot get/set mesh/global tag %s on non-root-set %s %lu", 00019 name.c_str(), 00020 CN::EntityTypeName(TYPE_FROM_HANDLE(h)), 00021 (unsigned long)ID_FROM_HANDLE(h) ); 00022 return MB_VARIABLE_DATA_LENGTH; 00023 } 00024 00025 00026 static inline bool all_root_set( Error* error, std::string name, const EntityHandle* array, size_t len ) 00027 { 00028 for (size_t i = 0; i < len; ++i) 00029 if (array[i]) { 00030 not_root_set( error, name, array[i] ); 00031 return false; 00032 } 00033 return true; 00034 } 00035 00036 static ErrorCode not_found( Error* error, std::string name ) 00037 { 00038 error->set_last_error( "No mesh tag %s value for global/mesh tag", name.c_str()); 00039 return MB_TAG_NOT_FOUND; 00040 } 00041 00042 static ErrorCode var_len( Error* error, std::string name ) 00043 { 00044 error->set_last_error( "No length specified for variable-length tag %s value", name.c_str()); 00045 return MB_VARIABLE_DATA_LENGTH; 00046 } 00047 00048 00049 MeshTag::MeshTag( const char * name, 00050 int size, 00051 DataType type, 00052 const void * default_value, 00053 int default_value_size) 00054 : TagInfo( name, size, type, default_value, default_value_size ) 00055 {} 00056 00057 MeshTag::~MeshTag() {} 00058 00059 TagType MeshTag::get_storage_type() const 00060 { return MB_TAG_MESH; } 00061 00062 ErrorCode MeshTag::release_all_data( SequenceManager*, Error*, bool ) 00063 { return MB_SUCCESS; } 00064 00065 ErrorCode MeshTag::get_data( const SequenceManager*, 00066 Error* error, 00067 const EntityHandle* entities, 00068 size_t num_entities, 00069 void* data ) const 00070 { 00071 if (!all_root_set( error, get_name(), entities, num_entities )) 00072 return MB_TAG_NOT_FOUND; 00073 00074 const void* ptr; 00075 int len; 00076 00077 if (!mValue.empty()) { 00078 ptr = &mValue[0]; 00079 len = mValue.size(); 00080 } 00081 else if (get_default_value()) { 00082 ptr = get_default_value(); 00083 len = get_default_value_size(); 00084 } 00085 else { 00086 return not_found(error, get_name()); 00087 } 00088 00089 SysUtil::setmem( data, ptr, len, num_entities ); 00090 return MB_SUCCESS; 00091 } 00092 00093 00094 ErrorCode MeshTag::get_data( const SequenceManager*, 00095 Error* error, 00096 const Range& r, 00097 void* ) const 00098 { 00099 if (variable_length()) 00100 return var_len(error, get_name()); 00101 else if (r.empty()) 00102 return MB_SUCCESS; 00103 else 00104 return not_root_set( error, get_name(), r.front() ); 00105 } 00106 00107 ErrorCode MeshTag::get_data( const SequenceManager*, 00108 Error* error, 00109 const EntityHandle* entities, 00110 size_t num_entities, 00111 const void** data_ptrs, 00112 int* data_lengths ) const 00113 { 00114 const void* ptr; 00115 int len; 00116 00117 if (!mValue.empty()) { 00118 ptr = &mValue[0]; 00119 len = mValue.size(); 00120 } 00121 else if (get_default_value()) { 00122 ptr = get_default_value(); 00123 len = get_default_value_size(); 00124 } 00125 else { 00126 return not_found( error, get_name() ); 00127 } 00128 00129 for (size_t i = 0; i < num_entities; ++i) { 00130 if (entities[i]) return not_root_set(error,get_name(), entities[i]); // not root set 00131 data_ptrs[i] = ptr; 00132 if (data_lengths) 00133 data_lengths[i] = len; 00134 } 00135 return MB_SUCCESS; 00136 } 00137 00138 00139 ErrorCode MeshTag::get_data( const SequenceManager*, 00140 Error* error, 00141 const Range& range, 00142 const void**, 00143 int* ) const 00144 { 00145 if (range.empty()) 00146 return MB_SUCCESS; 00147 else 00148 return not_root_set( error, get_name(), range.front() ); 00149 } 00150 00151 ErrorCode MeshTag::set_data( SequenceManager*, 00152 Error* error, 00153 const EntityHandle* entities, 00154 size_t num_entities, 00155 const void* data ) 00156 { 00157 if (variable_length()) 00158 return var_len(error, get_name());; 00159 if (!all_root_set( error, get_name(), entities, num_entities )) 00160 return MB_TAG_NOT_FOUND; 00161 00162 if (num_entities > 0) { 00163 mValue.resize( get_size() ); 00164 const unsigned char* bytes = reinterpret_cast<const unsigned char*>(data); 00165 memcpy( &mValue[0], bytes + get_size() * (num_entities - 1), get_size() ); 00166 } 00167 return MB_SUCCESS; 00168 } 00169 00170 ErrorCode MeshTag::set_data( SequenceManager*, 00171 Error* error, 00172 const Range& range, 00173 const void* ) 00174 { 00175 if (variable_length()) 00176 return var_len(error, get_name()); 00177 else if (range.empty()) 00178 return MB_SUCCESS; 00179 else 00180 return not_root_set( error, get_name(), range.front() ); 00181 } 00182 00183 ErrorCode MeshTag::set_data( SequenceManager*, 00184 Error* error, 00185 const EntityHandle* entities, 00186 size_t num_entities, 00187 void const* const* data_ptrs, 00188 const int* data_lengths ) 00189 { 00190 if (!all_root_set( error, get_name(), entities, num_entities )) 00191 return MB_TAG_NOT_FOUND; 00192 00193 ErrorCode valid = validate_lengths( error, data_lengths, num_entities ); 00194 if (MB_SUCCESS != valid) 00195 return valid; 00196 00197 if (num_entities > 0) { 00198 mValue.resize( data_lengths[num_entities-1] ); 00199 memcpy( &mValue[0], data_ptrs[num_entities-1], mValue.size() ); 00200 } 00201 return MB_SUCCESS; 00202 } 00203 00204 00205 ErrorCode MeshTag::set_data( SequenceManager*, 00206 Error* error, 00207 const Range& range, 00208 void const* const*, 00209 const int* ) 00210 { 00211 if (range.empty()) 00212 return MB_SUCCESS; 00213 else 00214 return not_root_set( error, get_name(), range.front() ); 00215 } 00216 00217 ErrorCode MeshTag::clear_data( SequenceManager*, 00218 Error* error, 00219 const EntityHandle* entities, 00220 size_t num_entities, 00221 const void* value_ptr, 00222 int value_len ) 00223 { 00224 if (!all_root_set( error, get_name(), entities, num_entities )) 00225 return MB_TAG_NOT_FOUND; 00226 00227 ErrorCode valid = validate_lengths( error, value_len ? &value_len : 0, 1 ); 00228 if (MB_SUCCESS != valid) 00229 return valid; 00230 00231 if (num_entities > 0) { 00232 mValue.resize( value_len ); 00233 memcpy( &mValue[0], value_ptr, value_len ); 00234 } 00235 00236 return MB_SUCCESS; 00237 } 00238 00239 ErrorCode MeshTag::clear_data( SequenceManager*, 00240 Error* error, 00241 const Range& range, 00242 const void*, 00243 int ) 00244 { 00245 if (range.empty()) 00246 return MB_SUCCESS; 00247 else 00248 return not_root_set( error, get_name(), range.front() ); 00249 } 00250 00251 ErrorCode MeshTag::remove_data( SequenceManager*, 00252 Error* error, 00253 const EntityHandle* entities, 00254 size_t num_entities ) 00255 { 00256 if (!all_root_set( error, get_name(), entities, num_entities )) 00257 return MB_TAG_NOT_FOUND; 00258 00259 if (num_entities) 00260 mValue.clear();; 00261 return MB_SUCCESS; 00262 } 00263 00264 ErrorCode MeshTag::remove_data( SequenceManager*, 00265 Error* error, 00266 const Range& range ) 00267 { 00268 if (range.empty()) 00269 return MB_SUCCESS; 00270 else 00271 return not_root_set( error, get_name(), range.front() ); 00272 } 00273 00274 ErrorCode MeshTag::tag_iterate( SequenceManager*, 00275 Error* error, 00276 Range::iterator& beg, 00277 const Range::iterator& end, 00278 void*&, 00279 bool) 00280 { 00281 if (beg == end) 00282 return MB_SUCCESS; 00283 else 00284 return not_root_set( error, get_name(), *beg ); 00285 } 00286 00287 ErrorCode MeshTag::get_tagged_entities( const SequenceManager*, 00288 Range&, 00289 EntityType, 00290 const Range* ) const 00291 { 00292 return MB_SUCCESS; 00293 } 00294 00295 ErrorCode MeshTag::num_tagged_entities( const SequenceManager*, 00296 size_t&, 00297 EntityType, 00298 const Range* ) const 00299 { 00300 return MB_SUCCESS; 00301 } 00302 00303 ErrorCode MeshTag::find_entities_with_value( const SequenceManager*, 00304 Error*, 00305 Range&, 00306 const void*, 00307 int, 00308 EntityType, 00309 const Range* ) const 00310 { 00311 return MB_SUCCESS; 00312 } 00313 00314 bool MeshTag::is_tagged( const SequenceManager*, EntityHandle h ) const 00315 { return !h && !mValue.empty(); } 00316 00317 ErrorCode MeshTag::get_memory_use( const SequenceManager*, 00318 unsigned long& total, 00319 unsigned long& per_entity ) const 00320 { 00321 total = TagInfo::get_memory_use() + sizeof(*this) + mValue.size(); 00322 per_entity = 0; 00323 return MB_SUCCESS; 00324 } 00325 00326 00327 } // namespace moab