SWIList.hpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:13k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. #ifndef SWILIST_HPP
  2. #define SWILIST_HPP
  3. /****************License************************************************
  4.  * Vocalocity OpenVXI
  5.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License
  8.  * as published by the Free Software Foundation; either version 2
  9.  * of the License, or (at your option) any later version.
  10.  *  
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  20.  * registered trademarks of Vocalocity, Inc. 
  21.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  22.  * by Vocalocity.
  23.  ***********************************************************************/
  24. /**
  25.  * Class to encapsulate list operations.  In order to be able to easily
  26.  * implement copy-on-write semantic, SWILists created using the copy which
  27.  * takes in a list or using the operator= share the same data.  When SWILists
  28.  * are shared, changes made on one SWIList object will have been made on the
  29.  * other SWIList object as well.  Although NULL pointers can be put in a list,
  30.  * one as to be careful with the use of NULL pointers as they are used as a
  31.  * way to determine whether a list is empty, or whether iteration is
  32.  * complete.
  33.  *
  34.  * @doc
  35.  **/
  36. #include "SWIutilHeaderPrefix.h"
  37. class SWIListCell;
  38. class SWIUTIL_API_CLASS SWIList
  39. {
  40.   /**
  41.    * Default constructor.
  42.    **/
  43.  public:
  44.   SWIList();
  45.   /**
  46.     * copy constructor It creates a new list whose representation is a copy
  47.     * of aList.
  48.    **/
  49.  public:
  50.   SWIList(SWIList const& aList);
  51.   // ------------------------------------------------------------
  52.   /**
  53.    * Destructor.
  54.    * Note that the elements of the list need to be reclaimed by the user.
  55.    **/
  56.  public:
  57.   ~SWIList();
  58.   /**
  59.    * Assignment operator.  Assigning SWIList copies data into the new list.
  60.    **/
  61.  public:
  62.   SWIList& operator=(const SWIList& aList);
  63.   /**
  64.    * Returns the number of elements in this list.
  65.    *
  66.    * @return the number of elements in this collection
  67.    */
  68.  public:
  69.   int size() const
  70.   {
  71.     return _size;
  72.   }
  73.   /**
  74.    * Returns <tt>true</tt> if this collection contains no elements.
  75.    *
  76.    * @return <tt>true</tt> if this collection contains no elements
  77.    **/
  78.  public:
  79.   bool isEmpty() const
  80.   {
  81.     return _size == 0;
  82.   };
  83.   /**
  84.    * Returns <tt>true</tt> if this list contains the specified
  85.    * element.  More formally, returns <tt>true</tt> if and only if this
  86.    * collection contains at least one element <tt>e</tt> such that
  87.    * <tt>obj == e</tt>.
  88.    *
  89.    * @param obj element whose presence in this collection is to be tested.
  90.    * @return <tt>true</tt> if this collection contains the specified
  91.    *         element
  92.    **/
  93.  public:
  94.   bool contains(void *obj) const;
  95.  public:
  96.   class SWIUTIL_API_CLASS Iterator
  97.   {
  98.    public:
  99.     enum Position
  100.     {
  101.       BEG,
  102.       END
  103.     };
  104.    public:
  105.     Iterator(SWIList& theList, Position pos = BEG);
  106.     /**
  107.      * Copy constructor.  Creates an Iterator iterating on the same list and
  108.      * whose cursor is at the same position than the iterator.  Changing the
  109.      * cursor position on one Iterator does not affect the cursor position of
  110.      * the other Iterator.  One has to be careful about concurrent
  111.      * modifications to the list.
  112.      * @param iter The iterator to be copied.
  113.      **/
  114.    public:
  115.     Iterator(const Iterator& iter);
  116.    public:
  117.     void setPos(Position pos);
  118.     /**
  119.      * Assignment.  Make the Iterator iterating on the same list and having
  120.      * the cursor at the same position than the specified iterator.  Changing
  121.      * the cursor position on one Iterator does not affect the cursor position
  122.      * of the other Iterator.  One has to be careful about concurrent
  123.      * modifications to the list.
  124.      * @param iter The iterator to be copied.
  125.      **/
  126.    public:
  127.     Iterator& operator=(const Iterator& iter);
  128.    public:
  129.     ~Iterator();
  130.     /**
  131.      * Returns <tt>true</tt> if this iterator has more elements when
  132.      * traversing the list in the forward direction. (In other words, returns
  133.      * <tt>true</tt> if <tt>next</tt> would return an element rather than
  134.      * NULL.
  135.      *
  136.      * @return <tt>true</tt> if the iterator has more elements when
  137.      * traversing the list in the forward direction.
  138.      **/
  139.    public:
  140.     bool hasNext() const;
  141.     /**
  142.      * Returns <tt>true</tt> if this list iterator has more elements when
  143.      * traversing the list in the reverse direction.  (In other words, returns
  144.      * <tt>true</tt> if <tt>previous</tt> would return an element rather than
  145.      * NULL.
  146.      *
  147.      * @return <tt>true</tt> if the iterator has more elements when
  148.      *        traversing the list in the reverse direction.
  149.      */
  150.    public:
  151.     bool hasPrevious() const;
  152.     /**
  153.      * Advances the cursor and returns the element at the new cursor
  154.      * position. This method may be called repeatedly to iterate through the
  155.      * list, or intermixed with calls to <tt>previous</tt> to go back and
  156.      * forth.
  157.      *
  158.      * @return the next element in the list, NULL if at end of list.
  159.      **/
  160.    public:
  161.     void *next() const;
  162.     /**
  163.      * Moves the cursor backward and Return the element at the new cursor
  164.      * position.  This method may be called repeatedly to iterate through the
  165.      * list, or intermixed with calls to <tt>previous</tt> to go back and
  166.      * forth.
  167.      *
  168.      * @return the previous element in the list, NULL if at beginning of list.
  169.      **/
  170.    public:
  171.     void *previous() const;
  172.     // Modification Operations
  173.     /**
  174.      * Replaces the element at the current cursor position with the specified
  175.      * element.
  176.      *
  177.      * @param item the element with which to replace the current element
  178.      * returned by <tt>next</tt> or <tt>previous</tt>.
  179.      *
  180.      * @return The replaced element or NULL, if the cursor is before the first
  181.      * element or after the last.
  182.      **/
  183.    public:
  184.     void *set(void *item);
  185.     /**
  186.      * Inserts the specified element into the list before the current cursor
  187.      * position.  If the cursor is before the first element or the list is
  188.      * empty, the element is added at the beginning of the list.  The cursor
  189.      * position is not affected, so a call to <code>previous</code> returns
  190.      * the newly inserted element (except for the case where the cursor was
  191.      * before the first element), and a call to <code>next</code> is
  192.      * unaffected.
  193.      *
  194.      * @param item the element to insert.
  195.      * @return <code>true</code> if the element could be added or <code>false</code> otherwise.
  196.      **/
  197.    public:
  198.     bool insertBefore(void *item);
  199.     /**
  200.      * Inserts the specified element into the list after the current cursor
  201.      * position.  If the cursor is after the last element or the list is
  202.      * empty, the element is added at the end of the list.  The cursor
  203.      * position is not affected, so a call to <code>next</code> returns
  204.      * the newly inserted element (except for the case where the cursor was
  205.      * after the last element), and a call to <code>previous</code> is
  206.      * unaffected.
  207.      *
  208.      * @param item the element to insert.
  209.      * @return <code>true</code> if the element could be added or <code>false</code> otherwise.
  210.      **/
  211.    public:
  212.     bool insertAfter(void *item);
  213.     /**
  214.      * Removes the current item from the list and moves the cursor backward.
  215.      * The new current element is the one that would have been returned by
  216.      * <code>previous</code> so a call to <code>next</code> is unaffected.
  217.      *
  218.      * @return the removed element or NULL if the cursor was before the
  219.      * first element or after the last.
  220.      **/
  221.    public:
  222.     void* removeBack();
  223.     /**
  224.      * Removes the current from the list and moves the cursor forward.
  225.      * The new current element is the one that would have been returned by
  226.      * <code>next</code> so a call to <code>previous</code> is unaffected.
  227.      *
  228.      * @return the removed element or NULL if the cursor was before the
  229.      * first element or after the last.
  230.      **/
  231.    public:
  232.     void* removeFront();
  233.    private:
  234.     friend class SWIList;
  235.    private:
  236.     mutable SWIListCell* _cursor;
  237.     SWIList* _list;
  238.   };
  239.   /**
  240.    * Returns an iterator over the elements in this list positioned before
  241.    * the first element of the list.
  242.    *
  243.    * @return an <tt>Iterator</tt> over the elements in this list.
  244.    **/
  245.  public:
  246.   Iterator iterator();
  247.   /**
  248.    * Returns an iterator over the elements in this list positioned before
  249.    * the first element of the list.
  250.    *
  251.    * @return an <tt>Iterator</tt> over the elements in this list.
  252.    **/
  253.  public:
  254.   const Iterator iterator() const;
  255.   /**
  256.    * Returns an iterator over the elements in this list positioned after the
  257.    * last element of the list.
  258.    *
  259.    * @return an <tt>Iterator</tt> over the elements in this list.
  260.    **/
  261.  public:
  262.   Iterator reverseIterator();
  263.   /**
  264.    * Returns an iterator over the elements in this list positioned after the
  265.    * last element of the list.
  266.    *
  267.    * @return an <tt>Iterator</tt> over the elements in this list.
  268.    **/
  269.  public:
  270.   const Iterator reverseIterator() const;
  271.   /**
  272.    * Add the specified element at the end of this list.
  273.    *
  274.    * @param item the element to insert.
  275.    * @return <code>true</code> if the element could be added or <code>false</code> otherwise.
  276.    **/
  277.  public:
  278.   bool addLast(void *obj);
  279.   /**
  280.    * Add the specified element at the beginning of this list.
  281.    *
  282.    * @param item the element to insert.
  283.    * @return <code>true</code> if the element could be added or <code>false</code> otherwise.
  284.    **/
  285.  public:
  286.   bool addFirst(void *obj);
  287.   /**
  288.    * Returns the first element of the list.
  289.    *
  290.    * @return the first element of the list or NULL if the list is empty.
  291.    **/
  292.  public:
  293.   void *first() const;
  294.   /**
  295.    * Returns the last element of the list.
  296.    *
  297.    * @return the last element of the list or NULL if the list is empty.
  298.    **/
  299.  public:
  300.   void *last() const;
  301.   /**
  302.    * Removes the first element from this list, if it the list is not
  303.    * empty. Returns the element removed or NULL if this is empty.  This method
  304.    * should not be called while iterating on a list as it may invalidate the
  305.    * iterator.
  306.    * @return The element that was removed or NULL if the list was empty.
  307.    **/
  308.  public:
  309.   void *removeFirst();
  310.   /**
  311.    * Removes the last element from this list, if it the list is not
  312.    * empty. Returns the element removed or NULL if this is empty.  This method
  313.    * should not be called while iterating on a list as it may invalidate the
  314.    * iterator.
  315.    * @return The element that was removed or NULL if the list was empty.
  316.    **/
  317.  public:
  318.   void *removeLast();
  319.   /**
  320.    * Removes the first occurence of the specified element from this list, if
  321.    * it is present. Returns true if this list contained the specified
  322.    * element (or equivalently, if this list changed as a result of the
  323.    * call).
  324.    *
  325.    * @param obj element to be removed from this list, if present.
  326.    * @return <tt>true</tt> if this collection changed as a result of the
  327.    *         call
  328.    **/
  329.  public:
  330.    bool remove(void *obj);
  331.   /**
  332.    * Removes all occurences of the specified element from this list, if it is
  333.    * present. Returns true if this list contained the specified element (or
  334.    * equivalently, if this list changed as a result of the call).  This method
  335.    * should not be called while iterating on a list as it may invalidate the
  336.    * iterator.
  337.    *
  338.    * @param obj element to be removed from this list.
  339.    * @return <tt>true</tt> if this collection changed as a result of the call
  340.    **/
  341.  public:
  342.   bool removeAll(void *obj);
  343.   /**
  344.    * Removes all of the elements from this list.  This list will be empty
  345.    * after this method returns.  This method should not be called while
  346.    * iterating on a list as it may invalidate the iterator.
  347.    **/
  348.  public:
  349.   void clear();
  350.   /**
  351.    * The list representation.
  352.    **/
  353.  private:
  354.   // Pointer to the head and tail elements of the list.  They are not really
  355.   // part of the list.  They are present to simplify insertion and removal
  356.   // algorithm.
  357.   SWIListCell* _head;
  358.   SWIListCell* _tail;
  359.   int _size;
  360.   /**
  361.    * Returns a pointer to the first cell which points to pItem
  362.    **/
  363.   SWIListCell* getCell(void* pItem);
  364.    /**
  365.     * Removes the given cell by relinking it previous and next cell
  366.     * and deleting it.  It also decrements the size member of the
  367.     * list representation.
  368.     **/
  369.   void remove(SWIListCell* pCell);
  370.   friend class Iterator;
  371. };
  372. #endif