49 #ifndef PROPERTYMANAGER_HH_ 50 #define PROPERTYMANAGER_HH_ 77 template<
typename PROPTYPE,
typename MeshT>
79 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) 111 PropertyManager(MeshT &mesh,
const char *propname,
bool existing =
false) : mesh_(&mesh), retain_(existing), name_(propname) {
113 if (!mesh_->get_property_handle(prop_, propname)) {
114 std::ostringstream oss;
115 oss <<
"Requested property handle \"" << propname <<
"\" does not exist.";
116 throw std::runtime_error(oss.str());
119 mesh_->add_property(prop_, propname);
131 std::swap(mesh_, rhs.mesh_);
132 std::swap(prop_, rhs.prop_);
133 std::swap(retain_, rhs.retain_);
134 std::swap(name_, rhs.name_);
137 static bool propertyExists(MeshT &mesh,
const char *propname) {
139 return mesh.get_property_handle(dummy, propname);
142 bool isValid()
const {
return mesh_ != 0; }
143 operator bool()
const {
return isValid(); }
145 const PROPTYPE &getRawProperty()
const {
return prop_; }
147 const std::string &getName()
const {
return name_; }
149 MeshT &getMesh()
const {
return *mesh_; }
151 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) 172 retain_ = rhs.retain_;
186 PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));
188 return std::move(pm);
194 pm.mesh_->property(pm.prop_) = mesh_->property(prop_);
195 return std::move(pm);
202 return std::move(*
this);
208 Proxy(MeshT *mesh_, PROPTYPE prop_,
bool retain_,
const std::string &name_) :
209 mesh_(mesh_), prop_(prop_), retain_(retain_), name_(name_) {}
219 Proxy p(mesh_, prop_, retain_, name_);
229 PropertyManager(Proxy p) : mesh_(p.mesh_), prop_(p.prop_), retain_(p.retain_), name_(p.name_) {}
243 PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));
248 Proxy duplicate(
const char *clone_name) {
250 pm.mesh_->property(pm.prop_) = mesh_->property(prop_);
261 inline void retain(
bool doRetain =
true) {
286 template<
typename HandleType>
287 inline typename PROPTYPE::reference
operator[] (
const HandleType &handle) {
288 return mesh_->property(prop_, handle);
298 template<
typename HandleType>
299 inline typename PROPTYPE::const_reference
operator[] (
const HandleType &handle)
const {
300 return mesh_->property(prop_, handle);
327 template<
typename HandleTypeIterator,
typename PROP_VALUE>
328 void set_range(HandleTypeIterator begin, HandleTypeIterator end,
329 const PROP_VALUE &value) {
330 for (; begin != end; ++begin)
331 (*
this)[*begin] = value;
348 template<
typename HandleTypeIterator,
typename PROPTYPE_2,
349 typename MeshT_2,
typename HandleTypeIterator_2>
350 void copy_to(HandleTypeIterator begin, HandleTypeIterator end,
352 HandleTypeIterator_2 dst_begin, HandleTypeIterator_2 dst_end)
const {
354 for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) {
355 dst_propmanager[*dst_begin] = (*this)[*begin];
359 template<
typename RangeType,
typename PROPTYPE_2,
360 typename MeshT_2,
typename RangeType_2>
361 void copy_to(
const RangeType &range,
363 const RangeType_2 &dst_range)
const {
364 copy_to(range.begin(), range.end(), dst_propmanager,
365 dst_range.begin(), dst_range.end());
382 template<
typename RangeType,
typename MeshT_2,
typename RangeType_2>
383 static void copy(
const char *prop_name,
384 MeshT &src_mesh,
const RangeType &src_range,
385 MeshT_2 &dst_mesh,
const RangeType_2 &dst_range) {
388 DstPM dst(DstPM::createIfNotExists(dst_mesh, prop_name));
391 SrcPM src(src_mesh, prop_name,
true);
393 src.copy_to(src_range, dst, dst_range);
397 void deleteProperty() {
399 mesh_->remove_property(prop_);
static Proxy createIfNotExists(MeshT &mesh, const char *propname)
Create a property manager for the supplied property and mesh.
Definition: PropertyManager.hh:241
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:64
PropertyManager(MeshT &mesh, const char *propname, bool existing=false)
Constructor.
Definition: PropertyManager.hh:111
PROPTYPE::reference operator[](const HandleType &handle)
Enables convenient access to the encapsulated property.
Definition: PropertyManager.hh:287
Definition: PropertyManager.hh:206
void set_range(HandleTypeIterator begin, HandleTypeIterator end, const PROP_VALUE &value)
Conveniently set the property for an entire range of values.
Definition: PropertyManager.hh:328
PROPTYPE & operator*()
Access the encapsulated property.
Definition: PropertyManager.hh:268
static void copy(const char *prop_name, MeshT &src_mesh, const RangeType &src_range, MeshT_2 &dst_mesh, const RangeType_2 &dst_range)
Copy the values of a property from a source range to a target range.
Definition: PropertyManager.hh:383
This class is intended to manage the lifecycle of properties.
Definition: PropertyManager.hh:78
void copy_to(HandleTypeIterator begin, HandleTypeIterator end, PropertyManager< PROPTYPE_2, MeshT_2 > &dst_propmanager, HandleTypeIterator_2 dst_begin, HandleTypeIterator_2 dst_end) const
Conveniently transfer the values managed by one property manager onto the values managed by a differe...
Definition: PropertyManager.hh:350
void retain(bool doRetain=true)
Disable lifecycle management for this property.
Definition: PropertyManager.hh:261