mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 01:37:00 +00:00
297 lines
7.4 KiB
C++
297 lines
7.4 KiB
C++
// -*- C++ -*-
|
|
|
|
//=============================================================================
|
|
/**
|
|
* @file Unbounded_Queue.h
|
|
*
|
|
* $Id: Unbounded_Queue.h 84316 2009-02-03 19:46:05Z johnnyw $
|
|
*
|
|
* @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
|
|
*/
|
|
//=============================================================================
|
|
|
|
#ifndef ACE_UNBOUNDED_QUEUE_H
|
|
#define ACE_UNBOUNDED_QUEUE_H
|
|
#include /**/ "ace/pre.h"
|
|
|
|
#include "ace/Node.h"
|
|
|
|
#if !defined (ACE_LACKS_PRAGMA_ONCE)
|
|
# pragma once
|
|
#endif /* ACE_LACKS_PRAGMA_ONCE */
|
|
|
|
#include "ace/os_include/os_stddef.h"
|
|
|
|
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
|
|
|
|
class ACE_Allocator;
|
|
|
|
template <class T>
|
|
class ACE_Unbounded_Queue;
|
|
|
|
/**
|
|
* @class ACE_Unbounded_Queue_Iterator
|
|
*
|
|
* @brief Implement an iterator over an unbounded queue.
|
|
*/
|
|
template <class T>
|
|
class ACE_Unbounded_Queue_Iterator
|
|
{
|
|
public:
|
|
// = Initialization method.
|
|
ACE_Unbounded_Queue_Iterator (ACE_Unbounded_Queue<T> &q, int end = 0);
|
|
|
|
// = Iteration methods.
|
|
|
|
/// Pass back the @a next_item that hasn't been seen in the queue.
|
|
/// 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 queue have been seen, else 1.
|
|
int advance (void);
|
|
|
|
/// Move to the first element in the queue. Returns 0 if the
|
|
/// queue 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<T> *current_;
|
|
|
|
/// Pointer to the queue we're iterating over.
|
|
ACE_Unbounded_Queue<T> &queue_;
|
|
};
|
|
|
|
/**
|
|
* @class ACE_Unbounded_Queue_Const_Iterator
|
|
*
|
|
* @brief Implement an iterator over an const unbounded queue.
|
|
*/
|
|
template <class T>
|
|
class ACE_Unbounded_Queue_Const_Iterator
|
|
{
|
|
public:
|
|
// = Initialization method.
|
|
ACE_Unbounded_Queue_Const_Iterator (const ACE_Unbounded_Queue<T> &q, int end = 0);
|
|
|
|
// = Iteration methods.
|
|
|
|
/// Pass back the @a next_item that hasn't been seen in the queue.
|
|
/// 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 queue have been seen, else 1.
|
|
int advance (void);
|
|
|
|
/// Move to the first element in the queue. Returns 0 if the
|
|
/// queue 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<T> *current_;
|
|
|
|
/// Pointer to the queue we're iterating over.
|
|
const ACE_Unbounded_Queue<T> &queue_;
|
|
};
|
|
|
|
/**
|
|
* @class ACE_Unbounded_Queue
|
|
*
|
|
* @brief A Queue of "infinite" length.
|
|
*
|
|
* This implementation of an unbounded queue uses a circular
|
|
* linked list with a dummy node.
|
|
*
|
|
* <b> Requirements and Performance Characteristics</b>
|
|
* - Internal Structure
|
|
* Circular linked list
|
|
* - Duplicates allowed?
|
|
* Yes
|
|
* - Random access allowed?
|
|
* No
|
|
* - Search speed
|
|
* N/A
|
|
* - Insert/replace speed
|
|
* N/A
|
|
* - Iterator still valid after change to container?
|
|
* Yes
|
|
* - Frees memory for removed elements?
|
|
* Yes
|
|
* - Items inserted by
|
|
* Value
|
|
* - Requirements for contained type
|
|
* -# Default constructor
|
|
* -# Copy constructor
|
|
* -# operator=
|
|
*
|
|
*/
|
|
template <class T>
|
|
class ACE_Unbounded_Queue
|
|
{
|
|
public:
|
|
friend class ACE_Unbounded_Queue_Iterator<T>;
|
|
friend class ACE_Unbounded_Queue_Const_Iterator<T>;
|
|
|
|
// Trait definition.
|
|
typedef ACE_Unbounded_Queue_Iterator<T> ITERATOR;
|
|
typedef ACE_Unbounded_Queue_Const_Iterator<T> CONST_ITERATOR;
|
|
|
|
// = Initialization and termination methods.
|
|
/// Construction. Use user specified allocation strategy
|
|
/// if specified.
|
|
/**
|
|
* Initialize an empty queue using the strategy provided.
|
|
*/
|
|
ACE_Unbounded_Queue (ACE_Allocator *alloc = 0);
|
|
|
|
/// Copy constructor.
|
|
/**
|
|
* Initialize the queue to be a copy of the provided queue.
|
|
*/
|
|
ACE_Unbounded_Queue (const ACE_Unbounded_Queue<T> &);
|
|
|
|
/// Assignment operator.
|
|
/**
|
|
* Perform a deep copy of rhs.
|
|
*/
|
|
void operator= (const ACE_Unbounded_Queue<T> &);
|
|
|
|
/// Destructor.
|
|
/**
|
|
* Clean up the memory for the queue.
|
|
*/
|
|
~ACE_Unbounded_Queue (void);
|
|
|
|
// = Check boundary conditions.
|
|
|
|
/// Returns true if the container is empty, otherwise returns false.
|
|
/**
|
|
* Constant time check to see if the queue is empty.
|
|
*/
|
|
bool is_empty (void) const;
|
|
|
|
/// Returns 0.
|
|
/**
|
|
* The queue cannot be full, so it always returns 0.
|
|
*/
|
|
bool is_full (void) const;
|
|
|
|
// = Classic queue operations.
|
|
|
|
/// Adds @a new_item to the tail of the queue. Returns 0 on success,
|
|
/// -1 on failure.
|
|
/**
|
|
* Insert an item at the end of the queue.
|
|
*/
|
|
int enqueue_tail (const T &new_item);
|
|
|
|
/// Adds @a new_item to the head of the queue. Returns 0 on success,
|
|
/// -1 on failure.
|
|
/**
|
|
* Insert an item at the head of the queue.
|
|
*/
|
|
int enqueue_head (const T &new_item);
|
|
|
|
/// Removes and returns the first @a item on the queue. Returns 0 on
|
|
/// success, -1 if the queue was empty.
|
|
/**
|
|
* Remove an item from the head of the queue.
|
|
*/
|
|
int dequeue_head (T &item);
|
|
|
|
// = Additional utility methods.
|
|
|
|
/// Reset the ACE_Unbounded_Queue to be empty and release all its
|
|
/// dynamically allocated resources.
|
|
/**
|
|
* Delete the queue nodes.
|
|
*/
|
|
void reset (void);
|
|
|
|
/// Get the @a slot th element in the set. Returns -1 if the element
|
|
/// isn't in the range {0..#cur_size_ - 1}, else 0.
|
|
/**
|
|
* Find the item in the queue between 0 and the provided index of the
|
|
* queue.
|
|
*/
|
|
int get (T *&item, size_t slot = 0) const;
|
|
|
|
/// Set the @a slot th element of the queue to @a item.
|
|
/**
|
|
* Set the @a slot th element in the set. Will pad out the set with
|
|
* empty nodes if @a slot is beyond the range {0..#cur_size_ - 1}.
|
|
* Returns -1 on failure, 0 if @a slot isn't initially in range, and
|
|
* 0 otherwise.
|
|
*/
|
|
int set (const T &item, size_t slot);
|
|
|
|
/// The number of items in the queue.
|
|
/**
|
|
* Return the size of the queue.
|
|
*/
|
|
size_t size (void) const;
|
|
|
|
/// Dump the state of an object.
|
|
void dump (void) const;
|
|
|
|
// = STL-styled unidirectional iterator factory.
|
|
ACE_Unbounded_Queue_Iterator<T> begin (void);
|
|
ACE_Unbounded_Queue_Iterator<T> end (void);
|
|
|
|
/// Declare the dynamic allocation hooks.
|
|
ACE_ALLOC_HOOK_DECLARE;
|
|
|
|
protected:
|
|
/// Delete all the nodes in the queue.
|
|
void delete_nodes (void);
|
|
|
|
/// Copy nodes into this queue.
|
|
void copy_nodes (const ACE_Unbounded_Queue<T> &);
|
|
|
|
/// Pointer to the dummy node in the circular linked Queue.
|
|
ACE_Node<T> *head_;
|
|
|
|
/// Current size of the queue.
|
|
size_t cur_size_;
|
|
|
|
/// Allocation Strategy of the queue.
|
|
ACE_Allocator *allocator_;
|
|
};
|
|
|
|
ACE_END_VERSIONED_NAMESPACE_DECL
|
|
|
|
#if defined (__ACE_INLINE__)
|
|
#include "ace/Unbounded_Queue.inl"
|
|
#endif /* __ACE_INLINE__ */
|
|
|
|
#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
|
|
#include "ace/Unbounded_Queue.cpp"
|
|
#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
|
|
|
|
#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
|
|
#pragma implementation ("Unbounded_Queue.cpp")
|
|
#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
|
|
|
|
#include /**/ "ace/post.h"
|
|
#endif /* ACE_UNBOUNDED_QUEUE_H */
|