diff --git a/src/OpenMesh/Core/Utils/PropertyManager.hh b/src/OpenMesh/Core/Utils/PropertyManager.hh index b00d6c54..89242de7 100644 --- a/src/OpenMesh/Core/Utils/PropertyManager.hh +++ b/src/OpenMesh/Core/Utils/PropertyManager.hh @@ -57,7 +57,7 @@ namespace OpenMesh { * * \code * TriMesh mesh; - * PropertyManager, MeshT> visited(mesh, "visited.plugin-example.i8.informatik.rwth-aachen.de"); + * PropertyManager, TriMesh> visited(mesh, "visited.plugin-example.i8.informatik.rwth-aachen.de"); * * for (TriMesh::VertexIter vh_it = mesh.begin(); ... ; ...) { * if (!visited[*vh_it]) { @@ -320,6 +320,40 @@ class PropertyManager { (*this)[*begin] = value; } + /** + * Conveniently transfer the values managed by one property manager + * onto the values managed by a different property manager. + * + * @param begin Start iterator. Needs to dereference to HandleType. Will + * be used with this property manager. + * @param end End iterator. (Exclusive.) Will be used with this property + * manager. + * @param dst_propmanager The destination property manager. + * @param dst_begin Start iterator. Needs to dereference to the + * HandleType of dst_propmanager. Will be used with dst_propmanager. + * @param dst_end End iterator. (Exclusive.) + * Will be used with dst_propmanager. Used to double check the bounds. + */ + template + void copy_to(HandleTypeIterator begin, HandleTypeIterator end, + PropertyManager &dst_propmanager, + HandleTypeIterator_2 dst_begin, HandleTypeIterator_2 dst_end) const { + + for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) { + dst_propmanager[dst_begin] = (*this)[*begin]; + } + } + + template + void copy_to(RangeType range, + PropertyManager &dst_propmanager, + RangeType_2 dst_range) const { + copy_to(range.begin(), range.end(), dst_propmanager, + dst_range.begin(), dst_range.end()); + } + private: void deleteProperty() { if (!retain_)