moab
|
00001 00017 #ifndef VAR_LEN_SPARSE_TAG_HPP 00018 #define VAR_LEN_SPARSE_TAG_HPP 00019 00020 #ifndef IS_BUILDING_MB 00021 #error "VarLenSparseTag.hpp isn't supposed to be included into an application" 00022 #endif 00023 00024 #ifdef WIN32 00025 #pragma warning(disable : 4786) 00026 #endif 00027 00028 00029 #define STRINGIFY_(X) #X 00030 #define STRINGIFY(X) STRINGIFY_(X) 00031 #ifdef HAVE_UNORDERED_MAP 00032 # include STRINGIFY(HAVE_UNORDERED_MAP) 00033 #else 00034 # include <map> 00035 #endif 00036 #include <vector> 00037 00038 #include "TagInfo.hpp" 00039 #include "VarLenTag.hpp" 00040 #include <stdlib.h> 00041 00042 namespace moab { 00043 00045 class VarLenSparseTag : public TagInfo 00046 { 00047 public: 00048 00049 VarLenSparseTag( const char* name, 00050 DataType type, 00051 const void* default_value, 00052 int default_value_bytes ); 00053 00054 ~VarLenSparseTag(); 00055 00056 virtual TagType get_storage_type() const; 00057 00071 virtual ErrorCode release_all_data( SequenceManager* seqman, 00072 Error* error_handler, 00073 bool delete_pending ); 00074 00075 00087 virtual 00088 ErrorCode get_data( const SequenceManager* seqman, 00089 Error* error_handler, 00090 const EntityHandle* entities, 00091 size_t num_entities, 00092 void* data ) const; 00093 00104 virtual 00105 ErrorCode get_data( const SequenceManager* seqman, 00106 Error* error_handler, 00107 const Range& entities, 00108 void* data ) const; 00109 00123 virtual 00124 ErrorCode get_data( const SequenceManager* seqman, 00125 Error* error_handler, 00126 const EntityHandle* entities, 00127 size_t num_entities, 00128 const void** data_ptrs, 00129 int* data_lengths ) const ; 00130 00131 00144 virtual 00145 ErrorCode get_data( const SequenceManager* seqman, 00146 Error* error_handler, 00147 const Range& entities, 00148 const void** data_ptrs, 00149 int* data_lengths ) const; 00150 00161 virtual 00162 ErrorCode set_data( SequenceManager* seqman, 00163 Error* error_handler, 00164 const EntityHandle* entities, 00165 size_t num_entities, 00166 const void* data ); 00167 00177 virtual 00178 ErrorCode set_data( SequenceManager* seqman, 00179 Error* error_handler, 00180 const Range& entities, 00181 const void* data ); 00182 00197 virtual 00198 ErrorCode set_data( SequenceManager* seqman, 00199 Error* error_handler, 00200 const EntityHandle* entities, 00201 size_t num_entities, 00202 void const* const* data_ptrs, 00203 const int* data_lengths ); 00204 00205 00219 virtual 00220 ErrorCode set_data( SequenceManager* seqman, 00221 Error* error_handler, 00222 const Range& entities, 00223 void const* const* data_ptrs, 00224 const int* data_lengths ); 00225 00239 virtual 00240 ErrorCode clear_data( SequenceManager* seqman, 00241 Error* error_handler, 00242 const EntityHandle* entities, 00243 size_t num_entities, 00244 const void* value_ptr, 00245 int value_len = 0 ); 00246 00259 virtual 00260 ErrorCode clear_data( SequenceManager* seqman, 00261 Error* error_handler, 00262 const Range& entities, 00263 const void* value_ptr, 00264 int value_len = 0 ); 00265 00274 virtual ErrorCode remove_data( SequenceManager* seqman, 00275 Error* error_handler, 00276 const EntityHandle* entities, 00277 size_t num_entities ); 00278 00286 virtual ErrorCode remove_data( SequenceManager* seqman, 00287 Error* error_handler, 00288 const Range& entities ); 00289 00312 virtual 00313 ErrorCode tag_iterate( SequenceManager* seqman, 00314 Error* error_handler, 00315 Range::iterator& iter, 00316 const Range::iterator& end, 00317 void*& data_ptr, 00318 bool allocate = true); 00319 00333 virtual 00334 ErrorCode get_tagged_entities( const SequenceManager* seqman, 00335 Range& output_entities, 00336 EntityType type = MBMAXTYPE, 00337 const Range* intersect = 0 ) const; 00338 00352 virtual 00353 ErrorCode num_tagged_entities( const SequenceManager* seqman, 00354 size_t& output_count, 00355 EntityType type = MBMAXTYPE, 00356 const Range* intersect = 0 ) const; 00357 00371 virtual 00372 ErrorCode find_entities_with_value( const SequenceManager* seqman, 00373 Error* error_handler, 00374 Range& output_entities, 00375 const void* value, 00376 int value_bytes = 0, 00377 EntityType type = MBMAXTYPE, 00378 const Range* intersect_entities = 0 ) const; 00379 00381 virtual bool is_tagged( const SequenceManager*, EntityHandle h ) const; 00382 00386 virtual 00387 ErrorCode get_memory_use( const SequenceManager* seqman, 00388 unsigned long& total, 00389 unsigned long& per_entity ) const; 00390 00392 unsigned long get_number_entities() 00393 { return mData.size(); } 00394 00395 00397 #ifdef HAVE_UNORDERED_MAP 00398 typedef UNORDERED_MAP_NS::unordered_map<EntityHandle,VarLenTag> MapType; 00399 #else 00400 typedef std::map<EntityHandle,VarLenTag> MapType; 00401 #endif 00402 00403 private: 00404 00405 VarLenSparseTag( const VarLenSparseTag& ); 00406 VarLenSparseTag& operator=( const VarLenSparseTag& ); 00407 00409 inline 00410 ErrorCode get_data_ptr( Error* error_handler, 00411 EntityHandle entity_handle, 00412 const void*& data, 00413 int& size) const; 00414 00415 MapType mData; 00416 }; 00417 00418 } // namespace moab 00419 00420 #endif // VAR_LEN_SPARSE_TAG_HPP 00421 00422 00423 00424