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