X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fprops%2Fprops.hxx;h=a80fc10ae7c9dc8415bcbd3d02de4673cdeb8b18;hb=bda8d34c2be22628e4641ef14985d3cd2cb51b90;hp=ee2e6b6f25f75da225ac2b21088f7ce5cc5f2222;hpb=b905f4b8aa74d2178ae80f2f5d5323a649d63229;p=simgear.git diff --git a/simgear/props/props.hxx b/simgear/props/props.hxx index ee2e6b6f..a80fc10a 100644 --- a/simgear/props/props.hxx +++ b/simgear/props/props.hxx @@ -994,7 +994,7 @@ public: /** * Get the path to this node from the root. */ - const char * getPath (bool simplify = false) const; + std::string getPath (bool simplify = false) const; /** @@ -1599,6 +1599,16 @@ public: */ void clearValue (); + /** + * Compare two property trees. The property trees are equal if: 1) + * They have no children, and have the same type and the values are + * equal, or 2) have the same number of children, and the + * corresponding children in each tree are equal. "corresponding" + * means have the same name and index. + * + * Attributes, removed children, and aliases aren't considered. + */ + static bool compare (const SGPropertyNode& lhs, const SGPropertyNode& rhs); protected: @@ -1615,7 +1625,7 @@ protected: private: - // Get the raw value + // Get the raw value bool get_bool () const; int get_int () const; long get_long () const; @@ -1623,7 +1633,7 @@ private: double get_double () const; const char * get_string () const; - // Set the raw value + // Set the raw value bool set_bool (bool value); bool set_int (int value); bool set_long (long value); @@ -1648,15 +1658,6 @@ private: */ void trace_write () const; - - /** - * Remove this node from all nodes that link to it in their path cache. - */ - void remove_from_path_caches(); - - - class hash_table; - int _index; std::string _name; /// To avoid cyclic reference counting loops this shall not be a reference @@ -1664,15 +1665,12 @@ private: SGPropertyNode * _parent; simgear::PropertyList _children; simgear::PropertyList _removedChildren; - std::vector _linkedNodes; - mutable std::string _path; mutable std::string _buffer; - hash_table * _path_cache; simgear::props::Type _type; bool _tied; int _attr; - // The right kind of pointer... + // The right kind of pointer... union { SGPropertyNode * alias; SGRaw* val; @@ -1689,66 +1687,7 @@ private: std::vector * _listeners; - - /** - * Register/unregister node that links to this node in its path cache. - */ - void add_linked_node (hash_table * node) { _linkedNodes.push_back(node); } - bool remove_linked_node (hash_table * node); - - - /** - * A very simple hash table. - */ - class hash_table { - public: - - /** - * An entry in a bucket in a hash table. - */ - class entry { - public: - entry (); - ~entry (); - const char * get_key () { return _key.c_str(); } - void set_key (const char * key); - SGPropertyNode * get_value () { return _value; } - void set_value (SGPropertyNode * value); - private: - std::string _key; - SGSharedPtr _value; - }; - - - /** - * A bucket in a hash table. - */ - class bucket { - public: - bucket (); - ~bucket (); - entry * get_entry (const char * key, bool create = false); - bool erase (SGPropertyNode * node); - void clear (hash_table * owner); - private: - int _length; - entry ** _entries; - }; - - friend class bucket; - - hash_table (); - ~hash_table (); - SGPropertyNode * get (const char * key); - void put (const char * key, SGPropertyNode * value); - bool erase (SGPropertyNode * node); - - private: - unsigned int hashcode (const char * key); - unsigned int _data_length; - bucket ** _data; - }; // Pass name as a pair of iterators template SGPropertyNode * getChildImpl (Itr begin, Itr end, int index = 0, bool create = false); @@ -1759,6 +1698,8 @@ private: template friend SGPropertyNode* find_node_aux(SGPropertyNode * current, SplitItr& itr, bool create, int last_index); + // For boost + friend size_t hash_value(const SGPropertyNode& node); }; // Convenience functions for use in templates @@ -1927,13 +1868,69 @@ inline bool SGPropertyNode::setValue(const T& val, } /** - * Utility function for creation of a child property node + * Utility function for creation of a child property node. */ inline SGPropertyNode* makeChild(SGPropertyNode* parent, const char* name, int index = 0) { return parent->getChild(name, index, true); } + +/** + * Utility function for creation of a child property node using a + * relative path. + */ +namespace simgear +{ +template +inline SGPropertyNode* makeNode(SGPropertyNode* parent, const StringType& name) +{ + return parent->getNode(name, true); +} +} + +// For boost::hash +size_t hash_value(const SGPropertyNode& node); + +// Helper comparison and hash functions for common cases + +namespace simgear +{ +namespace props +{ +struct Compare +{ + bool operator()(const SGPropertyNode* lhs, const SGPropertyNode* rhs) const + { + return SGPropertyNode::compare(*lhs, *rhs); + } + bool operator()(SGPropertyNode_ptr lhs, const SGPropertyNode* rhs) const + { + return SGPropertyNode::compare(*lhs, *rhs); + } + bool operator()(const SGPropertyNode* lhs, SGPropertyNode_ptr rhs) const + { + return SGPropertyNode::compare(*lhs, *rhs); + } + bool operator()(SGPropertyNode_ptr lhs, SGPropertyNode_ptr rhs) const + { + return SGPropertyNode::compare(*lhs, *rhs); + } +}; + +struct Hash +{ + size_t operator()(const SGPropertyNode* node) const + { + return hash_value(*node); + } + size_t operator()(SGPropertyNode_ptr node) const + { + return hash_value(*node); + } +}; +} +} #endif // __PROPS_HXX // end of props.hxx