moab
MeshTag.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines