Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef SEQUENCE_DATA_HPP 00002 #define SEQUENCE_DATA_HPP 00003 00004 #include "TypeSequenceManager.hpp" 00005 00006 #include <vector> 00007 #include <cstdlib> 00008 #include <cstring> 00009 00010 namespace moab 00011 { 00012 00013 class SequenceData 00014 { 00015 public: 00016 typedef std::vector< EntityHandle >* AdjacencyDataType; 00017 00018 /**\param num_sequence_arrays Number of data arrays needed by the EntitySequence 00019 * \param start First handle in this SequenceData 00020 * \param end Last handle in this SequenceData 00021 */ 00022 inline SequenceData( int num_sequence_arrays, EntityHandle start, EntityHandle end ); 00023 00024 virtual ~SequenceData(); 00025 00026 /**\return first handle in this sequence data */ 00027 EntityHandle start_handle() const 00028 { 00029 return startHandle; 00030 } 00031 00032 /**\return last handle in this sequence data */ 00033 EntityHandle end_handle() const 00034 { 00035 return endHandle; 00036 } 00037 00038 EntityID size() const 00039 { 00040 return endHandle + 1 - startHandle; 00041 } 00042 00043 /**\return ith array of EnitySequence-specific data */ 00044 void* get_sequence_data( int array_num ) 00045 { 00046 return arraySet[-1 - array_num]; 00047 } 00048 /**\return ith array of EnitySequence-specific data */ 00049 void const* get_sequence_data( int array_num ) const 00050 { 00051 return arraySet[-1 - array_num]; 00052 } 00053 00054 /**\return array of adjacency data, or NULL if none. */ 00055 AdjacencyDataType* get_adjacency_data() 00056 { 00057 return reinterpret_cast< AdjacencyDataType* >( arraySet[0] ); 00058 } 00059 /**\return array of adjacency data, or NULL if none. */ 00060 AdjacencyDataType const* get_adjacency_data() const 00061 { 00062 return reinterpret_cast< AdjacencyDataType const* >( arraySet[0] ); 00063 } 00064 00065 /**\return array of dense tag data, or NULL if none. */ 00066 void* get_tag_data( unsigned tag_num ) 00067 { 00068 return tag_num < numTagData ? arraySet[tag_num + 1] : 0; 00069 } 00070 /**\return array of dense tag data, or NULL if none. */ 00071 void const* get_tag_data( unsigned tag_num ) const 00072 { 00073 return tag_num < numTagData ? arraySet[tag_num + 1] : 0; 00074 } 00075 00076 /**\brief Allocate array of sequence-specific data 00077 * 00078 * Allocate an array of EntitySequence-specific data. 00079 *\param array_num Index for which to allocate array. 00080 * Must be in [0,num_sequence_arrays], where 00081 * num_sequence_arrays is constructor argument. 00082 *\param bytes_per_ent Bytes to allocate for each entity. 00083 *\param initial_val Value to initialize array with. If non-null, must 00084 * be bytes_per_ent long. If NULL, array will be zeroed. 00085 *\return The newly allocated array, or NULL if error. 00086 */ 00087 void* create_sequence_data( int array_num, int bytes_per_ent, const void* initial_val = 0 ); 00088 00089 /**\brief Allocate array of sequence-specific data 00090 * 00091 * Allocate an array of EntitySequence-specific data. 00092 *\param array_num Index for which to allocate array. 00093 * Must be in [0,num_sequence_arrays], where 00094 * num_sequence_arrays is constructor argument. 00095 *\return The newly allocated array, or NULL if error. 00096 */ 00097 void* create_custom_data( int array_num, size_t total_bytes ); 00098 00099 /**\brief Allocate array for storing adjacency data. 00100 * 00101 * Allocate array for storing adjacency data. 00102 *\return The newly allocated array, or NULL if already allocated. 00103 */ 00104 AdjacencyDataType* allocate_adjacency_data(); 00105 00106 /**\brief Allocate array of dense tag data 00107 * 00108 * Allocate an array of dense tag data. 00109 *\param index Dense tag ID for which to allocate array. 00110 *\param bytes_per_ent Bytes to allocate for each entity. 00111 *\return The newly allocated array, or NULL if error. 00112 */ 00113 void* allocate_tag_array( int index, int bytes_per_ent, const void* default_value = 0 ); 00114 00115 /**\brief Create new SequenceData that is a copy of a subset of this one 00116 * 00117 * Create a new SequenceData that is a copy of a subset of this one. 00118 * This function is intended for use in subdividing a SequenceData 00119 * for operations such as changing the number of nodes in a block of 00120 * elements. 00121 *\param start First handle for resulting subset 00122 *\param end Last handle for resulting subset 00123 *\param sequence_data_sizes Bytes-per-entity for sequence-specific data. 00124 *\NOTE Does not copy tag data. 00125 */ 00126 SequenceData* subset( EntityHandle start, EntityHandle end, const int* sequence_data_sizes ) const; 00127 00128 /**\brief SequenceManager data */ 00129 TypeSequenceManager::SequenceDataPtr seqManData; 00130 00131 /**\brief Move tag data for a subset of this sequences to specified sequence */ 00132 void move_tag_data( SequenceData* destination, const int* tag_sizes, int num_tag_sizes ); 00133 00134 /**\brief Free all tag data arrays */ 00135 void release_tag_data( const int* tag_sizes, int num_tag_sizes ); 00136 /**\brief Free specified tag data array */ 00137 void release_tag_data( int index, int tag_size ); 00138 00139 protected: 00140 SequenceData( const SequenceData* subset_from, 00141 EntityHandle start, 00142 EntityHandle end, 00143 const int* sequence_data_sizes ); 00144 00145 private: 00146 void increase_tag_count( unsigned by_this_many ); 00147 00148 void* create_data( int index, int bytes_per_ent, const void* initial_val = 0 ); 00149 void copy_data_subset( int index, int size_per_ent, const void* source, size_t offset, size_t count ); 00150 00151 const int numSequenceData; 00152 unsigned numTagData; 00153 void** arraySet; 00154 EntityHandle startHandle, endHandle; 00155 }; 00156 00157 inline SequenceData::SequenceData( int num_sequence_arrays, EntityHandle start, EntityHandle end ) 00158 : numSequenceData( num_sequence_arrays ), numTagData( 0 ), startHandle( start ), endHandle( end ) 00159 { 00160 const size_t sz = sizeof( void* ) * ( num_sequence_arrays + 1 ); 00161 void** data = (void**)malloc( sz ); 00162 memset( data, 0, sz ); 00163 arraySet = data + num_sequence_arrays; 00164 } 00165 00166 } // namespace moab 00167 00168 #endif