/* -*- C++ -*- */ //============================================================================= /** * @file Containers_T.h * * $Id$ * * @author Douglas C. Schmidt */ //============================================================================= #ifndef ACE_CONTAINERS_T_H #define ACE_CONTAINERS_T_H #include "ace/pre.h" #include "ace/ACE.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ // Need by ACE_DLList_Node. #include "ace/Containers.h" // Shared with "ace/Unbounded_Set.h" #include "ace/Node.h" // Backwards compatibility, please include "ace/Array_Base.h" directly. #include "ace/Array_Base.h" // Backwards compatibility, please include "ace/Unbounded_Set.h" directly. #include "ace/Unbounded_Set.h" // Backwards compatibility, please include "ace/Unbounded_Queue.h" directly. #include "ace/Unbounded_Queue.h" class ACE_Allocator; /** * @class ACE_Bounded_Stack * * @brief Implement a generic LIFO abstract data type. * * This implementation of a Stack uses a bounded array * that is allocated dynamically. */ template class ACE_Bounded_Stack { public: // = Initialization, assignment, and termination methods. /// Initialize a new stack so that it is empty. /// The copy constructor (performs initialization). ACE_Bounded_Stack (size_t size); ACE_Bounded_Stack (const ACE_Bounded_Stack &s); /// Assignment operator (performs assignment). void operator= (const ACE_Bounded_Stack &s); /// Perform actions needed when stack goes out of scope. ~ACE_Bounded_Stack (void); // = Classic Stack operations. /** * Place a new item on top of the stack. Returns -1 if the stack * is already full, 0 if the stack is not already full, and -1 if * failure occurs. */ int push (const T &new_item); /** * Remove and return the top stack item. Returns -1 if the stack is * already empty, 0 if the stack is not already empty, and -1 if * failure occurs. */ int pop (T &item); /** * Return top stack item without removing it. Returns -1 if the * stack is already empty, 0 if the stack is not already empty, and * -1 if failure occurs. */ int top (T &item) const; // = Check boundary conditions. /// Returns 1 if the container is empty, otherwise returns 0. int is_empty (void) const; /// Returns 1 if the container is full, otherwise returns 0. int is_full (void) const; /// The number of items in the stack. size_t size (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /// Size of the dynamically allocated data. size_t size_; /// Keeps track of the current top of stack. size_t top_; /// Holds the stack's contents. T *stack_; }; //---------------------------------------- /** * @class ACE_Fixed_Stack * * @brief Implement a generic LIFO abstract data type. * * This implementation of a Stack uses a fixed array * with the size fixed at instantiation time. */ template class ACE_Fixed_Stack { public: // = Initialization, assignment, and termination methods. /// Initialize a new stack so that it is empty. ACE_Fixed_Stack (void); /// The copy constructor (performs initialization). ACE_Fixed_Stack (const ACE_Fixed_Stack &s); /// Assignment operator (performs assignment). void operator= (const ACE_Fixed_Stack &s); /// Perform actions needed when stack goes out of scope. ~ACE_Fixed_Stack (void); // = Classic Stack operations. /** * Place a new item on top of the stack. Returns -1 if the stack * is already full, 0 if the stack is not already full, and -1 if * failure occurs. */ int push (const T &new_item); /** * Remove and return the top stack item. Returns -1 if the stack is * already empty, 0 if the stack is not already empty, and -1 if * failure occurs. */ int pop (T &item); /** * Return top stack item without removing it. Returns -1 if the * stack is already empty, 0 if the stack is not already empty, and * -1 if failure occurs. */ int top (T &item) const; // = Check boundary conditions. /// Returns 1 if the container is empty, otherwise returns 0. int is_empty (void) const; /// Returns 1 if the container is full, otherwise returns 0. int is_full (void) const; /// The number of items in the stack. size_t size (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /// Size of the allocated data. size_t size_; /// Keeps track of the current top of stack. size_t top_; /// Holds the stack's contents. T stack_[ACE_SIZE]; }; //---------------------------------------- template class ACE_Ordered_MultiSet; template class ACE_Ordered_MultiSet_Iterator; /** * @class ACE_DNode * * @brief Implementation element in a bilinked list. */ template class ACE_DNode { friend class ACE_Ordered_MultiSet; friend class ACE_Ordered_MultiSet_Iterator; public: # if ! defined (ACE_HAS_BROKEN_NOOP_DTORS) /// This isn't necessary, but it keeps some compilers happy. ~ACE_DNode (void); # endif /* ! defined (ACE_HAS_BROKEN_NOOP_DTORS) */ private: // = Initialization methods ACE_DNode (const T &i, ACE_DNode *n = 0, ACE_DNode *p = 0); /// Pointer to next element in the list of s. ACE_DNode *next_; /// Pointer to previous element in the list of s. ACE_DNode *prev_; /// Current value of the item in this node. T item_; }; /** * @class ACE_Unbounded_Stack * * @brief Implement a generic LIFO abstract data type. * * This implementation of an unbounded Stack uses a linked list. * If you use the or methods you should keep * in mind that duplicate entries aren't allowed. In general, * therefore, you should avoid the use of these methods since * they aren't really part of the ADT stack. */ template class ACE_Unbounded_Stack { public: friend class ACE_Unbounded_Stack_Iterator; // Trait definition. typedef ACE_Unbounded_Stack_Iterator ITERATOR; // = Initialization, assignment, and termination methods. /// Initialize a new stack so that it is empty. Use user defined /// allocation strategy if specified. ACE_Unbounded_Stack (ACE_Allocator *alloc = 0); /// The copy constructor (performs initialization). ACE_Unbounded_Stack (const ACE_Unbounded_Stack &s); /// Assignment operator (performs assignment). void operator= (const ACE_Unbounded_Stack &s); /// Perform actions needed when stack goes out of scope. ~ACE_Unbounded_Stack (void); // = Classic Stack operations. /** * Place a new item on top of the stack. Returns -1 if the stack * is already full, 0 if the stack is not already full, and -1 if * failure occurs. */ int push (const T &new_item); /** * Remove and return the top stack item. Returns -1 if the stack is * already empty, 0 if the stack is not already empty, and -1 if * failure occurs. */ int pop (T &item); /** * Return top stack item without removing it. Returns -1 if the * stack is already empty, 0 if the stack is not already empty, and * -1 if failure occurs. */ int top (T &item) const; // = Check boundary conditions. /// Returns 1 if the container is empty, otherwise returns 0. int is_empty (void) const; /// Returns 1 if the container is full, otherwise returns 0. int is_full (void) const; // = Auxiliary methods (not strictly part of the Stack ADT). /** * Insert into the Stack at the head (but doesn't allow * duplicates). Returns -1 if failures occur, 1 if item is already * present (i.e., no duplicates are allowed), else 0. */ int insert (const T &new_item); /// Remove from the Stack. Returns 0 if it removes the item, /// -1 if it can't find the item, and -1 if a failure occurs. int remove (const T &item); /// Finds if occurs the set. Returns 0 if finds, else -1. int find (const T &item) const; /// The number of items in the stack. size_t size (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /// Delete all the nodes in the stack. void delete_all_nodes (void); /// Copy all nodes from to . void copy_all_nodes (const ACE_Unbounded_Stack &s); /// Head of the linked list of Nodes. ACE_Node *head_; /// Current size of the stack. size_t cur_size_; /// Allocation strategy of the stack. ACE_Allocator *allocator_; }; /** * @class ACE_Unbounded_Stack_Iterator * * @brief Implement an iterator over an unbounded Stack. */ template class ACE_Unbounded_Stack_Iterator { public: // = Initialization method. /// Move to the first element in the . ACE_Unbounded_Stack_Iterator (ACE_Unbounded_Stack &stack); // = Iteration methods. /// Pass back the that hasn't been seen in the Stack. /// Returns 0 when all items have been seen, else 1. int next (T *&next_item); /// Move forward by one element in the Stack. Returns 0 when all the /// items in the Stack have been seen, else 1. int advance (void); /// Move to the first element in the Stack. Returns 0 if the /// Stack is empty, else 1. int first (void); /// Returns 1 when all items have been seen, else 0. int done (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /// Pointer to the current node in the iteration. ACE_Node *current_; /// Pointer to the Stack we're iterating over. ACE_Unbounded_Stack &stack_; }; template class ACE_Double_Linked_List; /** * @class ACE_Double_Linked_List_Iterator_Base * * @brief Implements a common base class for iterators for a double * linked list ADT */ template class ACE_Double_Linked_List_Iterator_Base { public: // = Iteration methods. /// Passes back the under the iterator. Returns 0 if the /// iteration has completed, otherwise 1 int next (T *&) const; /** * Return the address of next (current) unvisited item in the list. * 0 if there is no more element available. * DEPRECATED */ T *next (void) const; /// Returns 1 when all items have been seen, else 0. int done (void) const; /// STL-like iterator dereference operator: returns a reference /// to the node underneath the iterator. T & operator* (void) const ; /** * Retasks the iterator to iterate over a new * Double_Linked_List. This allows clients to reuse an iterator * without incurring the constructor overhead. If you do use this, * be aware that if there are more than one reference to this * iterator, the other "clients" may be very bothered when their * iterator changes. @@ Here be dragons. Comments? */ void reset (ACE_Double_Linked_List &); /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; protected: // = Initialization methods. /// Constructor ACE_Double_Linked_List_Iterator_Base (const ACE_Double_Linked_List &); /// Copy constructor. ACE_Double_Linked_List_Iterator_Base (const ACE_Double_Linked_List_Iterator_Base &iter); // = Iteration methods. /** * Move to the first element of the list. Returns 0 if the list is * empty, else 1. Note: the head of the ACE_DLList is actually a * null entry, so the first element is actually the 2n'd entry */ int go_head (void); /// Move to the last element of the list. Returns 0 if the list is /// empty, else 1. int go_tail (void); /** * Check if we reach the end of the list. Can also be used to get * the *current* element in the list. Return the address of the * current item if there are still elements left , 0 if we run out * of element. */ T *not_done (void) const ; /// Advance to the next element in the list. Return the address of the /// next element if there are more, 0 otherwise. T *do_advance (void); /// Retreat to the previous element in the list. Return the address /// of the previous element if there are more, 0 otherwise. T *do_retreat (void); /// Dump the state of an object. void dump_i (void) const; /// Remember where we are. T *current_; const ACE_Double_Linked_List *dllist_; }; /** * @class ACE_Double_Linked_List_Iterator * * @brief Implements an iterator for a double linked list ADT * * Iterate thru the double-linked list. This class provides * an interface that let users access the internal element * addresses directly. Notice must delcare * ACE_Double_Linked_List, * ACE_Double_Linked_List_Iterator_Base and * ACE_Double_Linked_List_Iterator as friend classes and class T * should also have data members T* next_ and T* prev_. */ template class ACE_Double_Linked_List_Iterator : public ACE_Double_Linked_List_Iterator_Base { public: // = Initialization method. ACE_Double_Linked_List_Iterator (const ACE_Double_Linked_List &); /** * Retasks the iterator to iterate over a new * Double_Linked_List. This allows clients to reuse an iterator * without incurring the constructor overhead. If you do use this, * be aware that if there are more than one reference to this * iterator, the other "clients" may be very bothered when their * iterator changes. * @@ Here be dragons. Comments? */ void reset (ACE_Double_Linked_List &); /// Move to the first element in the list. Returns 0 if the /// list is empty, else 1. int first (void); /// Move forward by one element in the list. Returns 0 when all the /// items in the list have been seen, else 1. int advance (void); /** * Advance the iterator while removing the original item from the * list. Return a pointer points to the original (removed) item. * If equals 0, this function behaves like * but return 0 (NULL) instead. */ T* advance_and_remove (int dont_remove); // = STL-style iteration methods /// Prefix advance. ACE_Double_Linked_List_Iterator & operator++ (void); /// Postfix advance. ACE_Double_Linked_List_Iterator operator++ (int); /// Prefix reverse. ACE_Double_Linked_List_Iterator & operator-- (void); /// Postfix reverse. ACE_Double_Linked_List_Iterator operator-- (int); /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; }; /** * @class ACE_Double_Linked_List_Reverse_Iterator * * @brief Implements a reverse iterator for a double linked list ADT * * Iterate backwards over the double-linked list. This class * provide an interface that let users access the internal * element addresses directly, which seems to break the * encapsulation. Notice must delcare * ACE_Double_Linked_List, * ACE_Double_Linked_List_Iterator_Base and * ACE_Double_Linked_List_Iterator as friend classes and class T * should also have data members T* next_ and T* prev_. */ template class ACE_Double_Linked_List_Reverse_Iterator : public ACE_Double_Linked_List_Iterator_Base { public: // = Initialization method. ACE_Double_Linked_List_Reverse_Iterator (ACE_Double_Linked_List &); /** * Retasks the iterator to iterate over a new * Double_Linked_List. This allows clients to reuse an iterator * without incurring the constructor overhead. If you do use this, * be aware that if there are more than one reference to this * iterator, the other "clients" may be very bothered when their * iterator changes. * @@ Here be dragons. Comments? */ void reset (ACE_Double_Linked_List &); /// Move to the first element in the list. Returns 0 if the /// list is empty, else 1. int first (void); /// Move forward by one element in the list. Returns 0 when all the /// items in the list have been seen, else 1. int advance (void); /** * Advance the iterator while removing the original item from the * list. Return a pointer points to the original (removed) item. * If equals 0, this function behaves like * but return 0 (NULL) instead. */ T* advance_and_remove (int dont_remove); // = STL-style iteration methods /// Prefix advance. ACE_Double_Linked_List_Reverse_Iterator & operator++ (void); /// Postfix advance. ACE_Double_Linked_List_Reverse_Iterator operator++ (int); /// Prefix reverse. ACE_Double_Linked_List_Reverse_Iterator & operator-- (void); /// Postfix reverse. ACE_Double_Linked_List_Reverse_Iterator operator-- (int); /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; }; /** * @class ACE_Double_Linked_List * * @brief A double-linked list implementation. * * This implementation of an unbounded double-linked list uses a * circular linked list with a dummy node. It is pretty much * like the except that it allows removing * of a specific element from a specific location. * Notice that this class is an implementation of a very simply * data structure.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* has 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 * integrities. * If you need a double linked container class, check out the * DLList class in this file. */ template class ACE_Double_Linked_List { public: friend class ACE_Double_Linked_List_Iterator_Base; friend class ACE_Double_Linked_List_Iterator; friend class ACE_Double_Linked_List_Reverse_Iterator; // Trait definition. typedef ACE_Double_Linked_List_Iterator ITERATOR; typedef ACE_Double_Linked_List_Reverse_Iterator REVERSE_ITERATOR; // = Initialization and termination methods. /// construction. Use user specified allocation strategy /// if specified. ACE_Double_Linked_List (ACE_Allocator *alloc = 0); /// Copy constructor. ACE_Double_Linked_List (const ACE_Double_Linked_List &); /// Assignment operator. void operator= (const ACE_Double_Linked_List &); /// Destructor. ~ACE_Double_Linked_List (void); // = Check boundary conditions. /// Returns 1 if the container is empty, otherwise returns 0. int is_empty (void) const; /// Returns 1 if the container is full, otherwise returns 0. int is_full (void) const; // = Classic queue operations. /// Adds to the tail of the list. Returns the new item /// that was inserted. T *insert_tail (T *new_item); /// Adds to the head of the list.Returns the new item that /// was inserted. T *insert_head (T *new_item); /** * Removes and returns the first in the list. Returns * internal node's address on success, 0 if the queue was empty. * This method will *not* free the internal node. */ T* delete_head (void); /** * Removes and returns the last in the list. Returns * internal nodes's address on success, 0 if the queue was * empty. This method will *not* free the internal node. */ T *delete_tail (void); // = Additional utility methods. /** * Reset the to be empty. * Notice that since no one is interested in the items within, * This operation will delete all items. */ void reset (void); /// Get the th element in the set. Returns -1 if the element /// isn't in the range {0.. - 1}, else 0. int get (T *&item, size_t slot = 0); /// The number of items in the queue. size_t size (void) const; /// Dump the state of an object. void dump (void) const; /// Use DNode address directly. int remove (T *n); /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; protected: /// Delete all the nodes in the list. void delete_nodes (void); /// Copy nodes from into this list. void copy_nodes (const ACE_Double_Linked_List &rhs); /// Setup header pointer. Called after we create the head node in ctor. void init_head (void); /** * Insert a into the list. It will be added before * or after . Default is to insert the new item *after* * . Return 0 if succeed, -1 if error occured. */ int insert_element (T *new_item, int before = 0, T *old_item = 0); /** * Remove an from the list. Return 0 if succeed, -1 otherwise. * Notice that this function checks if item is and either its * or is NULL. The function resets item's and * to 0 to prevent clobbering the double-linked list if a user * tries to remove the same node again. */ int remove_element (T *item); /// Head of the circular double-linked list. T *head_; /// Size of this list. size_t size_; /// Allocation Strategy of the queue. ACE_Allocator *allocator_; }; template class ACE_DLList; template class ACE_DLList_Iterator; template class ACE_DLList_Reverse_Iterator; typedef ACE_Double_Linked_List ACE_DLList_Base; //typedef ACE_Double_Linked_List_Iterator // ACE_DLList_Iterator_Base; //typedef ACE_Double_Linked_List_Reverse_Iterator // ACE_DLList_Reverse_Iterator_Base; //@@ These two typedefs (inherited from James Hu's original design) // have been removed because Sun CC 4.2 had problems with it. I guess // having the DLList_Iterators inheriting from a class which is // actually a typedef leads to problems. #define'ing rather than // typedef'ing worked, but as per Carlos's reccomendation, I'm just // replacing all references to the base classes with their actual // type. Matt Braun (6/15/99) /** * @class ACE_DLList * * @brief A double-linked list container class. * * This implementation uses ACE_Double_Linked_List to perform * the logic behind this container class. It delegates all of its * calls to ACE_Double_Linked_List. */ template class ACE_DLList : public ACE_DLList_Base { friend class ACE_DLList_Node; friend class ACE_Double_Linked_List_Iterator; friend class ACE_DLList_Iterator; friend class ACE_DLList_Reverse_Iterator; public: /// Delegates to ACE_Double_Linked_List. void operator= (const ACE_DLList &l); // = Classic queue operations. /// Delegates to ACE_Double_Linked_List. T *insert_tail (T *new_item); /// Delegates to ACE_Double_Linked_List. T *insert_head (T *new_item); /// Delegates to ACE_Double_Linked_List. T *delete_head (void); /// Delegates to ACE_Double_Linked_List. T *delete_tail (void); // = Additional utility methods. /** * Delegates to , but where * returns the node as the item, this get * returns the contents of the node in item. */ int get (T *&item, size_t slot = 0); /// Delegates to ACE_Double_Linked_List. void dump (void) const; /// Delegates to ACE_Double_Linked_List. int remove (ACE_DLList_Node *n); // = Initialization and termination methods. /// Delegates to ACE_Double_Linked_List. ACE_DLList (ACE_Allocator *alloc = 0); /// Delegates to ACE_Double_Linked_List. ACE_DLList (const ACE_DLList &l); /// Deletes the list starting from the head. ~ACE_DLList (void); }; /** * @class ACE_DLList_Iterator * * @brief A double-linked list container class iterator. * * This implementation uses ACE_Double_Linked_List_Iterator to * perform the logic behind this container class. It delegates * all of its calls to ACE_Double_Linked_List_Iterator. */ template class ACE_DLList_Iterator : public ACE_Double_Linked_List_Iterator { friend class ACE_DLList; friend class ACE_DLList_Node; public: // = Initialization method. ACE_DLList_Iterator (ACE_DLList &l); /** * Retasks the iterator to iterate over a new * Double_Linked_List. This allows clients to reuse an iterator * without incurring the constructor overhead. If you do use this, * be aware that if there are more than one reference to this * iterator, the other "clients" may be very bothered when their * iterator changes. * @@ Here be dragons. Comments? */ void reset (ACE_DLList &l); // = Iteration methods. /// Move forward by one element in the set. Returns 0 when all the /// items in the set have been seen, else 1. int advance (void); /// Pass back the that hasn't been seen in the Stack. /// Returns 0 when all items have been seen, else 1. int next (T *&); /** * Delegates to ACE_Double_Linked_List_Iterator, except that whereas * the Double_Linked_List version of next returns the node, this next * returns the contents of the node * DEPRECATED */ T *next (void) const; /// Removes the current item (i.e., ) from the list. /// Note that DLList iterators do not support /// directly (defined in its base class) and you will need to /// release the element returned by it. int remove (void); /// Delegates to ACE_Double_Linked_List_Iterator. void dump (void) const; private: ACE_DLList *list_; }; /** * @class ACE_DLList_Reverse_Iterator * * @brief A double-linked list container class iterator. * * This implementation uses ACE_Double_Linked_List_Iterator to * perform the logic behind this container class. It delegates * all of its calls to ACE_Double_Linked_List_Iterator. */ template class ACE_DLList_Reverse_Iterator : public ACE_Double_Linked_List_Reverse_Iterator { friend class ACE_DLList; friend class ACE_DLList_Node; public: // = Initialization method. ACE_DLList_Reverse_Iterator (ACE_DLList &l); /** * Retasks the iterator to iterate over a new * Double_Linked_List. This allows clients to reuse an iterator * without incurring the constructor overhead. If you do use this, * be aware that if there are more than one reference to this * iterator, the other "clients" may be very bothered when their * iterator changes. * @@ Here be dragons. Comments? */ void reset (ACE_DLList &l); // = Iteration methods. /// Move forward by one element in the set. Returns 0 when all the /// items in the set have been seen, else 1. int advance (void); /// Pass back the that hasn't been seen in the Stack. /// Returns 0 when all items have been seen, else 1. int next (T *&); /// Delegates to ACE_Double_Linked_List_Iterator. /// DEPRECATED T *next (void) const; /// Removes the current item (i.e., ) from the list. /// Note that DLList iterators do not support /// directly (defined in its base class) and you will need to /// release the element returned by it. int remove (void); /// Delegates to ACE_Double_Linked_List_Iterator. void dump (void) const; private: ACE_DLList *list_; }; // Forward declaration. template class ACE_Fixed_Set; /** * @class ACE_Fixed_Set_Iterator * * @brief Interates through an unordered set. * * This implementation of an unordered set uses a fixed array. * Allows deletions while iteration is occurring. */ template class ACE_Fixed_Set_Iterator { public: // = Initialization method. ACE_Fixed_Set_Iterator (ACE_Fixed_Set &s); // = Iteration methods. /// Pass back the that hasn't been seen in the Set. /// Returns 0 when all items have been seen, else 1. int next (T *&next_item); /// Move forward by one element in the set. Returns 0 when all the /// items in the set have been seen, else 1. int advance (void); /// Move to the first element in the set. Returns 0 if the /// set is empty, else 1. int first (void); /// Returns 1 when all items have been seen, else 0. int done (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /// Set we are iterating over. ACE_Fixed_Set &s_; /// How far we've advanced over the set. ssize_t next_; }; /** * @class ACE_Fixed_Set * * @brief Implement a simple unordered set of with maximum . * * This implementation of an unordered set uses a fixed array. * This implementation does not allow duplicates... */ template class ACE_Fixed_Set { public: friend class ACE_Fixed_Set_Iterator; // Trait definition. typedef ACE_Fixed_Set_Iterator ITERATOR; // = Initialization and termination methods. /// Constructor. ACE_Fixed_Set (void); /// Copy constructor. ACE_Fixed_Set (const ACE_Fixed_Set &); /// Assignment operator. void operator= (const ACE_Fixed_Set &); /// Destructor. ~ACE_Fixed_Set (void); // = Check boundary conditions. /// Returns 1 if the container is empty, otherwise returns 0. int is_empty (void) const; /// Returns 1 if the container is full, otherwise returns 0. int is_full (void) const; // = Classic unordered set operations. /** * Insert into the set (doesn't allow duplicates). * Returns -1 if failures occur, 1 if item is already present, else * 0. */ int insert (const T &new_item); /** * Remove first occurrence of from the set. Returns 0 if * it removes the item, -1 if it can't find the item, and -1 if a * failure occurs. */ int remove (const T &item); /// Finds if occurs in the set. Returns 0 if finds, else -1. int find (const T &item) const; /// Size of the set. size_t size (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: struct { T item_; // Item in the set. int is_free_; // Keeps track of whether this item is in use or not. } search_structure_[ACE_SIZE]; // Holds the contents of the set. /// Current size of the set. size_t cur_size_; /// Maximum size of the set. size_t max_size_; }; // Forward declaration. template class ACE_Bounded_Set; /** * @class ACE_Bounded_Set_Iterator * * @brief Interates through an unordered set. * * This implementation of an unordered set uses a Bounded array. * Allows deletions while iteration is occurring. */ template class ACE_Bounded_Set_Iterator { public: // = Initialization method. ACE_Bounded_Set_Iterator (ACE_Bounded_Set &s); // = Iteration methods. /// Pass back the that hasn't been seen in the Set. /// Returns 0 when all items have been seen, else 1. int next (T *&next_item); /// Move forward by one element in the set. Returns 0 when all the /// items in the set have been seen, else 1. int advance (void); /// Move to the first element in the set. Returns 0 if the /// set is empty, else 1. int first (void); /// Returns 1 when all items have been seen, else 0. int done (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /// Set we are iterating over. ACE_Bounded_Set &s_; /// How far we've advanced over the set. ssize_t next_; }; /** * @class ACE_Bounded_Set * * @brief Implement a simple unordered set of with maximum * set at creation time. * * This implementation of an unordered set uses a Bounded array. * This implementation does not allow duplicates... */ template class ACE_Bounded_Set { public: friend class ACE_Bounded_Set_Iterator; // Trait definition. typedef ACE_Bounded_Set_Iterator ITERATOR; enum { DEFAULT_SIZE = 10 }; // = Initialization and termination methods. /// Constructor. ACE_Bounded_Set (void); /// Constructor. ACE_Bounded_Set (size_t size); /// Copy constructor. ACE_Bounded_Set (const ACE_Bounded_Set &); /// Assignment operator. void operator= (const ACE_Bounded_Set &); /// Destructor ~ACE_Bounded_Set (void); // = Check boundary conditions. /// Returns 1 if the container is empty, otherwise returns 0. int is_empty (void) const; /// Returns 1 if the container is full, otherwise returns 0. int is_full (void) const; // = Classic unordered set operations. /** * Insert into the set (doesn't allow duplicates). * Returns -1 if failures occur, 1 if item is already present, else * 0. */ int insert (const T &new_item); /** * Remove first occurrence of from the set. Returns 0 if it * removes the item, -1 if it can't find the item, and -1 if a * failure occurs. */ int remove (const T &item); /// Finds if occurs in the set. Returns 0 if finds, else -1. int find (const T &item) const; /// Size of the set. size_t size (void) const; /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: struct Search_Structure { T item_; // Item in the set. int is_free_; // Keeps track of whether this item is in use or not. }; /// Holds the contents of the set. Search_Structure *search_structure_; /// Current size of the set. size_t cur_size_; /// Maximum size of the set. size_t max_size_; }; /** * @class ACE_Ordered_MultiSet_Iterator * * @brief Implement a bidirectional iterator over an ordered multiset. * This class template requires that < operator semantics be * defined for the parameterized type , but does not impose * any restriction on how that ordering operator is implemented. */ template class ACE_Ordered_MultiSet_Iterator { public: friend class ACE_Ordered_MultiSet; // = Initialization method. ACE_Ordered_MultiSet_Iterator (ACE_Ordered_MultiSet &s); // = Iteration methods. /// Pass back the that hasn't been seen in the ordered multiset. /// Returns 0 when all items have been seen, else 1. int next (T *&next_item) const; /// Repositions the iterator at the first item in the ordered multiset /// Returns 0 if the list is empty else 1. int first (void); /// Repositions the iterator at the last item in the ordered multiset /// Returns 0 if the list is empty else 1. int last (void); /// Move forward by one element in the set. Returns 0 when all the /// items in the set have been seen, else 1. int advance (void); /// Move backward by one element in the set. Returns 0 when all the /// items in the set have been seen, else 1. int retreat (void); /// Returns 1 when all items have been seen, else 0. int done (void) const; /// Dump the state of an object. void dump (void) const; /// Returns a reference to the internal element is pointing to. T& operator* (void); /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /// Pointer to the current node in the iteration. ACE_DNode *current_; /// Pointer to the set we're iterating over. ACE_Ordered_MultiSet &set_; }; /** * @class ACE_Ordered_MultiSet * * @brief Implement a simple ordered multiset of of unbounded size * that allows duplicates. This class template requires that < * operator semantics be defined for the parameterized type , but * does not impose any restriction on how that ordering operator is * implemented. */ template class ACE_Ordered_MultiSet { public: friend class ACE_Ordered_MultiSet_Iterator; // Trait definition. typedef ACE_Ordered_MultiSet_Iterator ITERATOR; // = Initialization and termination methods. /// Constructor. Use user specified allocation strategy /// if specified. ACE_Ordered_MultiSet (ACE_Allocator *alloc = 0); /// Copy constructor. ACE_Ordered_MultiSet (const ACE_Ordered_MultiSet &); /// Destructor. ~ACE_Ordered_MultiSet (void); /// Assignment operator. void operator= (const ACE_Ordered_MultiSet &); // = Check boundary conditions. /// Returns 1 if the container is empty, otherwise returns 0. int is_empty (void) const; /// Size of the set. size_t size (void) const; // = Classic unordered set operations. /// Insert into the ordered multiset. /// Returns -1 if failures occur, else 0. int insert (const T &new_item); /** * Insert into the ordered multiset, starting its search at * the node pointed to by the iterator, and if insertion was successful, * updates the iterator to point to the newly inserted node. * Returns -1 if failures occur, else 0. */ int insert (const T &new_item, ITERATOR &iter); /// Remove first occurrence of from the set. Returns 0 if /// it removes the item, -1 if it can't find the item. int remove (const T &item); /** * Finds first occurrance of in the multiset, using the iterator's * current position as a hint to improve performance. If find succeeds, * it positions the iterator at that node and returns 0, or if it cannot * locate the node, it leaves the iterator alone and just returns -1. */ int find (const T &item, ITERATOR &iter) const; /// Reset the to be empty. void reset (void); /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: /** * Insert , starting its search at the position given, * and if successful updates the passed pointer to point to * the newly inserted item's node. */ int insert_from (const T &item, ACE_DNode *start_position, ACE_DNode **new_position); /** * looks for first occurance of in the ordered set, using the * passed starting position as a hint: if there is such an instance, it * updates the new_position pointer to point to this node and returns 0; * if there is no such node, then if there is a node before where the * item would have been, it updates the new_position pointer to point * to this node and returns -1; if there is no such node, then if there * is a node after where the item would have been, it updates the * new_position pointer to point to this node (or 0 if there is no such * node) and returns 1; */ int locate (const T &item, ACE_DNode *start_position, ACE_DNode *&new_position) const; /// Delete all the nodes in the Set. void delete_nodes (void); /// Copy nodes into this set. void copy_nodes (const ACE_Ordered_MultiSet &); /// Head of the bilinked list of Nodes. ACE_DNode *head_; /// Head of the bilinked list of Nodes. ACE_DNode *tail_; /// Current size of the set. size_t cur_size_; /// Allocation strategy of the set. ACE_Allocator *allocator_; }; // **************************************************************** /** * @class ACE_Array * * @brief Implement a dynamic array class. * * This class extends ACE_Array_Base, it provides comparison * operators. */ template class ACE_Array : public ACE_Array_Base { public: // Define a "trait" typedef T TYPE; typedef ACE_Array_Iterator ITERATOR; // = Exceptions. // = Initialization and termination methods. /// Dynamically create an uninitialized array. ACE_Array (size_t size = 0, ACE_Allocator* alloc = 0); /// Dynamically initialize the entire array to the . ACE_Array (size_t size, const T &default_value, ACE_Allocator* alloc = 0); /** * The copy constructor performs initialization by making an exact * copy of the contents of parameter , i.e., *this == s will * return true. */ ACE_Array (const ACE_Array &s); /** * Assignment operator performs an assignment by making an exact * copy of the contents of parameter , i.e., *this == s will * return true. Note that if the of is >= than * we can copy it without reallocating. However, if * is < we must delete the , * reallocate a new , and then copy the contents of . */ void operator= (const ACE_Array &s); // = Compare operators /** * Compare this array with for equality. Two arrays are equal * if their 's are equal and all the elements from 0 .. * are equal. */ int operator== (const ACE_Array &s) const; /** * Compare this array with for inequality such that <*this> != * is always the complement of the boolean return value of * <*this> == . */ int operator!= (const ACE_Array &s) const; }; #if defined (__ACE_INLINE__) #include "ace/Containers_T.i" #endif /* __ACE_INLINE__ */ #if defined (ACE_TEMPLATES_REQUIRE_SOURCE) #include "ace/Containers_T.cpp" #endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) #pragma implementation ("Containers_T.cpp") #endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ #include "ace/post.h" #endif /* ACE_CONTAINERS_T_H */