![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef ENTITY_SEQUENCE_HPP
00002 #define ENTITY_SEQUENCE_HPP
00003
00004 #include "moab/Types.hpp"
00005 #include "Internals.hpp"
00006
00007 namespace moab
00008 {
00009
00010 class SequenceData;
00011
00012 class EntitySequence
00013 {
00014 private:
00015 EntityHandle startHandle, endHandle;
00016 SequenceData* sequenceData;
00017
00018 protected:
00019 EntitySequence( EntityHandle h ) : startHandle( h ), endHandle( h ), sequenceData( NULL ) {}
00020
00021 EntitySequence( EntitySequence& split_from, EntityHandle here )
00022 : startHandle( here ), endHandle( split_from.endHandle ), sequenceData( split_from.sequenceData )
00023 {
00024 split_from.endHandle = here - 1;
00025 }
00026
00027 SequenceData* create_data_subset( EntityHandle start_handle,
00028 EntityHandle end_handle,
00029 int num_sequence_arrays,
00030 unsigned const* bytes_per_element ) const;
00031
00032 ErrorCode prepend_entities( EntityID count );
00033 ErrorCode append_entities( EntityID count );
00034
00035 public:
00036 EntitySequence( EntityHandle start, EntityID count, SequenceData* dat )
00037 : startHandle( start ), endHandle( start + count - 1 ), sequenceData( dat )
00038 {
00039 }
00040
00041 virtual ~EntitySequence() {}
00042
00043 EntityType type() const
00044 {
00045 return TYPE_FROM_HANDLE( start_handle() );
00046 }
00047
00048 EntityHandle start_handle() const
00049 {
00050 return startHandle;
00051 }
00052
00053 EntityHandle end_handle() const
00054 {
00055 return endHandle;
00056 }
00057
00058 SequenceData* data() const
00059 {
00060 return sequenceData;
00061 }
00062
00063 void data( SequenceData* ptr )
00064 {
00065 sequenceData = ptr;
00066 }
00067
00068 EntityID size() const
00069 {
00070 return endHandle - startHandle + 1;
00071 }
00072
00073 /**\brief True if SequenceData has no holes and is used only
00074 * by this EntitySequence */
00075 bool using_entire_data() const;
00076
00077 /**\brief Integer value used in finding appropriate SequenceData
00078 *
00079 * This value is matched to input values by TypeSequenceManager to
00080 * determine if an available, unused portino of a SequenceData can
00081 * be used for a specific entity allocation. For example, it is
00082 * used to find a SequenceData with the appropriate number of vertices
00083 * per element when allocating elements. The default value is zero.
00084 */
00085 virtual int values_per_entity() const;
00086
00087 /**\brief Split this sequence into two consecutive sequences
00088 *
00089 * Split this sequence into two sequences.
00090 *\param here New sequences should be [start_handle(),here) & [here,end_handle()]
00091 *\return New sequence containing [here,end_handle()]
00092 */
00093 virtual EntitySequence* split( EntityHandle here ) = 0;
00094
00095 /**\brief Merge this sequence with another
00096 *
00097 * Combine two adjacent sequences. Sequence handle blocks must be
00098 * consective and sequences must share a common SequenceData.
00099 */
00100 virtual ErrorCode merge( EntitySequence& other );
00101
00102 /**\brief Erase entities in range: (end_handle()-count, end_handle()] */
00103 virtual ErrorCode pop_back( EntityID count );
00104
00105 /**\brief Erase entities in range: [start_handle(), start_handle()+count) */
00106 virtual ErrorCode pop_front( EntityID count );
00107
00108 /**\brief Create a new SequenceData that is a copy of a subset of
00109 * the one referenced by this sequence.
00110 *
00111 * Create a new SequenceData that is a copy of a subset of the
00112 * SequenceData referenced by this EntitySequence. Do not make any
00113 * changes to this EntitySequence or the current SequenceData.
00114 */
00115 virtual SequenceData* create_data_subset( EntityHandle start_handle, EntityHandle end_handle ) const = 0;
00116
00117 /**\brief Get memory characteristcs that are the same for all entities
00118 *
00119 * Get charactersitic constant memory use for all entities in sequence.
00120 *\param bytes_per_entity The total bytes consumed for each entity in
00121 * the underlying SequenceData. It is assumed
00122 * that the same amount of memory is consumed
00123 * for unused portions of the SequenceData.
00124 *\param size_of_sequence The size of the leaf subclass of this class
00125 */
00126 virtual void get_const_memory_use( unsigned long& bytes_per_entity, unsigned long& size_of_sequence ) const = 0;
00127 /**\brief Get portion of memory use that varies per entity
00128 *
00129 *\return Any per-entity memory use not accounted for in the results
00130 * of get_const_memory_use.
00131 */
00132 virtual unsigned long get_per_entity_memory_use( EntityHandle first, EntityHandle last ) const;
00133 };
00134
00135 } // namespace moab
00136
00137 #endif