#include <Containers_T.h>
Inheritance diagram for ACE_Double_Linked_List< T >:
Public Types | |
typedef ACE_Double_Linked_List_Iterator< T > | ITERATOR |
typedef ACE_Double_Linked_List_Reverse_Iterator< T > | REVERSE_ITERATOR |
Public Member Functions | |
ACE_Double_Linked_List (ACE_Allocator *the_allocator=0) | |
ACE_Double_Linked_List (const ACE_Double_Linked_List< T > &) | |
Copy constructor. | |
void | operator= (const ACE_Double_Linked_List< T > &) |
Assignment operator. | |
~ACE_Double_Linked_List (void) | |
Destructor. | |
int | is_empty (void) const |
Returns 1 if the container is empty, 0 otherwise. | |
int | is_full (void) const |
The list is unbounded, so this always returns 0. | |
T * | insert_tail (T *new_item) |
T * | insert_head (T *new_item) |
T * | delete_head (void) |
Removes the head of the list and returns a pointer to that item. | |
T * | delete_tail (void) |
Removes the tail of the list and returns a pointer to that item. | |
void | reset (void) |
Empty the list. | |
int | get (T *&item, size_t slot=0) |
size_t | size (void) const |
The number of items in the queue. | |
void | dump (void) const |
Dump the state of an object. | |
int | remove (T *n) |
Use DNode address directly. | |
Public Attributes | |
ACE_ALLOC_HOOK_DECLARE | |
Declare the dynamic allocation hooks. | |
Protected Member Functions | |
void | delete_nodes (void) |
Delete all the nodes in the list. | |
void | copy_nodes (const ACE_Double_Linked_List< T > &rhs) |
Copy nodes from {rhs} into this list. | |
void | init_head (void) |
Setup header pointer. Called after we create the head node in ctor. | |
int | insert_element (T *new_item, int before=0, T *old_item=0) |
Constant time insert a new item into the list structure. | |
int | remove_element (T *item) |
Constant time delete an item from the list structure. | |
Protected Attributes | |
T * | head_ |
Head of the circular double-linked list. | |
size_t | size_ |
Size of this list. | |
ACE_Allocator * | allocator_ |
Allocation Strategy of the queue. | |
Friends | |
class | ACE_Double_Linked_List_Iterator_Base< T > |
class | ACE_Double_Linked_List_Iterator< T > |
class | ACE_Double_Linked_List_Reverse_Iterator< T > |
This implementation of an unbounded double-linked list uses a circular linked list with a dummy node. It is pretty much like the {ACE_Unbounded_Queue} except that it allows removing of a specific element from a specific location. Notice that this class is an implementation of a very simple data structure. This is *NOT* a container class. You can use the class to implement other contains classes but it is *NOT* a general purpose container class. The parameter class *MUST* have members T* prev and T* next and users of this class are responsible to follow the general rules of using double-linked lists to maintaining the list integrity. If you need a double linked container class, use the DLList class which is a container but delegates to the Double_Linked_List class.
Requirements and Performance Characteristics
Definition at line 823 of file Containers_T.h.
|
Definition at line 831 of file Containers_T.h. |
|
Definition at line 832 of file Containers_T.h. |
|
Initialize an empy list using the allocation strategy specified by the user. If none is specified, then use default allocation strategy. Definition at line 663 of file Containers_T.cpp. References ACE_NEW_MALLOC, ACE_Double_Linked_List< T >::init_head(), and ACE_Allocator::instance().
00664 : size_ (0), allocator_ (alloc) 00665 { 00666 if (this->allocator_ == 0) 00667 this->allocator_ = ACE_Allocator::instance (); 00668 00669 ACE_NEW_MALLOC (this->head_, 00670 (T *) this->allocator_->malloc (sizeof (T)), 00671 T); 00672 this->init_head (); 00673 } |
|
Copy constructor. Create a double linked list that is a copy of the provided parameter. Definition at line 676 of file Containers_T.cpp. References ACE_NEW_MALLOC, ACE_Double_Linked_List< T >::copy_nodes(), ACE_Double_Linked_List< T >::init_head(), ACE_Allocator::instance(), and ACE_Double_Linked_List< T >::size_.
00677 : allocator_ (cx.allocator_) 00678 { 00679 if (this->allocator_ == 0) 00680 this->allocator_ = ACE_Allocator::instance (); 00681 00682 ACE_NEW_MALLOC (this->head_, 00683 (T *) this->allocator_->malloc (sizeof (T)), 00684 T); 00685 this->init_head (); 00686 this->copy_nodes (cx); 00687 this->size_ = cx.size_; 00688 } |
|
Destructor. Clean up the memory allocated for the nodes of the list. Definition at line 701 of file Containers_T.cpp. References ACE_DES_FREE, and ACE_Double_Linked_List< T >::delete_nodes().
00702 { 00703 this->delete_nodes (); 00704 00705 ACE_DES_FREE (head_, 00706 this->allocator_->free, 00707 T); 00708 00709 this->head_ = 0; 00710 } |
|
Copy nodes from {rhs} into this list. Copy the elements of the provided list by allocated new nodes and assigning them with the proper data. Definition at line 846 of file Containers_T.cpp. References ACE_NEW_MALLOC, ACE_Double_Linked_List_Iterator< T >::advance(), ACE_Double_Linked_List_Iterator_Base< T >::done(), ACE_Double_Linked_List< T >::insert_tail(), and ACE_Double_Linked_List_Iterator_Base< T >::next(). Referenced by ACE_Double_Linked_List< T >::ACE_Double_Linked_List(), and ACE_Double_Linked_List< T >::operator=().
00847 { 00848 for (ACE_Double_Linked_List_Iterator<T> iter (c); 00849 !iter.done (); 00850 iter.advance ()) 00851 { 00852 T* temp = 0; 00853 ACE_NEW_MALLOC (temp, 00854 (T *)this->allocator_->malloc (sizeof (T)), 00855 T (*iter.next ())); 00856 this->insert_tail (temp); 00857 } 00858 } |
|
Removes the head of the list and returns a pointer to that item. Removes and returns the first {item} in the list. Returns internal node's address on success, 0 if the queue was empty. This method will *not* free the internal node. Reimplemented in ACE_DLList< T >. Definition at line 740 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::is_empty(), and ACE_Double_Linked_List< T >::remove_element(). Referenced by ACE_DLList< T >::delete_head(), and ACE_Thread_Manager::wait().
00741 { 00742 if (this->is_empty ()) 00743 return 0; 00744 00745 T *temp = static_cast<T *> (this->head_->next_); 00746 // Detach it from the list. 00747 this->remove_element (temp); 00748 return temp; 00749 } |
|
Delete all the nodes in the list. Removes and deallocates memory for all of the list nodes. Definition at line 833 of file Containers_T.cpp. References ACE_DES_FREE, ACE_Double_Linked_List< T >::is_empty(), and ACE_Double_Linked_List< T >::remove_element(). Referenced by ACE_Double_Linked_List< T >::operator=(), ACE_Double_Linked_List< T >::reset(), and ACE_Double_Linked_List< T >::~ACE_Double_Linked_List().
00834 { 00835 while (! this->is_empty ()) 00836 { 00837 T * temp = static_cast<T*> (this->head_->next_); 00838 this->remove_element (temp); 00839 ACE_DES_FREE (temp, 00840 this->allocator_->free, 00841 T); 00842 } 00843 } |
|
Removes the tail of the list and returns a pointer to that item. Removes and returns the last {item} in the list. Returns internal nodes's address on success, 0 if the queue was empty. This method will *not* free the internal node. Reimplemented in ACE_DLList< T >. Definition at line 752 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::is_empty(), and ACE_Double_Linked_List< T >::remove_element(). Referenced by ACE_DLList< T >::delete_tail().
00753 { 00754 if (this->is_empty ()) 00755 return 0; 00756 00757 T *temp = static_cast <T *> (this->head_->prev_); 00758 // Detach it from the list. 00759 this->remove_element (temp); 00760 return temp; 00761 } |
|
Dump the state of an object.
Reimplemented in ACE_DLList< T >. Definition at line 790 of file Containers_T.cpp. Referenced by ACE_DLList< T >::dump().
00791 { 00792 #if defined (ACE_HAS_DUMP) 00793 // Dump the state of an object. 00794 #endif /* ACE_HAS_DUMP */ 00795 } |
|
Iterates through the list to the desired index and assigns the provides pointer with the address of the node occupying that index. Reimplemented in ACE_DLList< T >. Definition at line 770 of file Containers_T.cpp. References ACE_Double_Linked_List_Iterator< T >::advance(), ACE_Double_Linked_List_Iterator_Base< T >::done(), and ACE_Double_Linked_List_Iterator_Base< T >::next(). Referenced by ACE_DLList< T >::get().
00771 { 00772 ACE_Double_Linked_List_Iterator<T> iter (*this); 00773 00774 for (size_t i = 0; 00775 i < slot && !iter.done (); 00776 i++) 00777 iter.advance (); 00778 00779 item = iter.next (); 00780 return item ? 0 : -1; 00781 } |
|
Setup header pointer. Called after we create the head node in ctor. Initialize the head pointer so that the list has a dummy node. Definition at line 861 of file Containers_T.cpp. Referenced by ACE_Double_Linked_List< T >::ACE_Double_Linked_List().
|
|
Constant time insert a new item into the list structure. Insert a new_item into the list. It will be added before or after old_item. Default is to insert the new item *after* {head_}. Return 0 if succeed, -1 if error occured. Definition at line 868 of file Containers_T.cpp. Referenced by ACE_Double_Linked_List< T >::insert_head(), and ACE_Double_Linked_List< T >::insert_tail().
00871 { 00872 if (old_item == 0) 00873 old_item = this->head_; 00874 00875 if (before) 00876 old_item = static_cast<T *> (old_item->prev_); 00877 00878 new_item->next_ = old_item->next_; 00879 new_item->next_->prev_ = new_item; 00880 new_item->prev_ = old_item; 00881 old_item->next_ = new_item; 00882 ++this->size_; 00883 return 0; // Well, what will cause errors here? 00884 } |
|
Provides constant time insertion at the head of the list. Reimplemented in ACE_DLList< T >. Definition at line 733 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::insert_element(). Referenced by ACE_DLList< T >::insert_head().
00734 { 00735 this->insert_element (new_item); // Insert it after <head_>, i.e., at head. 00736 return new_item; 00737 } |
|
Provides constant time insertion at the end of the list structure. Reimplemented in ACE_DLList< T >. Definition at line 725 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::insert_element(). Referenced by ACE_Double_Linked_List< T >::copy_nodes(), ACE_DLList< T >::insert_tail(), and ACE_Thread_Manager::wait().
00726 { 00727 // Insert it before <head_>, i.e., at tail. 00728 this->insert_element (new_item, 1); 00729 return new_item; 00730 } |
|
Returns 1 if the container is empty, 0 otherwise. Performs constant time check to determine if the list is empty. Definition at line 713 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::size(). Referenced by ACE_Double_Linked_List< T >::delete_head(), ACE_Double_Linked_List< T >::delete_nodes(), and ACE_Double_Linked_List< T >::delete_tail().
00714 { 00715 return this->size () ? 0 : 1; 00716 } |
|
The list is unbounded, so this always returns 0. Since the list is unbounded, the method simply returns 0. Definition at line 719 of file Containers_T.cpp.
00720 { 00721 return 0; // We have no bound. 00722 } |
|
Assignment operator. Perform a deep copy of the provided list by first deleting the nodes of the lhs and then copying the nodes of the rhs. Definition at line 691 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::copy_nodes(), and ACE_Double_Linked_List< T >::delete_nodes().
00692 { 00693 if (this != &cx) 00694 { 00695 this->delete_nodes (); 00696 this->copy_nodes (cx); 00697 } 00698 } |
|
Use DNode address directly. Constant time removal of an item from the list using it's address. Definition at line 827 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::remove_element(). Referenced by ACE_Double_Linked_List_Reverse_Iterator< T >::advance_and_remove(), ACE_Double_Linked_List_Iterator< T >::advance_and_remove(), and ACE_DLList< T >::remove().
00828 { 00829 return this->remove_element (n); 00830 } |
|
Constant time delete an item from the list structure. Remove item from the list. Return 0 if succeed, -1 otherwise. Notice that this function checks if item is {head_} and either its {next_} or {prev_} is NULL. The function resets item's {next_} and {prev_} to 0 to prevent clobbering the double-linked list if a user tries to remove the same node again. Definition at line 887 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::size(). Referenced by ACE_Double_Linked_List< T >::delete_head(), ACE_Double_Linked_List< T >::delete_nodes(), ACE_Double_Linked_List< T >::delete_tail(), and ACE_Double_Linked_List< T >::remove().
00888 { 00889 // Notice that you have to ensure that item is an element of this 00890 // list. We can't do much checking here. 00891 00892 if (item == this->head_ || item->next_ == 0 00893 || item->prev_ == 0 || this->size () == 0) // Can't remove head 00894 return -1; 00895 00896 item->prev_->next_ = item->next_; 00897 item->next_->prev_ = item->prev_; 00898 item->next_ = item->prev_ = 0; // reset pointers to prevent double removal. 00899 --this->size_; 00900 return 0; 00901 } |
|
Empty the list. Reset the {ACE_Double_Linked_List} to be empty. Notice that since no one is interested in the items within, This operation will delete all items. Definition at line 764 of file Containers_T.cpp. References ACE_Double_Linked_List< T >::delete_nodes().
00765 { 00766 this->delete_nodes (); 00767 } |
|
The number of items in the queue. Constant time call to return the current size of the list. Definition at line 784 of file Containers_T.cpp. Referenced by ACE_Double_Linked_List< T >::is_empty(), and ACE_Double_Linked_List< T >::remove_element().
00785 { 00786 return this->size_; 00787 } |
|
Reimplemented in ACE_DLList< T >. Definition at line 827 of file Containers_T.h. |
|
Definition at line 826 of file Containers_T.h. |
|
Definition at line 828 of file Containers_T.h. |
|
Declare the dynamic allocation hooks.
Definition at line 943 of file Containers_T.h. |
|
Allocation Strategy of the queue.
Definition at line 992 of file Containers_T.h. |
|
Head of the circular double-linked list.
Definition at line 986 of file Containers_T.h. Referenced by ACE_Double_Linked_List_Iterator< T >::ACE_Double_Linked_List_Iterator(), ACE_Double_Linked_List_Reverse_Iterator< T >::ACE_Double_Linked_List_Reverse_Iterator(), ACE_Double_Linked_List_Reverse_Iterator< T >::reset(), and ACE_Double_Linked_List_Iterator< T >::reset(). |
|
Size of this list.
Definition at line 989 of file Containers_T.h. Referenced by ACE_Double_Linked_List< T >::ACE_Double_Linked_List(). |