Mesh Oriented datABase  (version 5.5.0)
An array-based unstructured mesh library
SequenceData.hpp
Go to the documentation of this file.
1 #ifndef SEQUENCE_DATA_HPP
2 #define SEQUENCE_DATA_HPP
3 
5 
6 #include <vector>
7 #include <cstdlib>
8 #include <cstring>
9 
10 namespace moab
11 {
12 
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 */
28  {
29  return startHandle;
30  }
31 
32  /**\return last handle in this sequence data */
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. */
56  {
57  return reinterpret_cast< AdjacencyDataType* >( arraySet[0] );
58  }
59  /**\return array of adjacency data, or NULL if none. */
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  */
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 */
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;
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