From c06d46408f2a1a87809c0ec8dfa41f1b642d35de Mon Sep 17 00:00:00 2001 From: Martin Marinov Date: Tue, 12 May 2020 15:38:33 +0100 Subject: [PATCH] Fix SmartHandle implementation issues: * Fix SmartHandle cyclical include dependencies. * Remove the SmartHandles include from Iterators and Circulators. * Move SmartHandle member implementations to the headers and remove SmartHandles.cc. --- src/OpenMesh/Core/Mesh/CirculatorsT.hh | 9 +- src/OpenMesh/Core/Mesh/IteratorsT.hh | 1 - src/OpenMesh/Core/Mesh/PolyConnectivity.hh | 3 + .../Core/Mesh/PolyConnectivity_inline_impl.hh | 68 +++++++++-- src/OpenMesh/Core/Mesh/SmartHandles.cc | 115 ------------------ src/OpenMesh/Core/Mesh/SmartHandles.hh | 16 +-- 6 files changed, 71 insertions(+), 141 deletions(-) delete mode 100644 src/OpenMesh/Core/Mesh/SmartHandles.cc diff --git a/src/OpenMesh/Core/Mesh/CirculatorsT.hh b/src/OpenMesh/Core/Mesh/CirculatorsT.hh index 6d12b58f..c9c537d3 100644 --- a/src/OpenMesh/Core/Mesh/CirculatorsT.hh +++ b/src/OpenMesh/Core/Mesh/CirculatorsT.hh @@ -53,7 +53,6 @@ //== INCLUDES ================================================================= #include -#include #include #include #include @@ -196,7 +195,7 @@ class GenericCirculatorBaseT { public: GenericCirculatorBaseT() : mesh_(0), lap_counter_(0) {} - GenericCirculatorBaseT(mesh_ref mesh, HalfedgeHandle heh, bool end = false) : + GenericCirculatorBaseT(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) : mesh_(&mesh), start_(heh), heh_(heh), lap_counter_(static_cast(end && heh.is_valid())) {} GenericCirculatorBaseT(const GenericCirculatorBaseT &rhs) : @@ -275,7 +274,7 @@ class GenericCirculatorT : protected GenericCirculatorBaseTmesh_, this->heh_, this->start_, this->lap_counter_); } - GenericCirculatorT(mesh_ref mesh, HalfedgeHandle heh, bool end = false) : + GenericCirculatorT(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) : GenericCirculatorBaseT(mesh, heh, end) { GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_); @@ -448,7 +447,7 @@ class GenericCirculatorT_DEPRECATED : protected GenericCirculatorBaseTmesh_, this->heh_, this->start_, this->lap_counter_); } - GenericCirculatorT_DEPRECATED(mesh_ref mesh, HalfedgeHandle heh, bool end = false) : + GenericCirculatorT_DEPRECATED(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) : GenericCirculatorBaseT(mesh, heh, end) { GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_); @@ -548,7 +547,7 @@ class GenericCirculatorT_DEPRECATED : protected GenericCirculatorBaseTheh_; } diff --git a/src/OpenMesh/Core/Mesh/IteratorsT.hh b/src/OpenMesh/Core/Mesh/IteratorsT.hh index 72621575..446d1cc3 100644 --- a/src/OpenMesh/Core/Mesh/IteratorsT.hh +++ b/src/OpenMesh/Core/Mesh/IteratorsT.hh @@ -54,7 +54,6 @@ #include #include -#include #include #include #include diff --git a/src/OpenMesh/Core/Mesh/PolyConnectivity.hh b/src/OpenMesh/Core/Mesh/PolyConnectivity.hh index 000f6218..e1a27338 100644 --- a/src/OpenMesh/Core/Mesh/PolyConnectivity.hh +++ b/src/OpenMesh/Core/Mesh/PolyConnectivity.hh @@ -1567,6 +1567,9 @@ struct PolyConnectivity::ElementRange }//namespace OpenMesh +#define OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE +#include #include +#undef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE #endif//OPENMESH_POLYCONNECTIVITY_HH diff --git a/src/OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh b/src/OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh index 4bf8aeda..3599ff86 100644 --- a/src/OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh +++ b/src/OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh @@ -39,13 +39,12 @@ * * * ========================================================================= */ -#ifndef OPENMESH_POLYCONNECTIVITY_INLINE_IMPL_HH -#define OPENMESH_POLYCONNECTIVITY_INLINE_IMPL_HH +#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE +#error Don't include this directly, include instead PolyConnectivity.hh +#endif // OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE -#include #include #include -#include namespace OpenMesh { @@ -772,7 +771,62 @@ inline PolyConnectivity::ConstHalfedgeLoopCCWIter PolyConnectivity::chl_ccwend(H { return ConstHalfedgeLoopCCWIter(*this, _heh, true); } +inline PolyConnectivity::ConstVertexFaceRange SmartVertexHandle::faces() const +{ + assert(mesh() != nullptr); + return mesh()->vf_range(*this); +} + +inline PolyConnectivity::ConstVertexEdgeRange SmartVertexHandle::edges() const +{ + assert(mesh() != nullptr); + return mesh()->ve_range(*this); +} + +inline PolyConnectivity::ConstVertexVertexRange +SmartVertexHandle::vertices() const +{ + assert(mesh() != nullptr); + return mesh()->vv_range(*this); +} + +inline PolyConnectivity::ConstVertexIHalfedgeRange +SmartVertexHandle::incoming_halfedges() const +{ + assert(mesh() != nullptr); + return mesh()->vih_range(*this); +} + +inline PolyConnectivity::ConstVertexOHalfedgeRange +SmartVertexHandle::outgoing_halfedges() const +{ + assert(mesh() != nullptr); + return mesh()->voh_range(*this); +} + +inline PolyConnectivity::ConstFaceVertexRange SmartFaceHandle::vertices() const +{ + assert(mesh() != nullptr); + return mesh()->fv_range(*this); +} + +inline PolyConnectivity::ConstFaceHalfedgeRange +SmartFaceHandle::halfedges() const +{ + assert(mesh() != nullptr); + return mesh()->fh_range(*this); +} + +inline PolyConnectivity::ConstFaceEdgeRange SmartFaceHandle::edges() const +{ + assert(mesh() != nullptr); + return mesh()->fe_range(*this); +} + +inline PolyConnectivity::ConstFaceFaceRange SmartFaceHandle::faces() const +{ + assert(mesh() != nullptr); + return mesh()->ff_range(*this); +} + }//namespace OpenMesh - -#endif // OPENMESH_POLYCONNECTIVITY_INLINE_IMPL_HH - diff --git a/src/OpenMesh/Core/Mesh/SmartHandles.cc b/src/OpenMesh/Core/Mesh/SmartHandles.cc deleted file mode 100644 index a9156aa3..00000000 --- a/src/OpenMesh/Core/Mesh/SmartHandles.cc +++ /dev/null @@ -1,115 +0,0 @@ -/* ========================================================================= * - * * - * OpenMesh * - * Copyright (c) 2001-2019, RWTH-Aachen University * - * Department of Computer Graphics and Multimedia * - * All rights reserved. * - * www.openmesh.org * - * * - *---------------------------------------------------------------------------* - * This file is part of OpenMesh. * - *---------------------------------------------------------------------------* - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright notice, * - * this list of conditions and the following disclaimer. * - * * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * * - * 3. Neither the name of the copyright holder nor the names of its * - * contributors may be used to endorse or promote products derived from * - * this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * * - * ========================================================================= */ - - -//== INCLUDES ================================================================= - -#include -#include "SmartHandles.hh" - - -//== NAMESPACES =============================================================== - -namespace OpenMesh { - -//TODO: I was not able to leave those in the header. If you find a way to do that, please do. - -PolyConnectivity::ConstVertexFaceRange SmartVertexHandle::faces() const -{ - assert(mesh() != nullptr); - return mesh()->vf_range(*this); -} - -PolyConnectivity::ConstVertexEdgeRange SmartVertexHandle::edges() const -{ - assert(mesh() != nullptr); - return mesh()->ve_range(*this); -} - -PolyConnectivity::ConstVertexVertexRange SmartVertexHandle::vertices() const -{ - assert(mesh() != nullptr); - return mesh()->vv_range(*this); -} - -PolyConnectivity::ConstVertexIHalfedgeRange SmartVertexHandle::incoming_halfedges() const -{ - assert(mesh() != nullptr); - return mesh()->vih_range(*this); -} - -PolyConnectivity::ConstVertexOHalfedgeRange SmartVertexHandle::outgoing_halfedges() const -{ - assert(mesh() != nullptr); - return mesh()->voh_range(*this); -} - - -PolyConnectivity::ConstFaceVertexRange SmartFaceHandle::vertices() const -{ - assert(mesh() != nullptr); - return mesh()->fv_range(*this); -} - -PolyConnectivity::ConstFaceHalfedgeRange SmartFaceHandle::halfedges() const -{ - assert(mesh() != nullptr); - return mesh()->fh_range(*this); -} - -PolyConnectivity::ConstFaceEdgeRange SmartFaceHandle::edges() const -{ - assert(mesh() != nullptr); - return mesh()->fe_range(*this); -} - -PolyConnectivity::ConstFaceFaceRange SmartFaceHandle::faces() const -{ - assert(mesh() != nullptr); - return mesh()->ff_range(*this); -} - - -//============================================================================= -} // namespace OpenMesh -//============================================================================= - -//============================================================================= diff --git a/src/OpenMesh/Core/Mesh/SmartHandles.hh b/src/OpenMesh/Core/Mesh/SmartHandles.hh index 920cc0d8..ca3b993c 100644 --- a/src/OpenMesh/Core/Mesh/SmartHandles.hh +++ b/src/OpenMesh/Core/Mesh/SmartHandles.hh @@ -39,16 +39,9 @@ * * * ========================================================================= */ - -#pragma once - - -//== INCLUDES ================================================================= - -#include "Handles.hh" -#include -#include - +#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE +#error Don't include this directly, include instead PolyConnectivity.hh +#endif//OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE //== NAMESPACES =============================================================== @@ -357,9 +350,6 @@ inline bool SmartFaceHandle::is_boundary() const assert(mesh() != nullptr); return mesh()->is_boundary(*this); } - - - //============================================================================= } // namespace OpenMesh //=============================================================================