Loading [MathJax]/extensions/tex2jax.js
Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SequenceData.hpp
Go to the documentation of this file.
1 #ifndef SEQUENCE_DATA_HPP 2 #define SEQUENCE_DATA_HPP 3  4 #include "TypeSequenceManager.hpp" 5  6 #include <vector> 7 #include <cstdlib> 8 #include <cstring> 9  10 namespace moab 11 { 12  13 class SequenceData 14 { 15  public: 16  typedef std::vector< EntityHandle >* AdjacencyDataType; 17  18  /**\param num_sequence_arrays Number of data arrays needed by the EntitySequence 19  * \param start First handle in this SequenceData 20  * \param end Last handle in this SequenceData 21  */ 22  inline SequenceData( int num_sequence_arrays, EntityHandle start, EntityHandle end ); 23  24  virtual ~SequenceData(); 25  26  /**\return first handle in this sequence data */ 27  EntityHandle start_handle() const 28  { 29  return startHandle; 30  } 31  32  /**\return last handle in this sequence data */ 33  EntityHandle end_handle() const 34  { 35  return endHandle; 36  } 37  38  EntityID size() const 39  { 40  return endHandle + 1 - startHandle; 41  } 42  43  /**\return ith array of EnitySequence-specific data */ 44  void* get_sequence_data( int array_num ) 45  { 46  return arraySet[-1 - array_num]; 47  } 48  /**\return ith array of EnitySequence-specific data */ 49  void const* get_sequence_data( int array_num ) const 50  { 51  return arraySet[-1 - array_num]; 52  } 53  54  /**\return array of adjacency data, or NULL if none. */ 55  AdjacencyDataType* get_adjacency_data() 56  { 57  return reinterpret_cast< AdjacencyDataType* >( arraySet[0] ); 58  } 59  /**\return array of adjacency data, or NULL if none. */ 60  AdjacencyDataType const* get_adjacency_data() const 61  { 62  return reinterpret_cast< AdjacencyDataType const* >( arraySet[0] ); 63  } 64  65  /**\return array of dense tag data, or NULL if none. */ 66  void* get_tag_data( unsigned tag_num ) 67  { 68  return tag_num < numTagData ? arraySet[tag_num + 1] : 0; 69  } 70  /**\return array of dense tag data, or NULL if none. */ 71  void const* get_tag_data( unsigned tag_num ) const 72  { 73  return tag_num < numTagData ? arraySet[tag_num + 1] : 0; 74  } 75  76  /**\brief Allocate array of sequence-specific data 77  * 78  * Allocate an array of EntitySequence-specific data. 79  *\param array_num Index for which to allocate array. 80  * Must be in [0,num_sequence_arrays], where 81  * num_sequence_arrays is constructor argument. 82  *\param bytes_per_ent Bytes to allocate for each entity. 83  *\param initial_val Value to initialize array with. If non-null, must 84  * be bytes_per_ent long. If NULL, array will be zeroed. 85  *\return The newly allocated array, or NULL if error. 86  */ 87  void* create_sequence_data( int array_num, int bytes_per_ent, const void* initial_val = 0 ); 88  89  /**\brief Allocate array of sequence-specific data 90  * 91  * Allocate an array of EntitySequence-specific data. 92  *\param array_num Index for which to allocate array. 93  * Must be in [0,num_sequence_arrays], where 94  * num_sequence_arrays is constructor argument. 95  *\return The newly allocated array, or NULL if error. 96  */ 97  void* create_custom_data( int array_num, size_t total_bytes ); 98  99  /**\brief Allocate array for storing adjacency data. 100  * 101  * Allocate array for storing adjacency data. 102  *\return The newly allocated array, or NULL if already allocated. 103  */ 104  AdjacencyDataType* allocate_adjacency_data(); 105  106  /**\brief Allocate array of dense tag data 107  * 108  * Allocate an array of dense tag data. 109  *\param index Dense tag ID for which to allocate array. 110  *\param bytes_per_ent Bytes to allocate for each entity. 111  *\return The newly allocated array, or NULL if error. 112  */ 113  void* allocate_tag_array( int index, int bytes_per_ent, const void* default_value = 0 ); 114  115  /**\brief Create new SequenceData that is a copy of a subset of this one 116  * 117  * Create a new SequenceData that is a copy of a subset of this one. 118  * This function is intended for use in subdividing a SequenceData 119  * for operations such as changing the number of nodes in a block of 120  * elements. 121  *\param start First handle for resulting subset 122  *\param end Last handle for resulting subset 123  *\param sequence_data_sizes Bytes-per-entity for sequence-specific data. 124  *\NOTE Does not copy tag data. 125  */ 126  SequenceData* subset( EntityHandle start, EntityHandle end, const int* sequence_data_sizes ) const; 127  128  /**\brief SequenceManager data */ 129  TypeSequenceManager::SequenceDataPtr seqManData; 130  131  /**\brief Move tag data for a subset of this sequences to specified sequence */ 132  void move_tag_data( SequenceData* destination, const int* tag_sizes, int num_tag_sizes ); 133  134  /**\brief Free all tag data arrays */ 135  void release_tag_data( const int* tag_sizes, int num_tag_sizes ); 136  /**\brief Free specified tag data array */ 137  void release_tag_data( int index, int tag_size ); 138  139  protected: 140  SequenceData( const SequenceData* subset_from, 141  EntityHandle start, 142  EntityHandle end, 143  const int* sequence_data_sizes ); 144  145  private: 146  void increase_tag_count( unsigned by_this_many ); 147  148  void* create_data( int index, int bytes_per_ent, const void* initial_val = 0 ); 149  void copy_data_subset( int index, int size_per_ent, const void* source, size_t offset, size_t count ); 150  151  const int numSequenceData; 152  unsigned numTagData; 153  void** arraySet; 154  EntityHandle startHandle, endHandle; 155 }; 156  157 inline SequenceData::SequenceData( int num_sequence_arrays, EntityHandle start, EntityHandle end ) 158  : numSequenceData( num_sequence_arrays ), numTagData( 0 ), startHandle( start ), endHandle( end ) 159 { 160  const size_t sz = sizeof( void* ) * ( num_sequence_arrays + 1 ); 161  void** data = (void**)malloc( sz ); 162  memset( data, 0, sz ); 163  arraySet = data + num_sequence_arrays; 164 } 165  166 } // namespace moab 167  168 #endif