diff --git a/src/OpenMesh/Core/Mesh/PolyConnectivity.hh b/src/OpenMesh/Core/Mesh/PolyConnectivity.hh index 78e8a3f9..6973f614 100644 --- a/src/OpenMesh/Core/Mesh/PolyConnectivity.hh +++ b/src/OpenMesh/Core/Mesh/PolyConnectivity.hh @@ -1169,6 +1169,9 @@ public: &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end> ConstFaceRangeSkipping; + template + struct ElementRange; + /** * @return The vertices as a range object suitable * for C++11 range based for loops. Will skip deleted vertices. @@ -1217,6 +1220,21 @@ public: */ ConstFaceRange all_faces() const { return ConstFaceRange(*this); } + /** + * @return The elements corresponding to the template type as a range object suitable + * for C++11 range based for loops. Will skip deleted faces. + */ + template + typename ElementRange::RangeSkipping elements() const; + + /** + * @return The elements corresponding to the template type as a range object suitable + * for C++11 range based for loops. Will include deleted faces. + */ + template + typename ElementRange::Range all_elements() const; + + /// Generic class for iterator ranges. template< typename CONTAINER_TYPE, @@ -1241,6 +1259,7 @@ public: CENTER_ENTITY_TYPE center_; }; + typedef CirculatorRange< PolyConnectivity, ConstVertexVertexCWIter, @@ -1625,6 +1644,52 @@ private: // Working storage for add_face() }; +template <> +struct PolyConnectivity::ElementRange +{ + using Range = ConstVertexRange; + using RangeSkipping = ConstVertexRangeSkipping; +}; + +template <> +struct PolyConnectivity::ElementRange +{ + using Range = ConstHalfedgeRange; + using RangeSkipping = ConstHalfedgeRangeSkipping; +}; + +template <> +struct PolyConnectivity::ElementRange +{ + using Range = ConstEdgeRange; + using RangeSkipping = ConstEdgeRangeSkipping; +}; + +template <> +struct PolyConnectivity::ElementRange +{ + using Range = ConstFaceRange; + using RangeSkipping = ConstFaceRangeSkipping; +}; + + +template <> +inline PolyConnectivity::ConstVertexRangeSkipping PolyConnectivity::elements() const { return ConstVertexRangeSkipping(*this); } +template <> +inline PolyConnectivity::ConstVertexRange PolyConnectivity::all_elements() const { return ConstVertexRange(*this); } +template <> +inline PolyConnectivity::ConstHalfedgeRangeSkipping PolyConnectivity::elements() const { return ConstHalfedgeRangeSkipping(*this); } +template <> +inline PolyConnectivity::ConstHalfedgeRange PolyConnectivity::all_elements() const { return ConstHalfedgeRange(*this); } +template <> +inline PolyConnectivity::ConstEdgeRangeSkipping PolyConnectivity::elements() const { return ConstEdgeRangeSkipping(*this); } +template <> +inline PolyConnectivity::ConstEdgeRange PolyConnectivity::all_elements() const { return ConstEdgeRange(*this); } +template <> +inline PolyConnectivity::ConstFaceRangeSkipping PolyConnectivity::elements() const { return ConstFaceRangeSkipping(*this); } +template <> +inline PolyConnectivity::ConstFaceRange PolyConnectivity::all_elements() const { return ConstFaceRange(*this); } + }//namespace OpenMesh #endif//OPENMESH_POLYCONNECTIVITY_HH