Branch data Line data Source code
1 : : #ifndef MB_SETITERATOR_HPP
2 : : #define MB_SETITERATOR_HPP
3 : :
4 : : #include "moab/Interface.hpp"
5 : :
6 : : namespace moab
7 : : {
8 : :
9 : : class Core;
10 : :
11 : : /** \class Meshset iterator
12 : : * \brief A class to iterator over MOAB Meshsets
13 : : */
14 : : class SetIterator
15 : : {
16 : : public:
17 : : friend class Core;
18 : :
19 : : //! destructor
20 : : virtual ~SetIterator();
21 : :
22 : : //! get the ent set for this iterator
23 : 0 : inline EntityHandle ent_set() const
24 : : {
25 : 0 : return entSet;
26 : : };
27 : :
28 : : //! get the chunk size of this iterator
29 : : inline unsigned int chunk_size() const
30 : : {
31 : : return chunkSize;
32 : : };
33 : :
34 : : //! get the entity type for this iterator
35 : : inline EntityType ent_type() const
36 : : {
37 : : return entType;
38 : : };
39 : :
40 : : //! get the dimension for this iterator
41 : : inline int ent_dimension() const
42 : : {
43 : : return entDimension;
44 : : };
45 : :
46 : : /** \brief get the next chunkSize entities
47 : : * Return the next chunkSize entities.
48 : : * \param arr Array of entities returned.
49 : : * \param atend Returns true if iterator is at the end of iterable values, otherwise false
50 : : */
51 : : virtual ErrorCode get_next_arr( std::vector< EntityHandle >& arr, bool& atend ) = 0;
52 : :
53 : : //! reset the iterator to the beginning of the set
54 : : virtual ErrorCode reset() = 0;
55 : :
56 : : protected:
57 : : /** \brief Constructor
58 : : * \param core MOAB Core instance
59 : : * \param ent_set EntitySet to which this iterator corresponds
60 : : * \param chunk_size Chunk size of this iterator
61 : : * \param ent_type Entity type for this iterator
62 : : * \param ent_dim Entity dimension for this iterator
63 : : */
64 : 48 : inline SetIterator( Core* core, EntityHandle eset, unsigned int chunk_sz, EntityType ent_tp, int ent_dim,
65 : : bool check_valid = false )
66 : : : myCore( core ), entSet( eset ), chunkSize( chunk_sz ), entType( ent_tp ), entDimension( ent_dim ),
67 : 48 : checkValid( check_valid ){};
68 : :
69 : : //! Core instance
70 : : Core* myCore;
71 : :
72 : : //! handle for entity set corresponding to this iterator
73 : : EntityHandle entSet;
74 : :
75 : : //! chunk size of this iterator
76 : : unsigned int chunkSize;
77 : :
78 : : //! entity type this iterator iterates over
79 : : EntityType entType;
80 : :
81 : : //! dimension this iterator iterates over
82 : : int entDimension;
83 : :
84 : : //! check for entity validity before returning handles
85 : : bool checkValid;
86 : : };
87 : :
88 : : /** \class Set-type set iterator
89 : : * \brief A class to iterator over MOAB set-type meshsets
90 : : */
91 : : class RangeSetIterator : public SetIterator
92 : : {
93 : : public:
94 : : friend class Core;
95 : :
96 : : /** \brief Destructor
97 : : */
98 : : virtual ~RangeSetIterator();
99 : :
100 : : /** \brief get the next chunkSize entities
101 : : * Return the next chunkSize entities.
102 : : * \param arr Array of entities returned.
103 : : * \param atend Returns true if iterator is at the end of iterable values, otherwise false
104 : : */
105 : : virtual ErrorCode get_next_arr( std::vector< EntityHandle >& arr, bool& atend );
106 : :
107 : : //! reset the iterator to the beginning of the set
108 : : virtual ErrorCode reset();
109 : :
110 : : protected:
111 : : /** \brief Constructor
112 : : * \param core MOAB Core instance
113 : : * \param ent_set EntitySet to which this iterator corresponds
114 : : * \param chunk_size Chunk size of this iterator
115 : : * \param ent_type Entity type for this iterator
116 : : * \param ent_dim Entity dimension for this iterator
117 : : */
118 : : RangeSetIterator( Core* core, EntityHandle ent_set, int chunk_size, EntityType ent_type, int ent_dimension,
119 : : bool check_valid = false );
120 : :
121 : : private:
122 : : ErrorCode get_next_by_type( const EntityHandle*& ptr, int count, std::vector< EntityHandle >& arr, bool& atend );
123 : :
124 : : ErrorCode get_next_by_dimension( const EntityHandle*& ptr, int count, std::vector< EntityHandle >& arr,
125 : : bool& atend );
126 : :
127 : : //! Build the special pair vector for the root set
128 : : ErrorCode build_pair_vec();
129 : :
130 : : //! Current iterator position, 0 if at beginning
131 : : EntityHandle iterPos;
132 : :
133 : : //! Special range pair ptr for root set
134 : : EntityHandle* pairPtr;
135 : :
136 : : //! Number of range pairs
137 : : int numPairs;
138 : : };
139 : :
140 : : /** \class List-type set iterator
141 : : * \brief A class to iterator over MOAB list-type meshsets
142 : : */
143 [ - + ]: 96 : class VectorSetIterator : public SetIterator
144 : : {
145 : : public:
146 : : friend class Core;
147 : :
148 : : /** \brief get the next chunkSize entities
149 : : * Return the next chunkSize entities.
150 : : * \param arr Array of entities returned.
151 : : * \param atend Returns true if iterator is at the end of iterable values, otherwise false
152 : : */
153 : : virtual ErrorCode get_next_arr( std::vector< EntityHandle >& arr, bool& atend );
154 : :
155 : : //! reset the iterator to the beginning of the set
156 : : virtual ErrorCode reset();
157 : :
158 : : //! decrement the position by the specified number; returns MB_FAILURE if resulting index is < 0
159 : : inline ErrorCode decrement( int num );
160 : :
161 : : protected:
162 : : /** \brief Constructor
163 : : * \param core MOAB Core instance
164 : : * \param ent_set EntitySet to which this iterator corresponds
165 : : * \param chunk_size Chunk size of this iterator
166 : : * \param ent_type Entity type for this iterator
167 : : * \param ent_dim Entity dimension for this iterator
168 : : */
169 : 24 : inline VectorSetIterator( Core* core, EntityHandle eset, int chunk_sz, EntityType ent_tp, int ent_dim,
170 : : bool check_valid = false )
171 : 24 : : SetIterator( core, eset, chunk_sz, ent_tp, ent_dim, check_valid ), iterPos( 0 )
172 : : {
173 : 24 : }
174 : :
175 : : private:
176 : : //! Current iterator position, 0 if at beginning
177 : : int iterPos;
178 : : };
179 : :
180 : : inline ErrorCode VectorSetIterator::decrement( int num )
181 : : {
182 : : iterPos -= num;
183 : : return ( iterPos < 0 ? MB_FAILURE : MB_SUCCESS );
184 : : }
185 : :
186 : : } // namespace moab
187 : :
188 : : #endif
|