#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().  | 
  
 
1.3.6