42 #ifndef PROPERTYMANAGER_HH_
43 #define PROPERTYMANAGER_HH_
70 template<
typename PROPTYPE,
typename MeshT>
72 #if __cplusplus > 199711L or __GXX_EXPERIMENTAL_CXX0X__
104 PropertyManager(MeshT &mesh,
const char *propname,
bool existing =
false) : mesh_(&mesh), retain_(existing), name_(propname) {
106 if (!mesh_->get_property_handle(prop_, propname)) {
107 std::ostringstream oss;
108 oss <<
"Requested property handle \"" << propname <<
"\" does not exist.";
109 throw std::runtime_error(oss.str());
112 mesh_->add_property(prop_, propname);
123 void swap(PropertyManager &rhs) {
124 std::swap(mesh_, rhs.mesh_);
125 std::swap(prop_, rhs.prop_);
126 std::swap(retain_, rhs.retain_);
127 std::swap(name_, rhs.name_);
130 static bool propertyExists(MeshT &mesh,
const char *propname) {
132 return mesh.get_property_handle(dummy, propname);
135 bool isValid()
const {
return mesh_ != 0; }
136 operator bool()
const {
return isValid(); }
138 const PROPTYPE &getRawProperty()
const {
return prop_; }
140 const std::string &getName()
const {
return name_; }
142 MeshT &getMesh()
const {
return *mesh_; }
144 #if __cplusplus > 199711L or __GXX_EXPERIMENTAL_CXX0X__
148 PropertyManager(PropertyManager &&rhs) : mesh_(rhs.mesh_), prop_(rhs.prop_), retain_(rhs.retain_), name_(rhs.name_) {
155 PropertyManager &operator=(PropertyManager &&rhs) {
161 retain_ = rhs.retain_;
175 PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));
177 return std::move(pm);
183 Proxy(MeshT *mesh_, PROPTYPE prop_,
bool retain_,
const std::string &name_) :
184 mesh_(mesh_), prop_(prop_), retain_(retain_), name_(name_) {}
194 Proxy p(mesh_, prop_, retain_, name_);
200 PropertyManager(Proxy p) : mesh_(p.mesh_), prop_(p.prop_), retain_(p.retain_), name_(p.name_) {}
202 PropertyManager &operator=(Proxy p) {
203 PropertyManager(p).swap(*
this);
214 PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));
226 inline void retain(
bool doRetain =
true) {
251 template<
typename HandleType>
252 inline typename PROPTYPE::reference
operator[] (
const HandleType &handle) {
253 return mesh_->property(prop_, handle);
263 template<
typename HandleType>
264 inline typename PROPTYPE::const_reference
operator[] (
const HandleType &handle)
const {
265 return mesh_->property(prop_, handle);
269 void deleteProperty() {
271 mesh_->remove_property(prop_);
Definition: PropertyManager.hh:181
PropertyManager(MeshT &mesh, const char *propname, bool existing=false)
Constructor.
Definition: PropertyManager.hh:104
PROPTYPE & operator*()
Access the encapsulated property.
Definition: PropertyManager.hh:233
PROPTYPE::reference operator[](const HandleType &handle)
Enables convenient access to the encapsulated property.
Definition: PropertyManager.hh:252
static Proxy createIfNotExists(MeshT &mesh, const char *propname)
Create a property manager for the supplied property and mesh.
Definition: PropertyManager.hh:212
void retain(bool doRetain=true)
Disable lifecycle management for this property.
Definition: PropertyManager.hh:226
This class is intended to manage the lifecycle of properties.
Definition: PropertyManager.hh:71