IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Mesh3dTriangleConstIterator.h
1 // Mesh3dTriangleConstIterator.h:
3 // ------------------------------
4 //
14 
15 #ifndef __IPSDKGEOMETRY_MESH3DTRIANGLECONSTITERATOR_H__
16 #define __IPSDKGEOMETRY_MESH3DTRIANGLECONSTITERATOR_H__
17 
18 // suppression warnings
19 // warning C4251: 'ipsdk::geom::Mesh3dTriangleConstIterator<MeshType>::_iterTriangleIdx': class 'std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<unsigned int>>>' needs to have dll-interface to be used by clients of class 'ipsdk::geom::Mesh3dTriangleConstIterator<MeshType>'
20 #pragma warning (push)
21 #pragma warning (disable : 4251)
22 
25 #include <IPSDKGeometry/Entity/3d/Triangle/Triangle3d.h>
27 
28 namespace ipsdk {
29 namespace geom {
30 
33 
34 template <typename MeshType>
36 {
37 // predefined public types
38 public:
40  typedef typename MeshType::DataType T;
41 
43  typedef typename MeshType::VertexType VertexType;
44 
47 
50 
52  typedef std::input_iterator_tag iterator_category;
53 
56 
57  // difference type for iterator
58  typedef UInt32Vector::difference_type difference_type;
59 
61  typedef const TriangleType* pointer;
62 
63  // reference type associated to iterator
64  typedef const TriangleType& reference;
65 
66 public:
69  Mesh3dTriangleConstIterator(const MeshType* pMesh,
70  const UInt64Vector::const_iterator& iterTriangleIdx) :
71  _pMesh(pMesh),
72  _iterTriangleIdx(iterTriangleIdx)
73  {
74  updateData();
75  }
77  _pMesh(iter._pMesh),
79  _triangle(iter._triangle)
80  {
81  }
82  Mesh3dTriangleConstIterator& operator= (const Iterator& iter)
83  {
84  _pMesh = iter._pMesh;
85  _iterTriangleIdx = iter._iterTriangleIdx;
86  _triangle = iter._triangle;
87  }
88  ~Mesh3dTriangleConstIterator()
89  {
90  }
92 
93 // methods
94 public:
96  inline Iterator& operator++();
97 
99  inline Iterator& operator--();
100 
103  inline bool operator==(const Iterator& iter) const;
104  inline bool operator!=(const Iterator& iter) const;
106 
108  inline const TriangleType* operator->() const;
109 
111  inline const TriangleType& operator*() const;
112 
114  void swap(Iterator& iter);
115 
116 protected:
118  inline void updateData();
119 
120 // attributes
121 protected:
123  const MeshType* _pMesh;
124 
126  UInt64Vector::const_iterator _iterTriangleIdx;
127 
130 };
131 
134 
135 template <typename MeshType>
136 IPSDK_FORCEINLINE typename Mesh3dTriangleConstIterator<MeshType>::Iterator&
138 {
139  ++_iterTriangleIdx;
140  updateData();
141 
142  return *this;
143 }
144 
145 template <typename MeshType>
146 IPSDK_FORCEINLINE typename Mesh3dTriangleConstIterator<MeshType>::Iterator&
148 {
149  --_iterTriangleIdx;
150  updateData();
151 
152  return *this;
153 }
154 
155 template <typename MeshType>
156 IPSDK_FORCEINLINE bool
158 {
159  return _iterTriangleIdx == iter._iterTriangleIdx;
160 }
161 
162 template <typename MeshType>
163 IPSDK_FORCEINLINE bool
165 {
166  return _iterTriangleIdx != iter._iterTriangleIdx;
167 }
168 
169 template <typename MeshType>
170 IPSDK_FORCEINLINE const typename Mesh3dTriangleConstIterator<MeshType>::TriangleType*
172 {
173  return &_triangle;
174 }
175 
176 template <typename MeshType>
177 IPSDK_FORCEINLINE const typename Mesh3dTriangleConstIterator<MeshType>::TriangleType&
179 {
180  return _triangle;
181 }
182 
183 template <typename MeshType>
184 IPSDK_FORCEINLINE void
186 {
187  if (_iterTriangleIdx != _pMesh->getTriangleToHalfEdgeColl().end())
188  {
189  const ipUInt64 halfEdgeIdx = *_iterTriangleIdx;
190  const Mesh3dHalfEdge& curHalfEdge = _pMesh->getHalfEdgeColl()[halfEdgeIdx];
191  const Mesh3dHalfEdge& nextHalfEdge = _pMesh->getHalfEdgeColl()[curHalfEdge._nextHalfEdgeIdx];
192  const Mesh3dHalfEdge& prevHalfEdge = _pMesh->getHalfEdgeColl()[nextHalfEdge._nextHalfEdgeIdx];
193  const VertexType& v0 = _pMesh->getVertexColl()[curHalfEdge._startVertexIdx];
194  const VertexType& v1 = _pMesh->getVertexColl()[nextHalfEdge._startVertexIdx];
195  const VertexType& v2 = _pMesh->getVertexColl()[prevHalfEdge._startVertexIdx];
196 
197  _triangle.setCoords(v0, v1, v2);
198  }
199 }
200 
201 template <typename MeshType>
202 inline void
204 {
205  std::swap(_pMesh, iter._pMesh);
206  std::swap(_iterTriangleIdx, iter._iterTriangleIdx);
207  std::swap(_triangle, iter._triangle);
208 }
209 
212 
213 } // end of namespace geom
214 } // end of namespace ipsdk
215 
216 #pragma warning (pop)
217 
218 #endif // __IPSDKGEOMETRY_MESH3DTRIANGLECONSTITERATOR_H__
MeshType::VertexType VertexType
underlying mesh 3d vertex type
Definition: Mesh3dTriangleConstIterator.h:43
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
bool operator==(const Iterator &iter) const
iterator comparison
Definition: Mesh3dTriangleConstIterator.h:157
UInt64Vector::const_iterator _iterTriangleIdx
current iterator on triangle index collection
Definition: Mesh3dTriangleConstIterator.h:126
uint64_t ipUInt64
Base types definition.
Definition: BaseTypes.h:55
const TriangleType * pointer
pointer type for iterator
Definition: Mesh3dTriangleConstIterator.h:61
Definition: Mesh3dTypes.h:52
Iterator & operator--()
decrement of iterator
Definition: Mesh3dTriangleConstIterator.h:147
const TriangleType & operator*() const
retrieve current triangle associated to iterator position
Definition: Mesh3dTriangleConstIterator.h:178
bool operator!=(const Iterator &iter) const
iterator comparison
Definition: Mesh3dTriangleConstIterator.h:164
Iterator & operator++()
increment of iterator
Definition: Mesh3dTriangleConstIterator.h:137
Triangle3d< T > TriangleType
underlying triangle 3d type
Definition: Mesh3dTriangleConstIterator.h:46
Predefined types for mesh 3d management.
Definition of import/export macro for library.
const TriangleType * operator->() const
retrieve current triangle associated to iterator position
Definition: Mesh3dTriangleConstIterator.h:171
3d triangle associated to cartesian 3d coordinates
Definition: Triangle3d.h:37
std::input_iterator_tag iterator_category
iterator category
Definition: Mesh3dTriangleConstIterator.h:52
Vector DataType
data type used for estimation
Definition: EstimationTypes.h:58
ipUInt64 _startVertexIdx
index of start vertex for half edge
Definition: Mesh3dTypes.h:55
Iterator class allowing to parse triangles associated to a mesh 3d.
Definition: Mesh3dTriangleConstIterator.h:35
void swap(Iterator &iter)
swap between iterators
Definition: Mesh3dTriangleConstIterator.h:203
TriangleType value_type
value type associated to iterator
Definition: Mesh3dTriangleConstIterator.h:55
ipUInt64 _nextHalfEdgeIdx
index of next half edge inside left triangle
Definition: Mesh3dTypes.h:65
void updateData()
method allowing to update iterator internal data
Definition: Mesh3dTriangleConstIterator.h:185
const MeshType * _pMesh
reference to mesh 3d associated to iterator
Definition: Mesh3dTriangleConstIterator.h:123
TriangleType _triangle
triangle data associated to current iterator position
Definition: Mesh3dTriangleConstIterator.h:129
MeshType::DataType T
underlying mesh 3d data type
Definition: Mesh3dTriangleConstIterator.h:40
Mesh3dTriangleConstIterator< MeshType > Iterator
iterator type
Definition: Mesh3dTriangleConstIterator.h:49