Developer Documentation
ResourceManagerT_impl.hh
1 /*===========================================================================*\
2  * *
3  * OpenVolumeMesh *
4  * Copyright (C) 2011 by Computer Graphics Group, RWTH Aachen *
5  * www.openvolumemesh.org *
6  * *
7  *---------------------------------------------------------------------------*
8  * This file is part of OpenVolumeMesh. *
9  * *
10  * OpenVolumeMesh is free software: you can redistribute it and/or modify *
11  * it under the terms of the GNU Lesser General Public License as *
12  * published by the Free Software Foundation, either version 3 of *
13  * the License, or (at your option) any later version with the *
14  * following exceptions: *
15  * *
16  * If other files instantiate templates or use macros *
17  * or inline functions from this file, or you compile this file and *
18  * link it with other files to produce an executable, this file does *
19  * not by itself cause the resulting executable to be covered by the *
20  * GNU Lesser General Public License. This exception does not however *
21  * invalidate any other reasons why the executable file might be *
22  * covered by the GNU Lesser General Public License. *
23  * *
24  * OpenVolumeMesh is distributed in the hope that it will be useful, *
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
27  * GNU Lesser General Public License for more details. *
28  * *
29  * You should have received a copy of the GNU LesserGeneral Public *
30  * License along with OpenVolumeMesh. If not, *
31  * see <http://www.gnu.org/licenses/>. *
32  * *
33 \*===========================================================================*/
34 
35 #define RESOURCEMANAGERT_CC
36 
37 #include "ResourceManager.hh"
38 #include "PropertyDefines.hh"
39 #include "TypeName.hh"
40 
41 namespace OpenVolumeMesh {
42 
43 
44 template<class T>
45 VertexPropertyT<T> ResourceManager::request_vertex_property(const std::string& _name, const T _def) {
46 
47  return internal_request_property<std::vector<BaseProperty*>,VertexPropertyT<T>,VertexPropHandle,T>(vertex_props_, _name, n_vertices(), _def);
48 }
49 
50 template<class T>
51 EdgePropertyT<T> ResourceManager::request_edge_property(const std::string& _name, const T _def) {
52 
53  return internal_request_property<std::vector<BaseProperty*>,EdgePropertyT<T>,EdgePropHandle,T>(edge_props_, _name, n_edges(), _def);
54 }
55 
56 template<class T>
57 HalfEdgePropertyT<T> ResourceManager::request_halfedge_property(const std::string& _name, const T _def) {
58 
59  return internal_request_property<std::vector<BaseProperty*>,HalfEdgePropertyT<T>,HalfEdgePropHandle,T>(halfedge_props_, _name, n_edges()*2u, _def);
60 }
61 
62 template<class T>
63 FacePropertyT<T> ResourceManager::request_face_property(const std::string& _name, const T _def) {
64 
65  return internal_request_property<std::vector<BaseProperty*>,FacePropertyT<T>,FacePropHandle,T>(face_props_, _name, n_faces(), _def);
66 }
67 
68 template<class T>
69 HalfFacePropertyT<T> ResourceManager::request_halfface_property(const std::string& _name, const T _def) {
70 
71  return internal_request_property<std::vector<BaseProperty*>,HalfFacePropertyT<T>,HalfFacePropHandle,T>(halfface_props_, _name, n_faces()*2u, _def);
72 }
73 
74 template<class T>
75 CellPropertyT<T> ResourceManager::request_cell_property(const std::string& _name, const T _def) {
76 
77  return internal_request_property<std::vector<BaseProperty*>,CellPropertyT<T>,CellPropHandle,T>(cell_props_, _name, n_cells(), _def);
78 }
79 
80 template<class T>
81 MeshPropertyT<T> ResourceManager::request_mesh_property(const std::string& _name, const T _def) {
82 
83  return internal_request_property<std::vector<BaseProperty*>,MeshPropertyT<T>,MeshPropHandle,T>(mesh_props_, _name, 1, _def);
84 }
85 
86 template<class StdVecT, class PropT, class HandleT, class T>
87 PropT ResourceManager::internal_request_property(StdVecT& _vec, const std::string& _name, size_t _size, const T _def)
88 {
89  auto type_name = get_type_name<T>();
90 
91  if(!_name.empty()) {
92  for(typename StdVecT::iterator it = _vec.begin();
93  it != _vec.end(); ++it) {
94  if((*it)->name() == _name
95  && (*it)->internal_type_name() == type_name)
96  {
97  return *static_cast<PropT*>(*it);
98  }
99  }
100  }
101 
102  auto handle = HandleT::from_unsigned(_vec.size());
103 
104  PropT* prop = new PropT(_name, type_name, *this, handle, _def);
105  prop->resize(_size);
106 
107  // Store property pointer
108  _vec.push_back(prop);
109 
110  return *prop;
111 }
112 
113 // request_property: work around C++ currently now allowing partial specialisation on functions by using structs:
114 
115 template<class T, typename EntityTag>
117  static PropertyTT<T, EntityTag> _(ResourceManager* /*resman*/, const std::string& /*_name*/, const T /*_def*/);
118 };
119 
120 template<class T>
121 struct request_property_impl<T, Entity::Vertex>{
122  static PropertyTT<T, Entity::Vertex> _(ResourceManager *resman, const std::string &_name, const T _def) {
123  return resman->request_vertex_property<T>(_name, _def);
124  }
125 };
126 template<class T>
127 struct request_property_impl<T, Entity::Edge>{
128  static PropertyTT<T, Entity::Edge> _(ResourceManager *resman, const std::string &_name, const T _def) {
129  return resman->request_edge_property<T>(_name, _def);
130  }
131 };
132 template<class T>
133 struct request_property_impl<T, Entity::HalfEdge>{
134  static PropertyTT<T, Entity::HalfEdge> _(ResourceManager *resman, const std::string &_name, const T _def) {
135  return resman->request_halfedge_property<T>(_name, _def);
136  }
137 };
138 template<class T>
139 struct request_property_impl<T, Entity::Face>{
140  static PropertyTT<T, Entity::Face> _(ResourceManager *resman, const std::string &_name, const T _def) {
141  return resman->request_face_property<T>(_name, _def);
142  }
143 };
144 template<class T>
145 struct request_property_impl<T, Entity::HalfFace>{
146  static PropertyTT<T, Entity::HalfFace> _(ResourceManager *resman, const std::string &_name, const T _def) {
147  return resman->request_halfface_property<T>(_name, _def);
148  }
149 };
150 template<class T>
151 struct request_property_impl<T, Entity::Cell>{
152  static PropertyTT<T, Entity::Cell> _(ResourceManager *resman, const std::string &_name, const T _def) {
153  return resman->request_cell_property<T>(_name, _def);
154  }
155 };
156 
157 template<typename T, typename EntityTag>
158 PropertyTT<T, EntityTag> ResourceManager::request_property(const std::string& _name, const T _def)
159 {
160  return request_property_impl<T, EntityTag>::_(this, _name, _def);
161 }
162 
163 
164 template<typename T, class EntityTag>
165 void ResourceManager::set_persistent(PropertyTT<T, EntityTag>& _prop, bool _flag)
166 {
167  if(_flag == _prop->persistent()) return;
168  _prop->set_persistent(_flag);
169 }
170 
171 template<class StdVecT>
172 void ResourceManager::remove_property(StdVecT& _vec, size_t _idx) {
173 
174  auto prop_ptr = _vec[_idx];
175  prop_ptr->setResMan(nullptr);
176  delete prop_ptr;
177  _vec.erase(_vec.begin() + _idx);
178  updatePropHandles(_vec);
179 }
180 
181 template<class StdVecT>
182 void ResourceManager::resize_props(StdVecT& _vec, size_t _n) {
183 
184  for(typename StdVecT::iterator it = _vec.begin();
185  it != _vec.end(); ++it) {
186  (*it)->resize(_n);
187  }
188 }
189 
190 template<class StdVecT>
191 void ResourceManager::entity_deleted(StdVecT& _vec, const OpenVolumeMeshHandle& _h) {
192 
193  for(typename StdVecT::iterator it = _vec.begin();
194  it != _vec.end(); ++it) {
195  (*it)->delete_element(_h.uidx());
196  }
197 }
198 
199 template<class StdVecT>
200 void ResourceManager::clearVec(StdVecT& _vec) {
201 
202  for (auto prop: _vec) {
203  prop->setResMan(nullptr);
204  delete prop;
205  }
206  _vec.clear();
207 }
208 
209 template<class StdVecT>
210 void ResourceManager::updatePropHandles(StdVecT &_vec)
211 {
212  size_t n = _vec.size();
213  for(size_t i = 0; i < n; ++i) {
214  _vec[i]->set_handle(OpenVolumeMeshHandle(static_cast<int>(i)));
215  }
216 }
217 
218 } // Namespace OpenVolumeMesh
virtual size_t n_edges() const =0
Get number of edges in mesh.
virtual size_t n_cells() const =0
Get number of cells in mesh.
size_t uidx() const
return unsigned idx - handle must be valid
virtual size_t n_vertices() const =0
Get number of vertices in mesh.
virtual size_t n_faces() const =0
Get number of faces in mesh.