X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fprops%2FpropertyObject.hxx;h=5cc1588ba0514dd8f264b419ace108b6472e6e2c;hb=708ae35068499af33329f9db91f55441f4956acb;hp=7aeb0337285217166133f849807425db6b7f7708;hpb=ac535de2fa614e7ee18b766874c937ddc6476af6;p=simgear.git diff --git a/simgear/props/propertyObject.hxx b/simgear/props/propertyObject.hxx index 7aeb0337..5cc1588b 100644 --- a/simgear/props/propertyObject.hxx +++ b/simgear/props/propertyObject.hxx @@ -19,7 +19,6 @@ #define SG_PROPERTY_OBJECT #include -#include namespace simgear { @@ -37,9 +36,20 @@ public: SGPropertyNode* node(bool aCreate) const; + /** + * Resolve the property node, or throw an exception if it could not + * be resolved. + */ + SGPropertyNode* getOrThrow() const; protected: - SGPropertyNode* _base; - const char* _path; + mutable const char* _path; + + /** + * Important - if _path is NULL, this is the actual prop. + * If path is non-NULL, this is the parent which path should be resolved + * against (or NULL, if _path is absolute). Use node() instead of accessing + * this directly, and the above is handled automatically. + */ mutable SGPropertyNode* _prop; }; @@ -94,12 +104,7 @@ public: // conversion operators operator T () const { - SGPropertyNode* n = node(); - if (!n) { - throw sg_exception("read of undefined property:", _path); - } - - return n->getValue(); + return getOrThrow()->getValue(); } T operator=(const T& aValue) @@ -138,16 +143,38 @@ public: } +// copy-constructor + PropertyObject(const PropertyObject& aOther) : + PropertyObjectBase(aOther) + { + } + +// create form + static PropertyObject create(const char* aPath, const std::string& aValue) + { + PropertyObject p(aPath); + p = aValue; + return p; + } + + static PropertyObject create(SGPropertyNode* aNode, const std::string& aValue) + { + PropertyObject p(aNode); + p = aValue; + return p; + } + static PropertyObject create(SGPropertyNode* aNode, const char* aChild, const std::string& aValue) + { + PropertyObject p(aNode, aChild); + p = aValue; + return p; + } + operator std::string () const { - SGPropertyNode* n = node(); - if (!n) { - throw sg_exception("read of undefined property:", _path); - } - - return n->getStringValue(); + return getOrThrow()->getStringValue(); } const char* operator=(const char* aValue) @@ -193,9 +220,11 @@ private: } // of namespace simgear +/* typedef simgear::PropertyObject SGPropObjDouble; typedef simgear::PropertyObject SGPropObjBool; typedef simgear::PropertyObject SGPropObjString; typedef simgear::PropertyObject SGPropObjInt; +*/ #endif