| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- /**
- * PANDA 3D SOFTWARE
- * Copyright (c) Carnegie Mellon University. All rights reserved.
- *
- * All use of this software is subject to the terms of the revised BSD
- * license. You should have received a copy of this license along
- * with this source code in a file named "LICENSE."
- *
- * @file weakNodePath.I
- * @author drose
- * @date 2004-09-29
- */
- /**
- *
- */
- INLINE WeakNodePath::
- WeakNodePath(const NodePath &node_path) :
- _head(node_path._head),
- _backup_key(0)
- {
- }
- /**
- *
- */
- INLINE WeakNodePath::
- WeakNodePath(const WeakNodePath ©) :
- _head(copy._head),
- _backup_key(copy._backup_key)
- {
- }
- /**
- *
- */
- INLINE WeakNodePath::
- ~WeakNodePath() {
- }
- /**
- *
- */
- INLINE void WeakNodePath::
- operator = (const NodePath &node_path) {
- _head = node_path._head;
- _backup_key = 0;
- }
- /**
- *
- */
- INLINE void WeakNodePath::
- operator = (const WeakNodePath ©) {
- _head = copy._head;
- _backup_key = copy._backup_key;
- }
- /**
- * Sets this NodePath to the empty NodePath. It will no longer point to any
- * node.
- */
- INLINE void WeakNodePath::
- clear() {
- _head.clear();
- _backup_key = 0;
- }
- /**
- * Returns true if this NodePath points to a valid, non-null node.
- */
- INLINE WeakNodePath::
- operator bool () const {
- return _head.is_valid_pointer();
- }
- /**
- * Returns true if the NodePath contains no nodes, or if it has been deleted.
- */
- INLINE bool WeakNodePath::
- is_empty() const {
- return _head == nullptr || _head.was_deleted();
- }
- /**
- * Returns true if the NodePath we were referencing has been quietly deleted
- * outside of the WeakNodePath.
- */
- INLINE bool WeakNodePath::
- was_deleted() const {
- return _head != nullptr && _head.was_deleted();
- }
- /**
- * Returns the NodePath held within this object, or an empty NodePath with the
- * error flag set if the object was deleted.
- */
- INLINE NodePath WeakNodePath::
- get_node_path() const {
- NodePath result;
- result._head = _head.lock();
- if (!_head.is_null() && result._head == nullptr) {
- result._error_type = NodePath::ET_fail;
- }
- return result;
- }
- /**
- * Returns the PandaNode held within this object, or nullptr if the object was
- * deleted.
- */
- INLINE PT(PandaNode) WeakNodePath::
- node() const {
- if (auto head = _head.lock()) {
- return head->get_node();
- } else {
- return nullptr;
- }
- }
- /**
- * Returns true if the two paths are equivalent; that is, if they contain the
- * same list of nodes in the same order.
- */
- INLINE bool WeakNodePath::
- operator == (const NodePath &other) const {
- return _head.get_orig() == other._head && !_head.was_deleted();
- }
- /**
- * Returns true if the two paths are not equivalent.
- */
- INLINE bool WeakNodePath::
- operator != (const NodePath &other) const {
- return !operator == (other);
- }
- /**
- * Returns true if this NodePath sorts before the other one, false otherwise.
- * The sorting order of two nonequivalent NodePaths is consistent but
- * undefined, and is useful only for storing NodePaths in a sorted container
- * like an STL set.
- */
- INLINE bool WeakNodePath::
- operator < (const NodePath &other) const {
- return _head.owner_before(other._head);
- }
- /**
- * Returns a number less than zero if this NodePath sorts before the other
- * one, greater than zero if it sorts after, or zero if they are equivalent.
- *
- * Two NodePaths are considered equivalent if they consist of exactly the same
- * list of nodes in the same order. Otherwise, they are different; different
- * NodePaths will be ranked in a consistent but undefined ordering; the
- * ordering is useful only for placing the NodePaths in a sorted container
- * like an STL set.
- */
- INLINE int WeakNodePath::
- compare_to(const NodePath &other) const {
- if (operator != (other)) {
- return _head.owner_before(other._head) ? -1 : 1;
- }
- return 0;
- }
- /**
- * Returns true if the two paths are equivalent; that is, if they contain the
- * same list of nodes in the same order.
- */
- INLINE bool WeakNodePath::
- operator == (const WeakNodePath &other) const {
- return !_head.owner_before(other._head) && !other._head.owner_before(_head);
- }
- /**
- * Returns true if the two paths are not equivalent.
- */
- INLINE bool WeakNodePath::
- operator != (const WeakNodePath &other) const {
- return _head.owner_before(other._head) || other._head.owner_before(_head);
- }
- /**
- * Returns true if this WeakNodePath sorts before the other one, false
- * otherwise. The sorting order of two nonequivalent WeakNodePaths is
- * consistent but undefined, and is useful only for storing WeakNodePaths in a
- * sorted container like an STL set.
- */
- INLINE bool WeakNodePath::
- operator < (const WeakNodePath &other) const {
- return _head.owner_before(other._head);
- }
- /**
- * Returns a number less than zero if this WeakNodePath sorts before the other
- * one, greater than zero if it sorts after, or zero if they are equivalent.
- *
- * Two WeakNodePaths are considered equivalent if they consist of exactly the
- * same list of nodes in the same order. Otherwise, they are different;
- * different WeakNodePaths will be ranked in a consistent but undefined
- * ordering; the ordering is useful only for placing the WeakNodePaths in a
- * sorted container like an STL set.
- */
- INLINE int WeakNodePath::
- compare_to(const WeakNodePath &other) const {
- return other._head.owner_before(_head) - _head.owner_before(other._head);
- }
- /**
- * Returns the same values as NodePath::get_key().
- */
- INLINE int WeakNodePath::
- get_key() const {
- if (auto head = _head.lock()) {
- _backup_key = head->get_key();
- }
- return _backup_key;
- }
- INLINE std::ostream &operator << (std::ostream &out, const WeakNodePath &node_path) {
- node_path.output(out);
- return out;
- }
|