MOAB: Mesh Oriented datABase  (version 5.5.0)
MBIter.hpp
Go to the documentation of this file.
1 #ifndef MOAB_MB_ITER_HPP
2 #define MOAB_MB_ITER_HPP
3 
4 #define IS_BUILDING_MB
5 #include "Internals.hpp"
6 #include "moab/Range.hpp"
7 #include "moab/Core.hpp"
8 #include <vector>
9 #include <algorithm>
10 
12 {
13  protected:
17  int arrSize;
19 
20  public:
22  iMesh_EntityTopology topology,
23  EntityHandle set,
24  int array_sz,
25  bool recursive = false )
26  : entType( type ), entTopo( topology ), entSet( set ), arrSize( array_sz ), isRecursive( recursive )
27  {
28  }
29 
31 
32  int array_size() const
33  {
34  return arrSize;
35  }
36 
37  virtual ErrorCode step( int num_steps, bool& at_end ) = 0;
38 
39  // NOTE: input array must be at least arrLen long
40  virtual void get_entities( Core* mb, EntityHandle* array, int& count_out ) = 0;
41 
42  virtual ErrorCode reset( Interface* mb ) = 0;
43 
44  class IsType
45  {
46  private:
47  EntityType type;
48 
49  public:
50  IsType( EntityType t ) : type( t ) {}
52  {
53  return TYPE_FROM_HANDLE( h ) == type;
54  }
55  };
56 
57  void remove_type( std::vector< EntityHandle >& vect, EntityType t )
58  {
59  vect.erase( std::remove_if( vect.begin(), vect.end(), IsType( t ) ), vect.end() );
60  }
61 
62  void remove_type( Range& range, EntityType t )
63  {
64  std::pair< Range::iterator, Range::iterator > p = range.equal_range( t );
65  range.erase( p.first, p.second );
66  }
67 };
68 
69 // step_iterator will safely step forward N steps in a iterator. We specialize
70 // for random-access iterators (vectors and Ranges) so that they perform better.
71 
72 template < typename T >
73 inline ErrorCode step_iterator( T& curr, const T& end, int num_steps, bool& at_end )
74 {
75  if( 0 > num_steps ) return MB_FAILURE;
76 
77  while( num_steps && curr != end )
78  {
79  num_steps--;
80  curr++;
81  }
82  at_end = ( curr == end );
83  return MB_SUCCESS;
84 }
85 
86 template < typename T >
87 inline ErrorCode step_iterator( typename std::vector< T >::const_iterator& curr,
88  const typename std::vector< T >::const_iterator& end,
89  int num_steps,
90  bool& at_end )
91 {
92  if( 0 > num_steps ) return MB_FAILURE;
93 
94  assert( curr <= end ); // Sanity check
95  at_end = ( end - curr <= num_steps );
96 
97  if( at_end )
98  curr = end;
99  else
100  curr += num_steps;
101  return MB_SUCCESS;
102 }
103 
104 inline ErrorCode step_iterator( Range::const_iterator& curr,
105  const Range::const_iterator& end,
106  int num_steps,
107  bool& at_end )
108 {
109  if( 0 > num_steps ) return MB_FAILURE;
110 
111  at_end = ( end - curr <= num_steps );
112 
113  if( at_end )
114  curr = end;
115  else
116  curr += num_steps;
117  return MB_SUCCESS;
118 }
119 
120 template < class Container >
122 {
123  protected:
124  Container iterData;
125  typename Container::const_iterator iterPos;
126 
127  public:
129  iMesh_EntityTopology topology,
130  EntityHandle set,
131  int arr_size,
132  bool recursive = false )
133  : iBase_EntityArrIterator_Private( type, topology, set, arr_size, recursive ), iterPos( iterData.end() )
134  {
135  }
136 
137  ~MBIter() {}
138 
139  typename Container::const_iterator position() const
140  {
141  return iterPos;
142  };
143 
144  typename Container::const_iterator end() const
145  {
146  return iterData.end();
147  };
148 
149  ErrorCode step( int num_steps, bool& at_end )
150  {
151  return step_iterator( iterPos, end(), num_steps, at_end );
152  }
153 
154  void get_entities( Core* mb, EntityHandle* array, int& count )
155  {
156  for( count = 0; count < arrSize && iterPos != iterData.end(); ++iterPos )
157  if( mb->is_valid( *iterPos ) ) array[count++] = *iterPos;
158  }
159 
160  virtual ErrorCode reset( Interface* mb )
161  {
162  ErrorCode result;
163  iterData.clear();
165  {
166  if( entTopo == iMesh_SEPTAHEDRON )
167  result = MB_SUCCESS;
168  else
169  result = mb->get_entities_by_type( entSet, mb_topology_table[entTopo], iterData, isRecursive );
170  }
171  else if( entType != iBase_ALL_TYPES )
172  {
173  result = mb->get_entities_by_dimension( entSet, entType, iterData, isRecursive );
175  }
176  else
177  {
178  result = mb->get_entities_by_handle( entSet, iterData, isRecursive );
181  }
182  iterPos = iterData.begin();
183  return result;
184  }
185 };
186 
189 
190 #endif