open_toontown_panda3d/panda/src/putil/linkedListNode.I

136 lines
4.8 KiB
Plaintext

// Filename: linkedListNode.I
// Created by: drose (16Mar06)
//
////////////////////////////////////////////////////////////////////
//
// 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."
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::Constructor
// Access: Protected
// Description:
////////////////////////////////////////////////////////////////////
INLINE LinkedListNode::
LinkedListNode() {
#ifndef NDEBUG
_next = NULL;
_prev = NULL;
#endif
}
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::Constructor 2
// Access: Protected
// Description: This constructor should be invoked for any
// LinkedListNodes that will be used to serve as the
// root of a list. It sets up the pointers as an empty
// list.
////////////////////////////////////////////////////////////////////
INLINE LinkedListNode::
LinkedListNode(bool) {
_next = this;
_prev = this;
}
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::Destructor
// Access: Protected
// Description:
////////////////////////////////////////////////////////////////////
INLINE LinkedListNode::
~LinkedListNode() {
nassertv((_next == NULL && _prev == NULL) || (_next == this && _prev == this));
}
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::is_on_list
// Access: Protected
// Description: Returns true if the node is member of any list, false
// if it has been removed or never added. The head of a
// list generally appears to to always be a member of
// itself.
////////////////////////////////////////////////////////////////////
INLINE bool LinkedListNode::
is_on_list() const {
return (_next != NULL);
}
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::remove_from_list
// Access: Protected
// Description: Removes a LinkedListNode record from the
// doubly-linked list.
////////////////////////////////////////////////////////////////////
INLINE void LinkedListNode::
remove_from_list() {
nassertv(_prev != NULL && _next != NULL);
nassertv(_prev->_next == this && _next->_prev == this);
_prev->_next = _next;
_next->_prev = _prev;
#ifndef NDEBUG
_next = NULL;
_prev = NULL;
#endif
}
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::insert_before
// Access: Protected
// Description: Adds a LinkedListNode record before the indicated
// node in the doubly-linked list.
////////////////////////////////////////////////////////////////////
INLINE void LinkedListNode::
insert_before(LinkedListNode *node) {
nassertv(node->_prev != NULL && node->_prev->_next == node && node->_next->_prev == node);
nassertv(_prev == (LinkedListNode *)NULL &&
_next == (LinkedListNode *)NULL);
_prev = node->_prev;
_next = node;
_prev->_next = this;
node->_prev = this;
}
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::insert_after
// Access: Protected
// Description: Adds a LinkedListNode record after the indicated
// node in the doubly-linked list.
////////////////////////////////////////////////////////////////////
INLINE void LinkedListNode::
insert_after(LinkedListNode *node) {
nassertv(node->_prev != NULL && node->_prev->_next == node && node->_next->_prev == node);
nassertv(_prev == (LinkedListNode *)NULL &&
_next == (LinkedListNode *)NULL);
_next = node->_next;
_prev = node;
_next->_prev = this;
node->_next = this;
}
////////////////////////////////////////////////////////////////////
// Function: LinkedListNode::take_list_from
// Access: Protected
// Description: Given that this LinkedListNode represents the root of
// a list, and the other pointer represents the root of
// a different list, move all of the nodes (except the
// root itself) from other_root onto this list.
////////////////////////////////////////////////////////////////////
INLINE void LinkedListNode::
take_list_from(LinkedListNode *other_root) {
other_root->_next->_prev = _prev;
_prev->_next = other_root->_next;
other_root->_prev->_next = this;
_prev = other_root->_prev;
other_root->_next = other_root;
other_root->_prev = other_root;
}