35#include <OpenVolumeMesh/Core/ResourceManager.hh>
37namespace OpenVolumeMesh {
39ResourceManager::ResourceManager(
const ResourceManager &other)
41 clone_persistent_properties_from(other);
56 if (
this == &other)
return *
this;
62 for_each_entity([&](
auto entity_tag) {
63 resize_props<decltype(entity_tag)>(other.
n<
decltype(entity_tag)>());
66 clone_persistent_properties_from(other);
72void ResourceManager::clone_persistent_properties_from(
ResourceManager const& other)
74 for_each_entity([&](
auto entity_tag) {
75 using ET =
decltype(entity_tag);
76 const auto &other_props = other.persistent_props_.get<ET>();
77 auto &our_props = persistent_props_.get<ET>();
78 for(
const auto &p: other_props) {
79 auto copy = p->clone();
80 copy->set_tracker(&storage_tracker<ET>());
81 our_props.insert(copy->shared_from_this());
87detail::Tracker<PropertyStorageBase> &
88ResourceManager::storage_tracker(EntityType type)
const
90 return storage_trackers_.get(type);
94 resize_props<Entity::Vertex>(_nv);
98 resize_props<Entity::Edge>(_ne);
99 resize_props<Entity::HalfEdge>(2 * _ne);
103 resize_props<Entity::Face>(_nf);
104 resize_props<Entity::HalfFace>(2 * _nf);
108 resize_props<Entity::Cell>(_nc);
111void ResourceManager::reserve_vprops(
size_t _n) {
112 reserve_props<Entity::Vertex>(_n);
114void ResourceManager::reserve_eprops(
size_t _n) {
115 reserve_props<Entity::Edge>(_n);
116 reserve_props<Entity::HalfEdge>(2 * _n);
118void ResourceManager::reserve_fprops(
size_t _n) {
119 reserve_props<Entity::Face>(_n);
120 reserve_props<Entity::HalfFace>(2 * _n);
122void ResourceManager::reserve_cprops(
size_t _n) {
123 reserve_props<Entity::Cell>(_n);
127void ResourceManager::vertex_deleted(
const VertexHandle& _h) {
131void ResourceManager::edge_deleted(
const EdgeHandle& _h) {
133 entity_deleted(_h.halfedge_handle(1));
134 entity_deleted(_h.halfedge_handle(0));
137void ResourceManager::face_deleted(
const FaceHandle& _h)
140 entity_deleted(_h.halfface_handle(1));
141 entity_deleted(_h.halfface_handle(0));
144void ResourceManager::cell_deleted(
const CellHandle& _h) {
150 for_each_entity([
this](
auto entity_tag){ clear_props<decltype(entity_tag)>();});
154template<>
size_t OVM_EXPORT ResourceManager::n<Entity::Vertex>()
const {
return n_vertices(); }
155template<>
size_t OVM_EXPORT ResourceManager::n<Entity::Edge>()
const {
return n_edges(); }
156template<>
size_t OVM_EXPORT ResourceManager::n<Entity::HalfEdge>()
const {
return n_halfedges(); }
157template<>
size_t OVM_EXPORT ResourceManager::n<Entity::Face>()
const {
return n_faces(); }
158template<>
size_t OVM_EXPORT ResourceManager::n<Entity::HalfFace>()
const {
return n_halffaces(); }
159template<>
size_t OVM_EXPORT ResourceManager::n<Entity::Cell>()
const {
return n_cells(); }
160template<>
size_t OVM_EXPORT ResourceManager::n<Entity::Mesh>()
const {
return 1; }
void resize_vprops(size_t _nv)
Change size of stored vertex properties.
size_t n() const
Get number of entities of given kind in mesh.
ResourceManager & operator=(const ResourceManager &other)
void clear_all_props()
drop all persistent properties.
void resize_cprops(size_t _nc)
Change size of stored cell properties.
void resize_eprops(size_t _ne)
Change size of stored edge properties.
void resize_fprops(size_t _nf)
Change size of stored face properties.