Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
DenseTag.hpp
Go to the documentation of this file.
1 /** \file DenseTag.hpp
2  * \author Jason Kraftcheck
3  * \date 2010-12-14
4  */
5 
6 #ifndef DENSE_TAG_HPP
7 #define DENSE_TAG_HPP
8 
9 #include "TagInfo.hpp"
10 
11 namespace moab
12 {
13 
14 class EntitySequence;
15 
16 /**\brief Dense storage of fixed-length tag data
17  *
18  * Implement normal dense tag.
19  */
20 class DenseTag : public TagInfo
21 {
22  private:
23  int mySequenceArray; //!< Array index in SequenceManager used to store tag data.
24 
25  unsigned char* meshValue;
26 
27  DenseTag( int array_index, const char* name, int size, DataType type, const void* default_value );
28 
29  public:
30  static DenseTag* create_tag( SequenceManager* seqman,
31  Error* error,
32  const char* name,
33  int bytes,
34  DataType type,
35  const void* default_value );
36 
37  virtual ~DenseTag();
38 
39  virtual TagType get_storage_type() const;
40 
41  /**\brief Remove/clear tag data for all entities
42  *
43  * Remove tag values from entities.
44  *
45  *\param delete_pending If true, then release any global
46  * data associated with the tag in preparation for deleting
47  * the tag itself.
48  *
49  *\Note Invalidates tag if \c tag_delete_pending is true. The only
50  * valid method that can be invoked that is is the destructor.
51  *
52  *\param seqman Pointer to mesh entity database
53  */
54  virtual ErrorCode release_all_data( SequenceManager* seqman, Error* error_handler, bool delete_pending );
55 
56  /**\brief Get tag value for passed entities
57  *
58  * Get tag values for specified entities.
59  *
60  *\Note Will fail for variable-length data.
61  *\param seqman Pointer to mesh entity database
62  *\param entities Entity handles for which to retrieve tag data
63  *\param num_entities Length of \c entities array
64  *\param data Pointer to memory in which to store consecutive tag values,
65  * one for each passed entity.
66  */
67  virtual ErrorCode get_data( const SequenceManager* seqman,
68  Error* error_handler,
69  const EntityHandle* entities,
70  size_t num_entities,
71  void* data ) const;
72 
73  /**\brief Get tag value for passed entities
74  *
75  * Get tag values for specified entities.
76  *
77  *\Note Will fail for variable-length data.
78  *\param seqman Pointer to mesh entity database
79  *\param entities Entity handles for which to retrieve tag data
80  *\param data Pointer to memory in which to store consecutive tag values,
81  * one for each passed entity.
82  */
83  virtual ErrorCode get_data( const SequenceManager* seqman,
84  Error* error_handler,
85  const Range& entities,
86  void* data ) const;
87 
88  /**\brief Get tag value for passed entities
89  *
90  * Get tag values for specified entities.
91  *
92  *\param seqman Pointer to mesh entity database
93  *\param entities Entity handles for which to retrieve tag data
94  *\param num_entities Length of \c entities array
95  *\param data_ptrs Array of pointers to tag values, one pointer
96  * for each passed entity.
97  *\param data_lengths One value for each entity specifying the
98  * length of the tag value for the corresponding
99  * entity.
100  */
101  virtual ErrorCode get_data( const SequenceManager* seqman,
102  Error* error_handler,
103  const EntityHandle* entities,
104  size_t num_entities,
105  const void** data_ptrs,
106  int* data_lengths ) const;
107 
108  /**\brief Get tag value for passed entities
109  *
110  * Get tag values for specified entities.
111  *
112  *\param seqman Pointer to mesh entity database
113  *\param entities Entity handles for which to retrieve tag data
114  *\param data_ptrs Array of pointers to tag values, one pointer
115  * for each passed entity.
116  *\param data_lengths One value for each entity specifying the
117  * length of the tag value for the corresponding
118  * entity.
119  */
120  virtual ErrorCode get_data( const SequenceManager* seqman,
121  Error* error_handler,
122  const Range& entities,
123  const void** data_ptrs,
124  int* data_lengths ) const;
125 
126  /**\brief Set tag value for passed entities
127  *
128  * Store tag data or update stored tag values
129  *\Note Will fail for variable-length data.
130  *\param seqman Pointer to mesh entity database
131  *\param entities Entity handles for which to store tag data
132  *\param num_entities Length of \c entities array
133  *\param data Pointer to memory holding consecutive tag values,
134  * one for each passed entity.
135  */
136  virtual ErrorCode set_data( SequenceManager* seqman,
137  Error* error_handler,
138  const EntityHandle* entities,
139  size_t num_entities,
140  const void* data );
141 
142  /**\brief Set tag value for passed entities
143  *
144  * Store tag data or update stored tag values
145  *\Note Will fail for variable-length data.
146  *\param seqman Pointer to mesh entity database
147  *\param entities Entity handles for which to store tag data
148  *\param data Pointer to memory holding consecutive tag values,
149  * one for each passed entity.
150  */
151  virtual ErrorCode set_data( SequenceManager* seqman,
152  Error* error_handler,
153  const Range& entities,
154  const void* data );
155 
156  /**\brief Set tag value for passed entities
157  *
158  * Store tag data or update stored tag values
159  *
160  *\param seqman Pointer to mesh entity database
161  *\param entities Entity handles for which to store tag data
162  *\param num_entities Length of \c entities array
163  *\param data_ptrs Array of pointers to tag values, one pointer
164  * for each passed entity.
165  *\param data_lengths One value for each entity specifying the
166  * length of the tag value for the corresponding
167  * entity. Array is required for variable-length
168  * tags and is ignored for fixed-length tags.
169  */
170  virtual ErrorCode set_data( SequenceManager* seqman,
171  Error* error_handler,
172  const EntityHandle* entities,
173  size_t num_entities,
174  void const* const* data_ptrs,
175  const int* data_lengths );
176 
177  /**\brief Set tag value for passed entities
178  *
179  * Store tag data or update stored tag values
180  *
181  *\param seqman Pointer to mesh entity database
182  *\param entities Entity handles for which to store tag data
183  *\param data_ptrs Array of pointers to tag values, one pointer
184  * for each passed entity.
185  *\param data_lengths One value for each entity specifying the
186  * length of the tag value for the corresponding
187  * entity. Array is required for variable-length
188  * tags and is ignored for fixed-length tags.
189  */
190  virtual ErrorCode set_data( SequenceManager* seqman,
191  Error* error_handler,
192  const Range& entities,
193  void const* const* data_ptrs,
194  const int* data_lengths );
195 
196  /**\brief Set tag value for passed entities
197  *
198  * Store tag data or update stored tag values.
199  *
200  *\param seqman Pointer to mesh entity database
201  *\param entities Entity handles for which to store tag data
202  *\param num_entities Length of \c entities array
203  *\param value_ptr Pointer to a single tag value which is to be
204  * stored for each of the passed entities.
205  *\param value_len Length of tag value in bytes. Ignored for
206  * fixed-length tags. Required for variable-
207  * length tags.
208  */
209  virtual ErrorCode clear_data( SequenceManager* seqman,
210  Error* error_handler,
211  const EntityHandle* entities,
212  size_t num_entities,
213  const void* value_ptr,
214  int value_len = 0 );
215 
216  /**\brief Set tag value for passed entities
217  *
218  * Store tag data or update stored tag values.
219  *
220  *\param seqman Pointer to mesh entity database
221  *\param entities Entity handles for which to store tag data
222  *\param value_ptr Pointer to a single tag value which is to be
223  * stored for each of the passed entities.
224  *\param value_len Length of tag value in bytes. Ignored for
225  * fixed-length tags. Required for variable-
226  * length tags.
227  */
228  virtual ErrorCode clear_data( SequenceManager* seqman,
229  Error* error_handler,
230  const Range& entities,
231  const void* value_ptr,
232  int value_len = 0 );
233 
234  /**\brief Remove/clear tag data for entities
235  *
236  * Remove tag values from entities.
237  *
238  *\param seqman Pointer to mesh entity database
239  *\param entities Entity handles for which to store tag data
240  *\param num_entities Length of \c entities array
241  */
242  virtual ErrorCode remove_data( SequenceManager* seqman,
243  Error* error_handler,
244  const EntityHandle* entities,
245  size_t num_entities );
246 
247  /**\brief Remove/clear tag data for entities
248  *
249  * Remove tag values from entities.
250  *
251  *\param seqman Pointer to mesh entity database
252  *\param entities Entity handles for which to store tag data
253  */
254  virtual ErrorCode remove_data( SequenceManager* seqman, Error* error_handler, const Range& entities );
255 
256  /**\brief Access tag data via direct pointer into contiguous blocks
257  *
258  * Iteratively obtain direct access to contiguous blocks of tag
259  * storage. This function cannot be used with bit tags because
260  * of the compressed bit storage. This function cannot be used
261  * with variable length tags because it does not provide a mechanism
262  * to determine the length of the value for each entity. This
263  * function may be used with sparse tags, but if it is used, it
264  * will return data for a single entity at a time.
265  *
266  *\param iter As input, the first entity for which to return
267  * data. As output, one past the last entity for
268  * which data was returned.
269  *\param end One past the last entity for which data is desired
270  *\param data_ptr Output: pointer to tag storage.
271  *
272  *\Note If this function is called for entities for which no tag value
273  * has been set, but for which a default value exists, it will
274  * force the allocation of explicit storage for each such entity
275  * even though MOAB would normally not explicitly store tag values
276  * for such entities.
277  */
278  virtual ErrorCode tag_iterate( SequenceManager* seqman,
279  Error* error_handler,
280  Range::iterator& iter,
281  const Range::iterator& end,
282  void*& data_ptr,
283  bool allocate = true );
284 
285  /**\brief Get all tagged entities
286  *
287  * Get the list of entities for which the a tag value has been set,
288  * or a close approximation if the tag storage scheme cannot
289  * accurately determine exactly which entities have explicit values.
290  *
291  *\param seqman Pointer to entity storage database
292  *\param output_entities Results *appended* to this range
293  *\param type Optional entity type. If specified, search is
294  * limited to entities of specified type.
295  *\param intersect Optional intersect list. If specified,
296  * search is restricted to entities in this list.
297  */
298  virtual ErrorCode get_tagged_entities( const SequenceManager* seqman,
299  Range& output_entities,
300  EntityType type = MBMAXTYPE,
301  const Range* intersect = 0 ) const;
302 
303  /**\brief Count all tagged entities
304  *
305  * Count the entities for which the a tag value has been set,
306  * or a close approximation if the tag storage scheme cannot
307  * accurately determine exactly which entities have explicit values.
308  *
309  *\param seqman Pointer to entity storage database
310  *\param output_count This is *incremented* for each detected entity.
311  *\param type Optional entity type. If specified, search is
312  * limited to entities of specified type.
313  *\param intersect Optional intersect list. If specified,
314  * search is restricted to entities in this list.
315  */
316  virtual ErrorCode num_tagged_entities( const SequenceManager* seqman,
317  size_t& output_count,
318  EntityType type = MBMAXTYPE,
319  const Range* intersect = 0 ) const;
320 
321  /**\brief Get all tagged entities with tag value
322  *
323  * Get the list of entities which have the specified tag value.
324  *
325  *\param seqman Pointer to entity storage database
326  *\param output_entities Results *appended* to this range
327  *\param value Pointer to tag value
328  *\param value_bytes Size of tag value in bytes.
329  *\param type Optional entity type. If specified, search is
330  * limited to entities of specified type.
331  *\param intersect_entities Optional intersect list. If specified,
332  * search is restricted to entities in this list.
333  */
334  virtual ErrorCode find_entities_with_value( const SequenceManager* seqman,
335  Error* error_handler,
336  Range& output_entities,
337  const void* value,
338  int value_bytes = 0,
339  EntityType type = MBMAXTYPE,
340  const Range* intersect_entities = 0 ) const;
341 
342  /**\brief Check if entity is tagged */
343  virtual bool is_tagged( const SequenceManager*, EntityHandle h ) const;
344 
345  /**\brief Get memory use for tag data.
346  *
347  */
348  virtual ErrorCode get_memory_use( const SequenceManager* seqman,
349  unsigned long& total,
350  unsigned long& per_entity ) const;
351 
352  /**\brief Get read-only tag storage
353  *
354  *\param seqman Sequence manager
355  *\param error Error object through which to report errors
356  *\param h First entity for which to return storage.
357  *\param ptr Pointer to dag storage. This pointer will be set
358  * to null and \c MB_SUCCESS will be returned if the handle
359  * is valid but no tag storage has been allocated.
360  *\param count Number of consecutive entities for which tag storage
361  * is returned. This value will be valid even if null
362  * is returned for \c ptr and indicates the number of
363  * consecutive entities for which no tag storage has been
364  * allocated.
365  *\return MB_SUCCESS if handle is valid (regardless of whether
366  * or not any tag storage is allocated).
367  */
368  ErrorCode get_array( const SequenceManager* seqman,
369  Error* error,
370  EntityHandle h,
371  const unsigned char* const& ptr,
372  size_t& count ) const;
373 
374  /**\brief Get read-only tag storage for entire sequence
375  *
376  *\param seq Sequence
377  *\param ptr Pointer to dag storage. This pointer will be set
378  * to null and \c MB_SUCCESS will be returned if no tag storage has been
379  *allocated. \return MB_SUCCESS if sequence is valid (regardless of whether or not any
380  *tag storage is allocated).
381  */
382  ErrorCode get_array( const EntitySequence* seq, const unsigned char* const& ptr ) const;
383 
384  private:
385  DenseTag( const DenseTag& );
387 
388  /**\brief Get or allocated tag storage
389  *
390  *\param h First entity for which to return storage.
391  *\param ptr Pointer to dag storage. This pointer will be set
392  * to null and \c MB_SUCCESS will be returned if the handle
393  * is valid but no tag storage has been allocated.
394  *\param count Number of consecutive entities for which tag storage
395  * is returned. This value will be valid even if null
396  * is returned for \c ptr and indicates the number of
397  * consecutive entities for which no tag storage has been
398  * allocated.
399  *\param allocate If true storage will be allocated and initialized
400  * if it has not already been allocated.
401  *\return MB_SUCCESS if handle is valid (regardless of whether
402  * or not any tag storage is allocated).
403  */
405  Error* error,
406  EntityHandle h,
407  unsigned char*& ptr,
408  size_t& count,
409  bool allocate );
410 
411  /**\brief Get tag storage
412  *
413  *\param h First entity for which to return storage.
414  *\param ptr Pointer to dag storage. This pointer will be set
415  * to null and \c MB_SUCCESS will be returned if the handle
416  * is valid but no tag storage has been allocated.
417  *\param count Number of consecutive entities for which tag storage
418  * is returned. This value will be valid even if null
419  * is returned for \c ptr and indicates the number of
420  * consecutive entities for which no tag storage has been
421  * allocated.
422  *\return MB_SUCCESS if handle is valid (regardless of whether
423  * or not any tag storage is allocated).
424  */
425  inline ErrorCode get_array_private( const SequenceManager* seqman,
426  Error* error,
427  EntityHandle h,
428  const unsigned char*& ptr,
429  size_t& count ) const;
430 
431  /**\brief Get non-read-only tag storage for entire sequence
432  *
433  *\param seq Sequence
434  *\param ptr Pointer to dag storage. This pointer will be set
435  * to null and \c MB_SUCCESS will be returned if no tag storage has been
436  *allocated. \return MB_SUCCESS if sequence is valid (regardless of whether or not any
437  *tag storage is allocated).
438  */
439  ErrorCode get_array_private( const EntitySequence* seq, const unsigned char*& ptr ) const;
440 
441  /**\brief Common implementation of public clear_data and remove_data */
442  ErrorCode clear_data( bool allocate,
443  SequenceManager* seqman,
444  Error* error,
445  const EntityHandle* entities,
446  size_t num_entities,
447  const void* value_ptr );
448 
449  /**\brief Common implementation of public clear_data and remove_data */
450  ErrorCode clear_data( bool allocate,
451  SequenceManager* seqman,
452  Error* error,
453  const Range& entities,
454  const void* value_ptr );
455 };
456 
457 } // namespace moab
458 
459 #endif // DENSE_TAG_HPP