remove second template argument off PropertyManager

This commit is contained in:
Max Lyon
2019-10-31 14:09:08 +01:00
parent 8bc5491c5c
commit de529269b5

View File

@@ -44,6 +44,7 @@
#include <OpenMesh/Core/System/config.h> #include <OpenMesh/Core/System/config.h>
#include <OpenMesh/Core/Utils/HandleToPropHandle.hh> #include <OpenMesh/Core/Utils/HandleToPropHandle.hh>
#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
#include <sstream> #include <sstream>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
@@ -59,6 +60,8 @@ namespace OpenMesh {
* makeTemporaryProperty(), getProperty(), and getOrMakeProperty() * makeTemporaryProperty(), getProperty(), and getOrMakeProperty()
* to construct a PropertyManager, e.g. * to construct a PropertyManager, e.g.
* *
* Note that the second template parameter is depcretated.
*
* \code * \code
* { * {
* TriMesh mesh; * TriMesh mesh;
@@ -73,7 +76,7 @@ namespace OpenMesh {
* } * }
* \endcode * \endcode
*/ */
template<typename PROPTYPE, typename MeshT> template<typename PROPTYPE, typename MeshT = int>
class PropertyManager { class PropertyManager {
#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) #if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
public: public:
@@ -110,7 +113,7 @@ class PropertyManager {
* @see PropertyManager::createIfNotExists, makePropertyManagerFromNew, * @see PropertyManager::createIfNotExists, makePropertyManagerFromNew,
* makePropertyManagerFromExisting, makePropertyManagerFromExistingOrNew * makePropertyManagerFromExisting, makePropertyManagerFromExistingOrNew
*/ */
PropertyManager(MeshT &mesh, const char *propname, bool existing = false) : mesh_(&mesh), retain_(existing), name_(propname) { PropertyManager(PolyConnectivity& mesh, const char *propname, bool existing = false) : mesh_(&mesh), retain_(existing), name_(propname) {
if (existing) { if (existing) {
if (!mesh_->get_property_handle(prop_, propname)) { if (!mesh_->get_property_handle(prop_, propname)) {
std::ostringstream oss; std::ostringstream oss;
@@ -136,24 +139,40 @@ class PropertyManager {
std::swap(name_, rhs.name_); std::swap(name_, rhs.name_);
} }
static bool propertyExists(MeshT &mesh, const char *propname) { static bool propertyExists(PolyConnectivity &mesh, const char *propname) {
PROPTYPE dummy; PROPTYPE dummy;
return mesh.get_property_handle(dummy, propname); return mesh.get_property_handle(dummy, propname);
} }
bool isValid() const { return mesh_ != 0; } bool isValid() const { return prop_.is_valid(); }
operator bool() const { return isValid(); } operator bool() const { return isValid(); }
const PROPTYPE &getRawProperty() const { return prop_; } const PROPTYPE &getRawProperty() const { return prop_; }
const std::string &getName() const { return name_; } const std::string &getName() const { return name_; }
MeshT &getMesh() const { return *mesh_; } /**
* Get the mesh corresponding to the property.
*
* If you use PropertyManager without second template parameter (recommended)
* you need to specify the actual mesh type when using this function, e.g.:
* \code
* {
* TriMesh mesh;
* auto visited = VProp<bool>(mesh);
* TriMesh& mesh_ref = visited.getMesh<TriMesh>();
* }
*
*/
template <typename MeshType >
MeshType& getMesh() const { return dynamic_cast<MeshType&>(mesh_); }
MeshT& getMesh() const { return dynamic_cast<MeshT&>(mesh_); }
#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) #if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
/// Only for pre C++11 compatibility. /// Only for pre C++11 compatibility.
typedef PropertyManager<PROPTYPE, MeshT> Proxy; typedef PropertyManager<PROPTYPE> Proxy;
/** /**
* Move constructor. Transfers ownership (delete responsibility). * Move constructor. Transfers ownership (delete responsibility).
@@ -184,7 +203,7 @@ class PropertyManager {
* *
* @see makePropertyManagerFromExistingOrNew * @see makePropertyManagerFromExistingOrNew
*/ */
static PropertyManager createIfNotExists(MeshT &mesh, const char *propname) { static PropertyManager createIfNotExists(PolyConnectivity &mesh, const char *propname) {
PROPTYPE dummy_prop; PROPTYPE dummy_prop;
PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname)); PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));
pm.retain(); pm.retain();
@@ -201,7 +220,7 @@ class PropertyManager {
* @see makePropertyManagerFromExistingOrNew * @see makePropertyManagerFromExistingOrNew
*/ */
template<typename PROP_VALUE, typename ITERATOR_TYPE> template<typename PROP_VALUE, typename ITERATOR_TYPE>
static PropertyManager createIfNotExists(MeshT &mesh, const char *propname, static PropertyManager createIfNotExists(PolyConnectivity &mesh, const char *propname,
const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end, const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end,
const PROP_VALUE &init_value) { const PROP_VALUE &init_value) {
const bool exists = propertyExists(mesh, propname); const bool exists = propertyExists(mesh, propname);
@@ -222,7 +241,7 @@ class PropertyManager {
* @see makePropertyManagerFromExistingOrNew * @see makePropertyManagerFromExistingOrNew
*/ */
template<typename PROP_VALUE, typename ITERATOR_RANGE> template<typename PROP_VALUE, typename ITERATOR_RANGE>
static PropertyManager createIfNotExists(MeshT &mesh, const char *propname, static PropertyManager createIfNotExists(PolyConnectivity &mesh, const char *propname,
const ITERATOR_RANGE &range, const PROP_VALUE &init_value) { const ITERATOR_RANGE &range, const PROP_VALUE &init_value) {
return createIfNotExists( return createIfNotExists(
mesh, propname, range.begin(), range.end(), init_value); mesh, propname, range.begin(), range.end(), init_value);
@@ -244,9 +263,9 @@ class PropertyManager {
#else #else
class Proxy { class Proxy {
private: private:
Proxy(MeshT *mesh_, PROPTYPE prop_, bool retain_, const std::string &name_) : Proxy(PolyConnectivity *mesh_, PROPTYPE prop_, bool retain_, const std::string &name_) :
mesh_(mesh_), prop_(prop_), retain_(retain_), name_(name_) {} mesh_(mesh_), prop_(prop_), retain_(retain_), name_(name_) {}
MeshT *mesh_; PolyConnectivity *mesh_;
PROPTYPE prop_; PROPTYPE prop_;
bool retain_; bool retain_;
std::string name_; std::string name_;
@@ -279,7 +298,7 @@ class PropertyManager {
* *
* @see makePropertyManagerFromExistingOrNew * @see makePropertyManagerFromExistingOrNew
*/ */
static Proxy createIfNotExists(MeshT &mesh, const char *propname) { static Proxy createIfNotExists(PolyConnectivity &mesh, const char *propname) {
PROPTYPE dummy_prop; PROPTYPE dummy_prop;
PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname)); PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));
pm.retain(); pm.retain();
@@ -296,7 +315,7 @@ class PropertyManager {
* @see makePropertyManagerFromExistingOrNew * @see makePropertyManagerFromExistingOrNew
*/ */
template<typename PROP_VALUE, typename ITERATOR_TYPE> template<typename PROP_VALUE, typename ITERATOR_TYPE>
static Proxy createIfNotExists(MeshT &mesh, const char *propname, static Proxy createIfNotExists(PolyConnectivity &mesh, const char *propname,
const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end, const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end,
const PROP_VALUE &init_value) { const PROP_VALUE &init_value) {
const bool exists = propertyExists(mesh, propname); const bool exists = propertyExists(mesh, propname);
@@ -386,7 +405,7 @@ class PropertyManager {
* Examples: * Examples:
* \code * \code
* MeshT mesh; * MeshT mesh;
* PropertyManager<VPropHandleT<double>, MeshT> distance( * PropertyManager<VPropHandleT<double>> distance(
* mesh, "distance.plugin-example.i8.informatik.rwth-aachen.de"); * mesh, "distance.plugin-example.i8.informatik.rwth-aachen.de");
* distance.set_range( * distance.set_range(
* mesh.vertices_begin(), mesh.vertices_end(), * mesh.vertices_begin(), mesh.vertices_end(),
@@ -434,9 +453,9 @@ class PropertyManager {
* Will be used with dst_propmanager. Used to double check the bounds. * Will be used with dst_propmanager. Used to double check the bounds.
*/ */
template<typename HandleTypeIterator, typename PROPTYPE_2, template<typename HandleTypeIterator, typename PROPTYPE_2,
typename MeshT_2, typename HandleTypeIterator_2> typename HandleTypeIterator_2>
void copy_to(HandleTypeIterator begin, HandleTypeIterator end, void copy_to(HandleTypeIterator begin, HandleTypeIterator end,
PropertyManager<PROPTYPE_2, MeshT_2> &dst_propmanager, PropertyManager<PROPTYPE_2> &dst_propmanager,
HandleTypeIterator_2 dst_begin, HandleTypeIterator_2 dst_end) const { HandleTypeIterator_2 dst_begin, HandleTypeIterator_2 dst_end) const {
for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) { for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) {
@@ -445,9 +464,9 @@ class PropertyManager {
} }
template<typename RangeType, typename PROPTYPE_2, template<typename RangeType, typename PROPTYPE_2,
typename MeshT_2, typename RangeType_2> typename RangeType_2>
void copy_to(const RangeType &range, void copy_to(const RangeType &range,
PropertyManager<PROPTYPE_2, MeshT_2> &dst_propmanager, PropertyManager<PROPTYPE_2> &dst_propmanager,
const RangeType_2 &dst_range) const { const RangeType_2 &dst_range) const {
copy_to(range.begin(), range.end(), dst_propmanager, copy_to(range.begin(), range.end(), dst_propmanager,
dst_range.begin(), dst_range.end()); dst_range.begin(), dst_range.end());
@@ -467,15 +486,15 @@ class PropertyManager {
* @param dst_mesh Destination mesh on which to copy. * @param dst_mesh Destination mesh on which to copy.
* @param dst_range Destination range. * @param dst_range Destination range.
*/ */
template<typename RangeType, typename MeshT_2, typename RangeType_2> template<typename RangeType, typename RangeType_2>
static void copy(const char *prop_name, static void copy(const char *prop_name,
MeshT &src_mesh, const RangeType &src_range, PolyConnectivity &src_mesh, const RangeType &src_range,
MeshT_2 &dst_mesh, const RangeType_2 &dst_range) { PolyConnectivity &dst_mesh, const RangeType_2 &dst_range) {
typedef OpenMesh::PropertyManager<PROPTYPE, MeshT> DstPM; typedef OpenMesh::PropertyManager<PROPTYPE> DstPM;
DstPM dst(DstPM::createIfNotExists(dst_mesh, prop_name)); DstPM dst(DstPM::createIfNotExists(dst_mesh, prop_name));
typedef OpenMesh::PropertyManager<PROPTYPE, MeshT_2> SrcPM; typedef OpenMesh::PropertyManager<PROPTYPE> SrcPM;
SrcPM src(src_mesh, prop_name, true); SrcPM src(src_mesh, prop_name, true);
src.copy_to(src_range, dst, dst_range); src.copy_to(src_range, dst, dst_range);
@@ -488,7 +507,7 @@ class PropertyManager {
} }
private: private:
MeshT *mesh_; PolyConnectivity* mesh_;
PROPTYPE prop_; PROPTYPE prop_;
bool retain_; bool retain_;
std::string name_; std::string name_;
@@ -517,13 +536,12 @@ class PropertyManager {
* @param propname (optional) The name of the created property * @param propname (optional) The name of the created property
* @tparam ElementT Element type of the created property, e.g. VertexHandle, HalfedgeHandle, etc. * @tparam ElementT Element type of the created property, e.g. VertexHandle, HalfedgeHandle, etc.
* @tparam T Value type of the created property, e.g., \p double, \p int, etc. * @tparam T Value type of the created property, e.g., \p double, \p int, etc.
* @tparam MeshT Type of the mesh. Can often be inferred from \p mesh
* @returns A PropertyManager handling the lifecycle of the property * @returns A PropertyManager handling the lifecycle of the property
*/ */
template<typename ElementT, typename T, typename MeshT> template<typename ElementT, typename T>
PropertyManager<typename HandleToPropHandle<ElementT, T>::type, MeshT> PropertyManager<typename HandleToPropHandle<ElementT, T>::type>
makeTemporaryProperty(MeshT &mesh, const char *propname = "") { makeTemporaryProperty(PolyConnectivity &mesh, const char *propname = "") {
return PropertyManager<typename HandleToPropHandle<ElementT, T>::type, MeshT>(mesh, propname, false); return PropertyManager<typename HandleToPropHandle<ElementT, T>::type>(mesh, propname, false);
} }
/** @relates PropertyManager /** @relates PropertyManager
@@ -551,13 +569,12 @@ makeTemporaryProperty(MeshT &mesh, const char *propname = "") {
* @param propname The name of the created property * @param propname The name of the created property
* @tparam ElementT Element type of the created property, e.g. VertexHandle, HalfedgeHandle, etc. * @tparam ElementT Element type of the created property, e.g. VertexHandle, HalfedgeHandle, etc.
* @tparam T Value type of the created property, e.g., \p double, \p int, etc. * @tparam T Value type of the created property, e.g., \p double, \p int, etc.
* @tparam MeshT Type of the mesh. Can often be inferred from \p mesh
* @returns A PropertyManager wrapping the property * @returns A PropertyManager wrapping the property
*/ */
template<typename ElementT, typename T, typename MeshT> template<typename ElementT, typename T>
PropertyManager<typename HandleToPropHandle<ElementT, T>::type, MeshT> PropertyManager<typename HandleToPropHandle<ElementT, T>::type>
getProperty(MeshT &mesh, const char *propname) { getProperty(PolyConnectivity &mesh, const char *propname) {
return PropertyManager<typename HandleToPropHandle<ElementT, T>::type, MeshT>(mesh, propname, true); return PropertyManager<typename HandleToPropHandle<ElementT, T>::type>(mesh, propname, true);
} }
/** @relates PropertyManager /** @relates PropertyManager
@@ -587,13 +604,12 @@ getProperty(MeshT &mesh, const char *propname) {
* @param propname The name of the created property * @param propname The name of the created property
* @tparam ElementT Element type of the created property, e.g. VertexHandle, HalfedgeHandle, etc. * @tparam ElementT Element type of the created property, e.g. VertexHandle, HalfedgeHandle, etc.
* @tparam T Value type of the created property, e.g., \p double, \p int, etc. * @tparam T Value type of the created property, e.g., \p double, \p int, etc.
* @tparam MeshT Type of the mesh. Can often be inferred from \p mesh
* @returns A PropertyManager wrapping the property * @returns A PropertyManager wrapping the property
*/ */
template<typename ElementT, typename T, typename MeshT> template<typename ElementT, typename T>
PropertyManager<typename HandleToPropHandle<ElementT, T>::type, MeshT> PropertyManager<typename HandleToPropHandle<ElementT, T>::type>
getOrMakeProperty(MeshT &mesh, const char *propname) { getOrMakeProperty(PolyConnectivity &mesh, const char *propname) {
return PropertyManager<typename HandleToPropHandle<ElementT, T>::type, MeshT>::createIfNotExists(mesh, propname); return PropertyManager<typename HandleToPropHandle<ElementT, T>::type>::createIfNotExists(mesh, propname);
} }
/** @relates PropertyManager /** @relates PropertyManager
@@ -617,9 +633,9 @@ getOrMakeProperty(MeshT &mesh, const char *propname) {
* @tparam T Value type of the expected property, e.g., \p double, \p int, etc. * @tparam T Value type of the expected property, e.g., \p double, \p int, etc.
* @tparam MeshT Type of the mesh. Can often be inferred from \p mesh * @tparam MeshT Type of the mesh. Can often be inferred from \p mesh
*/ */
template<typename ElementT, typename T, typename MeshT> template<typename ElementT, typename T>
bool bool
hasProperty(const MeshT &mesh, const char *propname) { hasProperty(const PolyConnectivity &mesh, const char *propname) {
typename HandleToPropHandle<ElementT, T>::type ph; typename HandleToPropHandle<ElementT, T>::type ph;
return mesh.get_property_handle(ph, propname); return mesh.get_property_handle(ph, propname);
} }
@@ -633,11 +649,11 @@ hasProperty(const MeshT &mesh, const char *propname) {
* Intended for temporary properties. Shadows any existing properties of * Intended for temporary properties. Shadows any existing properties of
* matching name and type. * matching name and type.
*/ */
template<typename PROPTYPE, typename MeshT> template<typename PROPTYPE>
OM_DEPRECATED("Use makeTemporaryProperty instead.") OM_DEPRECATED("Use makeTemporaryProperty instead.")
PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromNew(MeshT &mesh, const char *propname) PropertyManager<PROPTYPE> makePropertyManagerFromNew(PolyConnectivity &mesh, const char *propname)
{ {
return PropertyManager<PROPTYPE, MeshT>(mesh, propname, false); return PropertyManager<PROPTYPE>(mesh, propname, false);
} }
/** \relates PropertyManager /** \relates PropertyManager
@@ -652,11 +668,11 @@ PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromNew(MeshT &mesh, const c
* @throws std::runtime_error if no property with the name \p propname of * @throws std::runtime_error if no property with the name \p propname of
* matching type exists. * matching type exists.
*/ */
template<typename PROPTYPE, typename MeshT> template<typename PROPTYPE>
OM_DEPRECATED("Use getProperty instead.") OM_DEPRECATED("Use getProperty instead.")
PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromExisting(MeshT &mesh, const char *propname) PropertyManager<PROPTYPE> makePropertyManagerFromExisting(PolyConnectivity &mesh, const char *propname)
{ {
return PropertyManager<PROPTYPE, MeshT>(mesh, propname, true); return PropertyManager<PROPTYPE>(mesh, propname, true);
} }
/** @relates PropertyManager /** @relates PropertyManager
@@ -667,11 +683,11 @@ PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromExisting(MeshT &mesh, co
* *
* Intended for creating or accessing persistent properties. * Intended for creating or accessing persistent properties.
*/ */
template<typename PROPTYPE, typename MeshT> template<typename PROPTYPE>
OM_DEPRECATED("Use getOrMakeProperty instead.") OM_DEPRECATED("Use getOrMakeProperty instead.")
PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromExistingOrNew(MeshT &mesh, const char *propname) PropertyManager<PROPTYPE> makePropertyManagerFromExistingOrNew(PolyConnectivity &mesh, const char *propname)
{ {
return PropertyManager<PROPTYPE, MeshT>::createIfNotExists(mesh, propname); return PropertyManager<PROPTYPE>::createIfNotExists(mesh, propname);
} }
/** @relates PropertyManager /** @relates PropertyManager
@@ -707,14 +723,14 @@ PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromExistingOrNew(
* *
* Intended for creating or accessing persistent properties. * Intended for creating or accessing persistent properties.
*/ */
template<typename PROPTYPE, typename MeshT, template<typename PROPTYPE,
typename ITERATOR_RANGE, typename PROP_VALUE> typename ITERATOR_RANGE, typename PROP_VALUE>
OM_DEPRECATED("Use getOrMakeProperty instead.") OM_DEPRECATED("Use getOrMakeProperty instead.")
PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromExistingOrNew( PropertyManager<PROPTYPE> makePropertyManagerFromExistingOrNew(
MeshT &mesh, const char *propname, PolyConnectivity &mesh, const char *propname,
const ITERATOR_RANGE &range, const ITERATOR_RANGE &range,
const PROP_VALUE &init_value) { const PROP_VALUE &init_value) {
return makePropertyManagerFromExistingOrNew<PROPTYPE, MeshT>( return makePropertyManagerFromExistingOrNew<PROPTYPE>(
mesh, propname, range.begin(), range.end(), init_value); mesh, propname, range.begin(), range.end(), init_value);
} }