1 #ifndef ENTITY_SEQUENCE_HPP
2 #define ENTITY_SEQUENCE_HPP
3
4 #include "moab/Types.hpp"
5 #include "Internals.hpp"
6
7 namespace moab
8 {
9
10 class SequenceData;
11
12 class EntitySequence
13 {
14 private:
15 EntityHandle startHandle, endHandle;
16 SequenceData* sequenceData;
17
18 protected:
19 EntitySequence( EntityHandle h ) : startHandle( h ), endHandle( h ), sequenceData( NULL ) {}
20
21 EntitySequence( EntitySequence& split_from, EntityHandle here )
22 : startHandle( here ), endHandle( split_from.endHandle ), sequenceData( split_from.sequenceData )
23 {
24 split_from.endHandle = here - 1;
25 }
26
27 SequenceData* create_data_subset( EntityHandle start_handle,
28 EntityHandle end_handle,
29 int num_sequence_arrays,
30 unsigned const* bytes_per_element ) const;
31
32 ErrorCode prepend_entities( EntityID count );
33 ErrorCode append_entities( EntityID count );
34
35 public:
36 EntitySequence( EntityHandle start, EntityID count, SequenceData* dat )
37 : startHandle( start ), endHandle( start + count - 1 ), sequenceData( dat )
38 {
39 }
40
41 virtual ~EntitySequence() {}
42
43 EntityType type() const
44 {
45 return TYPE_FROM_HANDLE( start_handle() );
46 }
47
48 EntityHandle start_handle() const
49 {
50 return startHandle;
51 }
52
53 EntityHandle end_handle() const
54 {
55 return endHandle;
56 }
57
58 SequenceData* data() const
59 {
60 return sequenceData;
61 }
62
63 void data( SequenceData* ptr )
64 {
65 sequenceData = ptr;
66 }
67
68 EntityID size() const
69 {
70 return endHandle - startHandle + 1;
71 }
72
73 /**\brief True if SequenceData has no holes and is used only
74 * by this EntitySequence */
75 bool using_entire_data() const;
76
77 /**\brief Integer value used in finding appropriate SequenceData
78 *
79 * This value is matched to input values by TypeSequenceManager to
80 * determine if an available, unused portino of a SequenceData can
81 * be used for a specific entity allocation. For example, it is
82 * used to find a SequenceData with the appropriate number of vertices
83 * per element when allocating elements. The default value is zero.
84 */
85 virtual int values_per_entity() const;
86
87 /**\brief Split this sequence into two consecutive sequences
88 *
89 * Split this sequence into two sequences.
90 *\param here New sequences should be [start_handle(),here) & [here,end_handle()]
91 *\return New sequence containing [here,end_handle()]
92 */
93 virtual EntitySequence* split( EntityHandle here ) = 0;
94
95 /**\brief Merge this sequence with another
96 *
97 * Combine two adjacent sequences. Sequence handle blocks must be
98 * consective and sequences must share a common SequenceData.
99 */
100 virtual ErrorCode merge( EntitySequence& other );
101
102 /**\brief Erase entities in range: (end_handle()-count, end_handle()] */
103 virtual ErrorCode pop_back( EntityID count );
104
105 /**\brief Erase entities in range: [start_handle(), start_handle()+count) */
106 virtual ErrorCode pop_front( EntityID count );
107
108 /**\brief Create a new SequenceData that is a copy of a subset of
109 * the one referenced by this sequence.
110 *
111 * Create a new SequenceData that is a copy of a subset of the
112 * SequenceData referenced by this EntitySequence. Do not make any
113 * changes to this EntitySequence or the current SequenceData.
114 */
115 virtual SequenceData* create_data_subset( EntityHandle start_handle, EntityHandle end_handle ) const = 0;
116
117 /**\brief Get memory characteristcs that are the same for all entities
118 *
119 * Get charactersitic constant memory use for all entities in sequence.
120 *\param bytes_per_entity The total bytes consumed for each entity in
121 * the underlying SequenceData. It is assumed
122 * that the same amount of memory is consumed
123 * for unused portions of the SequenceData.
124 *\param size_of_sequence The size of the leaf subclass of this class
125 */
126 virtual void get_const_memory_use( unsigned long& bytes_per_entity, unsigned long& size_of_sequence ) const = 0;
127 /**\brief Get portion of memory use that varies per entity
128 *
129 *\return Any per-entity memory use not accounted for in the results
130 * of get_const_memory_use.
131 */
132 virtual unsigned long get_per_entity_memory_use( EntityHandle first, EntityHandle last ) const;
133 };
134
135 } // namespace moab
136
137 #endif