![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** \file DenseTag.hpp
00002 * \author Jason Kraftcheck
00003 * \date 2010-12-14
00004 */
00005
00006 #ifndef DENSE_TAG_HPP
00007 #define DENSE_TAG_HPP
00008
00009 #include "TagInfo.hpp"
00010
00011 namespace moab
00012 {
00013
00014 class EntitySequence;
00015
00016 /**\brief Dense storage of fixed-length tag data
00017 *
00018 * Implement normal dense tag.
00019 */
00020 class DenseTag : public TagInfo
00021 {
00022 private:
00023 int mySequenceArray; //!< Array index in SequenceManager used to store tag data.
00024
00025 unsigned char* meshValue;
00026
00027 DenseTag( int array_index, const char* name, int size, DataType type, const void* default_value );
00028
00029 public:
00030 static DenseTag* create_tag( SequenceManager* seqman,
00031 Error* error,
00032 const char* name,
00033 int bytes,
00034 DataType type,
00035 const void* default_value );
00036
00037 virtual ~DenseTag();
00038
00039 virtual TagType get_storage_type() const;
00040
00041 /**\brief Remove/clear tag data for all entities
00042 *
00043 * Remove tag values from entities.
00044 *
00045 *\param delete_pending If true, then release any global
00046 * data associated with the tag in preparation for deleting
00047 * the tag itself.
00048 *
00049 *\Note Invalidates tag if \c tag_delete_pending is true. The only
00050 * valid method that can be invoked that is is the destructor.
00051 *
00052 *\param seqman Pointer to mesh entity database
00053 */
00054 virtual ErrorCode release_all_data( SequenceManager* seqman, Error* error_handler, bool delete_pending );
00055
00056 /**\brief Get tag value for passed entities
00057 *
00058 * Get tag values for specified entities.
00059 *
00060 *\Note Will fail for variable-length data.
00061 *\param seqman Pointer to mesh entity database
00062 *\param entities Entity handles for which to retrieve tag data
00063 *\param num_entities Length of \c entities array
00064 *\param data Pointer to memory in which to store consecutive tag values,
00065 * one for each passed entity.
00066 */
00067 virtual ErrorCode get_data( const SequenceManager* seqman,
00068 Error* error_handler,
00069 const EntityHandle* entities,
00070 size_t num_entities,
00071 void* data ) const;
00072
00073 /**\brief Get tag value for passed entities
00074 *
00075 * Get tag values for specified entities.
00076 *
00077 *\Note Will fail for variable-length data.
00078 *\param seqman Pointer to mesh entity database
00079 *\param entities Entity handles for which to retrieve tag data
00080 *\param data Pointer to memory in which to store consecutive tag values,
00081 * one for each passed entity.
00082 */
00083 virtual ErrorCode get_data( const SequenceManager* seqman,
00084 Error* error_handler,
00085 const Range& entities,
00086 void* data ) const;
00087
00088 /**\brief Get tag value for passed entities
00089 *
00090 * Get tag values for specified entities.
00091 *
00092 *\param seqman Pointer to mesh entity database
00093 *\param entities Entity handles for which to retrieve tag data
00094 *\param num_entities Length of \c entities array
00095 *\param data_ptrs Array of pointers to tag values, one pointer
00096 * for each passed entity.
00097 *\param data_lengths One value for each entity specifying the
00098 * length of the tag value for the corresponding
00099 * entity.
00100 */
00101 virtual ErrorCode get_data( const SequenceManager* seqman,
00102 Error* error_handler,
00103 const EntityHandle* entities,
00104 size_t num_entities,
00105 const void** data_ptrs,
00106 int* data_lengths ) const;
00107
00108 /**\brief Get tag value for passed entities
00109 *
00110 * Get tag values for specified entities.
00111 *
00112 *\param seqman Pointer to mesh entity database
00113 *\param entities Entity handles for which to retrieve tag data
00114 *\param data_ptrs Array of pointers to tag values, one pointer
00115 * for each passed entity.
00116 *\param data_lengths One value for each entity specifying the
00117 * length of the tag value for the corresponding
00118 * entity.
00119 */
00120 virtual ErrorCode get_data( const SequenceManager* seqman,
00121 Error* error_handler,
00122 const Range& entities,
00123 const void** data_ptrs,
00124 int* data_lengths ) const;
00125
00126 /**\brief Set tag value for passed entities
00127 *
00128 * Store tag data or update stored tag values
00129 *\Note Will fail for variable-length data.
00130 *\param seqman Pointer to mesh entity database
00131 *\param entities Entity handles for which to store tag data
00132 *\param num_entities Length of \c entities array
00133 *\param data Pointer to memory holding consecutive tag values,
00134 * one for each passed entity.
00135 */
00136 virtual ErrorCode set_data( SequenceManager* seqman,
00137 Error* error_handler,
00138 const EntityHandle* entities,
00139 size_t num_entities,
00140 const void* data );
00141
00142 /**\brief Set tag value for passed entities
00143 *
00144 * Store tag data or update stored tag values
00145 *\Note Will fail for variable-length data.
00146 *\param seqman Pointer to mesh entity database
00147 *\param entities Entity handles for which to store tag data
00148 *\param data Pointer to memory holding consecutive tag values,
00149 * one for each passed entity.
00150 */
00151 virtual ErrorCode set_data( SequenceManager* seqman,
00152 Error* error_handler,
00153 const Range& entities,
00154 const void* data );
00155
00156 /**\brief Set tag value for passed entities
00157 *
00158 * Store tag data or update stored tag values
00159 *
00160 *\param seqman Pointer to mesh entity database
00161 *\param entities Entity handles for which to store tag data
00162 *\param num_entities Length of \c entities array
00163 *\param data_ptrs Array of pointers to tag values, one pointer
00164 * for each passed entity.
00165 *\param data_lengths One value for each entity specifying the
00166 * length of the tag value for the corresponding
00167 * entity. Array is required for variable-length
00168 * tags and is ignored for fixed-length tags.
00169 */
00170 virtual ErrorCode set_data( SequenceManager* seqman,
00171 Error* error_handler,
00172 const EntityHandle* entities,
00173 size_t num_entities,
00174 void const* const* data_ptrs,
00175 const int* data_lengths );
00176
00177 /**\brief Set tag value for passed entities
00178 *
00179 * Store tag data or update stored tag values
00180 *
00181 *\param seqman Pointer to mesh entity database
00182 *\param entities Entity handles for which to store tag data
00183 *\param data_ptrs Array of pointers to tag values, one pointer
00184 * for each passed entity.
00185 *\param data_lengths One value for each entity specifying the
00186 * length of the tag value for the corresponding
00187 * entity. Array is required for variable-length
00188 * tags and is ignored for fixed-length tags.
00189 */
00190 virtual ErrorCode set_data( SequenceManager* seqman,
00191 Error* error_handler,
00192 const Range& entities,
00193 void const* const* data_ptrs,
00194 const int* data_lengths );
00195
00196 /**\brief Set tag value for passed entities
00197 *
00198 * Store tag data or update stored tag values.
00199 *
00200 *\param seqman Pointer to mesh entity database
00201 *\param entities Entity handles for which to store tag data
00202 *\param num_entities Length of \c entities array
00203 *\param value_ptr Pointer to a single tag value which is to be
00204 * stored for each of the passed entities.
00205 *\param value_len Length of tag value in bytes. Ignored for
00206 * fixed-length tags. Required for variable-
00207 * length tags.
00208 */
00209 virtual ErrorCode clear_data( SequenceManager* seqman,
00210 Error* error_handler,
00211 const EntityHandle* entities,
00212 size_t num_entities,
00213 const void* value_ptr,
00214 int value_len = 0 );
00215
00216 /**\brief Set tag value for passed entities
00217 *
00218 * Store tag data or update stored tag values.
00219 *
00220 *\param seqman Pointer to mesh entity database
00221 *\param entities Entity handles for which to store tag data
00222 *\param value_ptr Pointer to a single tag value which is to be
00223 * stored for each of the passed entities.
00224 *\param value_len Length of tag value in bytes. Ignored for
00225 * fixed-length tags. Required for variable-
00226 * length tags.
00227 */
00228 virtual ErrorCode clear_data( SequenceManager* seqman,
00229 Error* error_handler,
00230 const Range& entities,
00231 const void* value_ptr,
00232 int value_len = 0 );
00233
00234 /**\brief Remove/clear tag data for entities
00235 *
00236 * Remove tag values from entities.
00237 *
00238 *\param seqman Pointer to mesh entity database
00239 *\param entities Entity handles for which to store tag data
00240 *\param num_entities Length of \c entities array
00241 */
00242 virtual ErrorCode remove_data( SequenceManager* seqman,
00243 Error* error_handler,
00244 const EntityHandle* entities,
00245 size_t num_entities );
00246
00247 /**\brief Remove/clear tag data for entities
00248 *
00249 * Remove tag values from entities.
00250 *
00251 *\param seqman Pointer to mesh entity database
00252 *\param entities Entity handles for which to store tag data
00253 */
00254 virtual ErrorCode remove_data( SequenceManager* seqman, Error* error_handler, const Range& entities );
00255
00256 /**\brief Access tag data via direct pointer into contiguous blocks
00257 *
00258 * Iteratively obtain direct access to contiguous blocks of tag
00259 * storage. This function cannot be used with bit tags because
00260 * of the compressed bit storage. This function cannot be used
00261 * with variable length tags because it does not provide a mechanism
00262 * to determine the length of the value for each entity. This
00263 * function may be used with sparse tags, but if it is used, it
00264 * will return data for a single entity at a time.
00265 *
00266 *\param iter As input, the first entity for which to return
00267 * data. As output, one past the last entity for
00268 * which data was returned.
00269 *\param end One past the last entity for which data is desired
00270 *\param data_ptr Output: pointer to tag storage.
00271 *
00272 *\Note If this function is called for entities for which no tag value
00273 * has been set, but for which a default value exists, it will
00274 * force the allocation of explicit storage for each such entity
00275 * even though MOAB would normally not explicitly store tag values
00276 * for such entities.
00277 */
00278 virtual ErrorCode tag_iterate( SequenceManager* seqman,
00279 Error* error_handler,
00280 Range::iterator& iter,
00281 const Range::iterator& end,
00282 void*& data_ptr,
00283 bool allocate = true );
00284
00285 /**\brief Get all tagged entities
00286 *
00287 * Get the list of entities for which the a tag value has been set,
00288 * or a close approximation if the tag storage scheme cannot
00289 * accurately determine exactly which entities have explicit values.
00290 *
00291 *\param seqman Pointer to entity storage database
00292 *\param output_entities Results *appended* to this range
00293 *\param type Optional entity type. If specified, search is
00294 * limited to entities of specified type.
00295 *\param intersect Optional intersect list. If specified,
00296 * search is restricted to entities in this list.
00297 */
00298 virtual ErrorCode get_tagged_entities( const SequenceManager* seqman,
00299 Range& output_entities,
00300 EntityType type = MBMAXTYPE,
00301 const Range* intersect = 0 ) const;
00302
00303 /**\brief Count all tagged entities
00304 *
00305 * Count the entities for which the a tag value has been set,
00306 * or a close approximation if the tag storage scheme cannot
00307 * accurately determine exactly which entities have explicit values.
00308 *
00309 *\param seqman Pointer to entity storage database
00310 *\param output_count This is *incremented* for each detected entity.
00311 *\param type Optional entity type. If specified, search is
00312 * limited to entities of specified type.
00313 *\param intersect Optional intersect list. If specified,
00314 * search is restricted to entities in this list.
00315 */
00316 virtual ErrorCode num_tagged_entities( const SequenceManager* seqman,
00317 size_t& output_count,
00318 EntityType type = MBMAXTYPE,
00319 const Range* intersect = 0 ) const;
00320
00321 /**\brief Get all tagged entities with tag value
00322 *
00323 * Get the list of entities which have the specified tag value.
00324 *
00325 *\param seqman Pointer to entity storage database
00326 *\param output_entities Results *appended* to this range
00327 *\param value Pointer to tag value
00328 *\param value_bytes Size of tag value in bytes.
00329 *\param type Optional entity type. If specified, search is
00330 * limited to entities of specified type.
00331 *\param intersect_entities Optional intersect list. If specified,
00332 * search is restricted to entities in this list.
00333 */
00334 virtual ErrorCode find_entities_with_value( const SequenceManager* seqman,
00335 Error* error_handler,
00336 Range& output_entities,
00337 const void* value,
00338 int value_bytes = 0,
00339 EntityType type = MBMAXTYPE,
00340 const Range* intersect_entities = 0 ) const;
00341
00342 /**\brief Check if entity is tagged */
00343 virtual bool is_tagged( const SequenceManager*, EntityHandle h ) const;
00344
00345 /**\brief Get memory use for tag data.
00346 *
00347 */
00348 virtual ErrorCode get_memory_use( const SequenceManager* seqman,
00349 unsigned long& total,
00350 unsigned long& per_entity ) const;
00351
00352 /**\brief Get read-only tag storage
00353 *
00354 *\param seqman Sequence manager
00355 *\param error Error object through which to report errors
00356 *\param h First entity for which to return storage.
00357 *\param ptr Pointer to dag storage. This pointer will be set
00358 * to null and \c MB_SUCCESS will be returned if the handle
00359 * is valid but no tag storage has been allocated.
00360 *\param count Number of consecutive entities for which tag storage
00361 * is returned. This value will be valid even if null
00362 * is returned for \c ptr and indicates the number of
00363 * consecutive entities for which no tag storage has been
00364 * allocated.
00365 *\return MB_SUCCESS if handle is valid (regardless of whether
00366 * or not any tag storage is allocated).
00367 */
00368 ErrorCode get_array( const SequenceManager* seqman,
00369 Error* error,
00370 EntityHandle h,
00371 const unsigned char* const& ptr,
00372 size_t& count ) const;
00373
00374 /**\brief Get read-only tag storage for entire sequence
00375 *
00376 *\param seq Sequence
00377 *\param ptr Pointer to dag storage. This pointer will be set
00378 * to null and \c MB_SUCCESS will be returned if no tag storage has been
00379 *allocated. \return MB_SUCCESS if sequence is valid (regardless of whether or not any
00380 *tag storage is allocated).
00381 */
00382 ErrorCode get_array( const EntitySequence* seq, const unsigned char* const& ptr ) const;
00383
00384 private:
00385 DenseTag( const DenseTag& );
00386 DenseTag& operator=( const DenseTag& );
00387
00388 /**\brief Get or allocated tag storage
00389 *
00390 *\param h First entity for which to return storage.
00391 *\param ptr Pointer to dag storage. This pointer will be set
00392 * to null and \c MB_SUCCESS will be returned if the handle
00393 * is valid but no tag storage has been allocated.
00394 *\param count Number of consecutive entities for which tag storage
00395 * is returned. This value will be valid even if null
00396 * is returned for \c ptr and indicates the number of
00397 * consecutive entities for which no tag storage has been
00398 * allocated.
00399 *\param allocate If true storage will be allocated and initialized
00400 * if it has not already been allocated.
00401 *\return MB_SUCCESS if handle is valid (regardless of whether
00402 * or not any tag storage is allocated).
00403 */
00404 inline ErrorCode get_array_private( SequenceManager* seqman,
00405 Error* error,
00406 EntityHandle h,
00407 unsigned char*& ptr,
00408 size_t& count,
00409 bool allocate );
00410
00411 /**\brief Get tag storage
00412 *
00413 *\param h First entity for which to return storage.
00414 *\param ptr Pointer to dag storage. This pointer will be set
00415 * to null and \c MB_SUCCESS will be returned if the handle
00416 * is valid but no tag storage has been allocated.
00417 *\param count Number of consecutive entities for which tag storage
00418 * is returned. This value will be valid even if null
00419 * is returned for \c ptr and indicates the number of
00420 * consecutive entities for which no tag storage has been
00421 * allocated.
00422 *\return MB_SUCCESS if handle is valid (regardless of whether
00423 * or not any tag storage is allocated).
00424 */
00425 inline ErrorCode get_array_private( const SequenceManager* seqman,
00426 Error* error,
00427 EntityHandle h,
00428 const unsigned char*& ptr,
00429 size_t& count ) const;
00430
00431 /**\brief Get non-read-only tag storage for entire sequence
00432 *
00433 *\param seq Sequence
00434 *\param ptr Pointer to dag storage. This pointer will be set
00435 * to null and \c MB_SUCCESS will be returned if no tag storage has been
00436 *allocated. \return MB_SUCCESS if sequence is valid (regardless of whether or not any
00437 *tag storage is allocated).
00438 */
00439 ErrorCode get_array_private( const EntitySequence* seq, const unsigned char*& ptr ) const;
00440
00441 /**\brief Common implementation of public clear_data and remove_data */
00442 ErrorCode clear_data( bool allocate,
00443 SequenceManager* seqman,
00444 Error* error,
00445 const EntityHandle* entities,
00446 size_t num_entities,
00447 const void* value_ptr );
00448
00449 /**\brief Common implementation of public clear_data and remove_data */
00450 ErrorCode clear_data( bool allocate,
00451 SequenceManager* seqman,
00452 Error* error,
00453 const Range& entities,
00454 const void* value_ptr );
00455 };
00456
00457 } // namespace moab
00458
00459 #endif // DENSE_TAG_HPP