diff --git a/src/OpenVolumeMesh/Core/OpenVolumeMeshHandle.hh b/src/OpenVolumeMesh/Core/OpenVolumeMeshHandle.hh index abb2fa5ee1c60d1a4cf068571839eab7d58041c9..0b4a74e1d7c8040b4c4b9fb29e21564501e0ea0e 100644 --- a/src/OpenVolumeMesh/Core/OpenVolumeMeshHandle.hh +++ b/src/OpenVolumeMesh/Core/OpenVolumeMeshHandle.hh @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include "Entities.hh" #include "../System/FunctionalInclude.hh" @@ -48,17 +50,15 @@ namespace OpenVolumeMesh { class OpenVolumeMeshHandle { public: // Default constructor - explicit OpenVolumeMeshHandle(int _idx) : idx_(_idx) {}; + explicit OpenVolumeMeshHandle(int _idx) : idx_(_idx) {} OpenVolumeMeshHandle& operator=(int _idx) { idx_ = _idx; return *this; } - OpenVolumeMeshHandle& operator=(const OpenVolumeMeshHandle& _idx) { - idx_ = _idx.idx_; - return *this; - } + OpenVolumeMeshHandle(const OpenVolumeMeshHandle& _idx) = default; + OpenVolumeMeshHandle& operator=(const OpenVolumeMeshHandle& _idx) = default; inline bool is_valid() const { return idx_ != -1; } @@ -76,6 +76,9 @@ public: inline const int& idx() const { return idx_; } + /// return unsigned idx - handle must be valid + inline size_t uidx() const { assert(is_valid()); return static_cast(idx_); } + void idx(const int& _idx) { idx_ = _idx; } OVM_DEPRECATED("use explicit .idx() instead") @@ -95,6 +98,17 @@ class HandleT : public OpenVolumeMeshHandle public: using Entity = EntityTag; explicit HandleT(int _idx = -1) : OpenVolumeMeshHandle(_idx) {} + + static HandleT + from_unsigned(size_t _idx) + { + if (_idx <= std::numeric_limits::max()) { + return HandleT(static_cast(_idx)); + } else { + assert(false); + return HandleT(-1); + } + } }; // Default entity handles diff --git a/src/OpenVolumeMesh/Core/PropertyPtr.hh b/src/OpenVolumeMesh/Core/PropertyPtr.hh index 4d666e608c6ef16256948a4412d1dd95af243130..cbf8a92187dbea2fd397fcfcad46ff4083d4806f 100644 --- a/src/OpenVolumeMesh/Core/PropertyPtr.hh +++ b/src/OpenVolumeMesh/Core/PropertyPtr.hh @@ -99,7 +99,7 @@ public: const_reference operator[](size_t _idx) const { return (*ptr::shared_ptr::get())[_idx]; } reference operator[](const EntityHandleT& _h) { return (*ptr::shared_ptr::get())[_h.idx()]; } - const_reference operator[](const EntityHandleT& _h) const { return (*ptr::shared_ptr::get())[_h.idx()]; } + const_reference operator[](const EntityHandleT& _h) const { return (*ptr::shared_ptr::get())[_h.uidx()]; } virtual void serialize(std::ostream& _ostr) const { ptr::shared_ptr::get()->serialize(_ostr); } virtual void deserialize(std::istream& _istr) { ptr::shared_ptr::get()->deserialize(_istr); } diff --git a/src/OpenVolumeMesh/Core/ResourceManager.cc b/src/OpenVolumeMesh/Core/ResourceManager.cc index 2b52644c5cb38eec0de53a04e195fc101270a03d..fa8a90e6b0ac0a6accf68531c0b65e5faab8472d 100644 --- a/src/OpenVolumeMesh/Core/ResourceManager.cc +++ b/src/OpenVolumeMesh/Core/ResourceManager.cc @@ -178,32 +178,32 @@ void ResourceManager::swap_vertex_properties(VertexHandle _h1, VertexHandle _h2) void ResourceManager::release_property(VertexPropHandle _handle) { - remove_property(vertex_props_, _handle.idx()); + remove_property(vertex_props_, _handle.uidx()); } void ResourceManager::release_property(EdgePropHandle _handle) { - remove_property(edge_props_, _handle.idx()); + remove_property(edge_props_, _handle.uidx()); } void ResourceManager::release_property(HalfEdgePropHandle _handle) { - remove_property(halfedge_props_, _handle.idx()); + remove_property(halfedge_props_, _handle.uidx()); } void ResourceManager::release_property(FacePropHandle _handle) { - remove_property(face_props_, _handle.idx()); + remove_property(face_props_, _handle.uidx()); } void ResourceManager::release_property(HalfFacePropHandle _handle) { - remove_property(halfface_props_, _handle.idx()); + remove_property(halfface_props_, _handle.uidx()); } void ResourceManager::release_property(CellPropHandle _handle) { - remove_property(cell_props_, _handle.idx()); + remove_property(cell_props_, _handle.uidx()); } void ResourceManager::release_property(MeshPropHandle _handle) {