42 #include <type_traits> 44 #include "OpenVolumeMeshProperty.hh" 45 #include "PropertyHandles.hh" 46 #include "TypeName.hh" 47 #include "ForwardDeclarations.hh" 63 template <
class PropT,
class HandleT>
friend class PropertyPtr;
99 template <
typename PropIterator,
typename Handle>
100 void swap_property_elements(PropIterator _begin, PropIterator _end, Handle _h1, Handle _h2)
102 PropIterator p_iter = _begin;
103 for (; p_iter != _end; ++p_iter)
104 (*p_iter)->swap_elements(_h1.uidx(), _h2.uidx());
110 void clear_vertex_props() { clearVec(vertex_props_); }
112 void clear_edge_props() { clearVec(edge_props_); }
114 void clear_halfedge_props() { clearVec(halfedge_props_); }
116 void clear_face_props() { clearVec(face_props_); }
118 void clear_halfface_props() { clearVec(halfface_props_); }
120 void clear_cell_props() { clearVec(cell_props_); }
122 void clear_mesh_props() { clearVec(mesh_props_); }
127 virtual size_t n_edges()
const = 0;
131 virtual size_t n_faces()
const = 0;
135 virtual size_t n_cells()
const = 0;
143 template<
class T>
VertexPropertyT<T> request_vertex_property(
const std::string& _name = std::string(),
const T _def = T());
145 template<
class T>
EdgePropertyT<T> request_edge_property(
const std::string& _name = std::string(),
const T _def = T());
147 template<
class T>
HalfEdgePropertyT<T> request_halfedge_property(
const std::string& _name = std::string(),
const T _def = T());
149 template<
class T>
FacePropertyT<T> request_face_property(
const std::string& _name = std::string(),
const T _def = T());
151 template<
class T>
HalfFacePropertyT<T> request_halfface_property(
const std::string& _name = std::string(),
const T _def = T());
153 template<
class T>
CellPropertyT<T> request_cell_property(
const std::string& _name = std::string(),
const T _def = T());
155 template<
class T>
MeshPropertyT<T> request_mesh_property(
const std::string& _name = std::string(),
const T _def = T());
176 size_t n_vertex_props()
const {
return vertex_props_.size(); }
178 size_t n_edge_props()
const {
return edge_props_.size(); }
180 size_t n_halfedge_props()
const {
return halfedge_props_.size(); }
182 size_t n_face_props()
const {
return face_props_.size(); }
184 size_t n_halfface_props()
const {
return halfface_props_.size(); }
186 size_t n_cell_props()
const {
return cell_props_.size(); }
188 size_t n_mesh_props()
const {
return mesh_props_.size(); }
190 template<
typename T,
class EntityTag>
193 typedef std::vector<BaseProperty*> Properties;
195 Properties::const_iterator vertex_props_begin()
const {
return vertex_props_.begin(); }
197 Properties::const_iterator vertex_props_end()
const {
return vertex_props_.end(); }
199 Properties::const_iterator edge_props_begin()
const {
return edge_props_.begin(); }
201 Properties::const_iterator edge_props_end()
const {
return edge_props_.end(); }
203 Properties::const_iterator halfedge_props_begin()
const {
return halfedge_props_.begin(); }
205 Properties::const_iterator halfedge_props_end()
const {
return halfedge_props_.end(); }
207 Properties::const_iterator face_props_begin()
const {
return face_props_.begin(); }
209 Properties::const_iterator face_props_end()
const {
return face_props_.end(); }
211 Properties::const_iterator halfface_props_begin()
const {
return halfface_props_.begin(); }
213 Properties::const_iterator halfface_props_end()
const {
return halfface_props_.end(); }
215 Properties::const_iterator cell_props_begin()
const {
return cell_props_.begin(); }
217 Properties::const_iterator cell_props_end()
const {
return cell_props_.end(); }
219 Properties::const_iterator mesh_props_begin()
const {
return mesh_props_.begin(); }
221 Properties::const_iterator mesh_props_end()
const {
return mesh_props_.end(); }
225 template <
class FullPropT,
class PropIterT>
226 bool property_exists(
const PropIterT& _begin,
const PropIterT& _end,
const std::string& _name)
const 228 auto type_name = get_type_name<typename FullPropT::value_type>();
232 std::cerr <<
"property_exists(): Checking for the existence of anonymous properties is" << std::endl;
233 std::cerr <<
"ambiguous!" << std::endl;
238 PropIterT it = _begin;
239 for(; it != _end; ++it)
241 if((*it)->name() == _name
242 && (*it)->internal_type_name() == type_name)
252 template <
class PropT>
253 bool vertex_property_exists(
const std::string& _name)
const {
254 return property_exists<VertexPropertyT<PropT> >(vertex_props_begin(), vertex_props_end(), _name);
257 template <
class PropT>
258 bool edge_property_exists(
const std::string& _name)
const {
259 return property_exists<EdgePropertyT<PropT> >(edge_props_begin(), edge_props_end(), _name);
262 template <
class PropT>
263 bool halfedge_property_exists(
const std::string& _name)
const {
264 return property_exists<HalfEdgePropertyT<PropT> >(halfedge_props_begin(), halfedge_props_end(), _name);
267 template <
class PropT>
268 bool face_property_exists(
const std::string& _name)
const {
269 return property_exists<FacePropertyT<PropT> >(face_props_begin(), face_props_end(), _name);
272 template <
class PropT>
273 bool halfface_property_exists(
const std::string& _name)
const {
274 return property_exists<HalfFacePropertyT<PropT> >(halfface_props_begin(), halfface_props_end(), _name);
277 template <
class PropT>
278 bool cell_property_exists(
const std::string& _name)
const {
279 return property_exists<CellPropertyT<PropT> >(cell_props_begin(), cell_props_end(), _name);
282 template <
class PropT>
283 bool mesh_property_exists(
const std::string& _name)
const {
284 return property_exists<MeshPropertyT<PropT> >(mesh_props_begin(), mesh_props_end(), _name);
289 void delete_multiple_vertex_props(
const std::vector<bool>& _tags);
291 void delete_multiple_edge_props(
const std::vector<bool>& _tags);
293 void delete_multiple_face_props(
const std::vector<bool>& _tags);
295 void delete_multiple_cell_props(
const std::vector<bool>& _tags);
299 template<
class StdVecT>
300 void resize_props(StdVecT& _vec,
size_t _n);
302 template<
class StdVecT>
305 template<
class StdVecT>
306 void remove_property(StdVecT& _vec,
size_t _idx);
308 template<
class StdVecT,
class PropT,
class HandleT,
class T>
309 PropT internal_request_property(StdVecT& _vec,
const std::string& _name,
size_t _size,
const T _def = T());
311 template<
class StdVecT>
312 void clearVec(StdVecT& _vec);
314 template<
class StdVecT>
315 void updatePropHandles(StdVecT& _vec);
318 void assignProperties(
typename std::conditional<Move, Properties&, const Properties&>::type src,
321 void assignAllPropertiesFrom(
typename std::conditional<Move, ResourceManager*, const ResourceManager*>::type src);
323 Properties vertex_props_;
325 Properties edge_props_;
327 Properties halfedge_props_;
329 Properties face_props_;
331 Properties halfface_props_;
333 Properties cell_props_;
335 Properties mesh_props_;
340 #if defined(INCLUDE_TEMPLATES) && !defined(RESOURCEMANAGERT_CC) 341 #include "ResourceManagerT_impl.hh" void resize_cprops(size_t _nc)
Change size of stored cell properties.
virtual size_t n_edges() const =0
Get number of edges in mesh.
void resize_eprops(size_t _ne)
Change size of stored edge properties.
virtual size_t n_cells() const =0
Get number of cells in mesh.
virtual size_t n_halfedges() const =0
Get number of halfedges in mesh.
void resize_fprops(size_t _nf)
Change size of stored face properties.
virtual size_t n_halffaces() const =0
Get number of halffaces in mesh.
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.
void resize_vprops(size_t _nv)
Change size of stored vertex properties.