moab
|
00001 #ifndef BIT_TAG_HPP 00002 #define BIT_TAG_HPP 00003 00004 #include "TagInfo.hpp" 00005 #include "Internals.hpp" 00006 #include <algorithm> 00007 #include <vector> 00008 #include <assert.h> 00009 00010 namespace moab { 00011 00012 class BitPage; 00013 00015 class BitTag : public TagInfo 00016 { 00017 private: 00018 00019 BitTag( const char* name, 00020 int size, 00021 const void* default_value ) 00022 : TagInfo( name, size, MB_TYPE_BIT, default_value, default_value ? 1 : 0 ) 00023 {} 00024 00025 public: 00026 00027 static BitTag* create_tag( const char* name, 00028 int size, 00029 const void* default_value = 0 ); 00030 00031 virtual ~BitTag(); 00032 00033 virtual TagType get_storage_type() const; 00034 00035 00049 virtual ErrorCode release_all_data( SequenceManager* seqman, 00050 Error* error_handler, 00051 bool delete_pending ); 00052 00053 00065 virtual 00066 ErrorCode get_data( const SequenceManager* seqman, 00067 Error* error_handler, 00068 const EntityHandle* entities, 00069 size_t num_entities, 00070 void* data ) const; 00071 00082 virtual 00083 ErrorCode get_data( const SequenceManager* seqman, 00084 Error* error_handler, 00085 const Range& entities, 00086 void* data ) const; 00087 00101 virtual 00102 ErrorCode get_data( const SequenceManager* seqman, 00103 Error* error_handler, 00104 const EntityHandle* entities, 00105 size_t num_entities, 00106 const void** data_ptrs, 00107 int* data_lengths ) const ; 00108 00109 00122 virtual 00123 ErrorCode get_data( const SequenceManager* seqman, 00124 Error* error_handler, 00125 const Range& entities, 00126 const void** data_ptrs, 00127 int* data_lengths ) const; 00128 00139 virtual 00140 ErrorCode set_data( SequenceManager* seqman, 00141 Error* error_handler, 00142 const EntityHandle* entities, 00143 size_t num_entities, 00144 const void* data ); 00145 00155 virtual 00156 ErrorCode set_data( SequenceManager* seqman, 00157 Error* error_handler, 00158 const Range& entities, 00159 const void* data ); 00160 00175 virtual 00176 ErrorCode set_data( SequenceManager* seqman, 00177 Error* error_handler, 00178 const EntityHandle* entities, 00179 size_t num_entities, 00180 void const* const* data_ptrs, 00181 const int* data_lengths ); 00182 00183 00197 virtual 00198 ErrorCode set_data( SequenceManager* seqman, 00199 Error* error_handler, 00200 const Range& entities, 00201 void const* const* data_ptrs, 00202 const int* data_lengths ); 00203 00217 virtual 00218 ErrorCode clear_data( SequenceManager* seqman, 00219 Error* error_handler, 00220 const EntityHandle* entities, 00221 size_t num_entities, 00222 const void* value_ptr, 00223 int value_len = 0 ); 00224 00237 virtual 00238 ErrorCode clear_data( SequenceManager* seqman, 00239 Error* error_handler, 00240 const Range& entities, 00241 const void* value_ptr, 00242 int value_len = 0 ); 00243 00252 virtual ErrorCode remove_data( SequenceManager* seqman, 00253 Error* error_handler, 00254 const EntityHandle* entities, 00255 size_t num_entities ); 00256 00264 virtual ErrorCode remove_data( SequenceManager* seqman, 00265 Error* error_handler, 00266 const Range& entities ); 00267 00290 virtual 00291 ErrorCode tag_iterate( SequenceManager* seqman, 00292 Error* error_handler, 00293 Range::iterator& iter, 00294 const Range::iterator& end, 00295 void*& data_ptr, 00296 bool allocate = true); 00297 00311 virtual 00312 ErrorCode get_tagged_entities( const SequenceManager* seqman, 00313 Range& output_entities, 00314 EntityType type = MBMAXTYPE, 00315 const Range* intersect = 0 ) const; 00316 00330 virtual 00331 ErrorCode num_tagged_entities( const SequenceManager* seqman, 00332 size_t& output_count, 00333 EntityType type = MBMAXTYPE, 00334 const Range* intersect = 0 ) const; 00335 00349 virtual 00350 ErrorCode find_entities_with_value( const SequenceManager* seqman, 00351 Error* error_handler, 00352 Range& output_entities, 00353 const void* value, 00354 int value_bytes = 0, 00355 EntityType type = MBMAXTYPE, 00356 const Range* intersect_entities = 0 ) const; 00357 00359 virtual bool is_tagged( const SequenceManager*, EntityHandle h ) const; 00360 00364 ErrorCode get_memory_use( const SequenceManager* seqman, 00365 unsigned long& total, 00366 unsigned long& per_entity ) const; 00367 00369 ErrorCode get_entities_with_bits( EntityType type, 00370 Range& entities, 00371 unsigned char bits ) const; 00372 00374 ErrorCode get_entities_with_bits( const Range &range, 00375 EntityType type, 00376 Range& entities, 00377 unsigned char bits ) const; 00378 00379 enum { Ln2PageSize = 12, 00380 PageSize = (1u << Ln2PageSize) 00381 }; 00382 00383 private: 00384 00385 BitTag( const BitTag& ); 00386 BitTag& operator=( const BitTag& ); 00387 ErrorCode reserve( unsigned bits ); 00388 00389 inline unsigned char default_val() const { 00390 if (get_default_value()) 00391 return *reinterpret_cast<const unsigned char*>(get_default_value()); 00392 else 00393 return 0; 00394 } 00395 00396 std::vector<BitPage*> pageList[MBMAXTYPE]; 00397 unsigned int requestedBitsPerEntity; 00398 unsigned int storedBitsPerEntity; 00399 unsigned int pageShift; 00400 00407 void unpack( EntityHandle h, EntityType& type, size_t& page, int& offset ) const 00408 { 00409 type = TYPE_FROM_HANDLE(h); 00410 h = ID_FROM_HANDLE(h); 00411 page = ((size_t)h) >> pageShift; // h / ents_per_page() 00412 offset = h & ((1u<<pageShift)-1u); // h % ends_per_page() 00413 } 00414 00416 int ents_per_page() const { return 8*PageSize/storedBitsPerEntity; } 00417 00418 template <class Container> inline 00419 void get_tagged( EntityType type, 00420 Container& entities ) const; 00421 template <class Container> inline 00422 void get_tagged( Range::const_iterator begin, 00423 Range::const_iterator end, 00424 Container& entities ) const; 00425 template <class Container> inline 00426 void get_tagged( Container& entities, 00427 EntityType type, 00428 const Range* intersect ) const; 00429 }; 00430 00431 } // namespace moab 00432 00433 #endif