#ifndef __RWXPORDVEC_H__
#define __RWXPORDVEC_H__

/*
 * RWTPtrOrderedVector<TP>: Ordered collection of pointers to objects of type TP.
 *
 * $Id: xpordvec.h,v 7.5 1996/05/07 17:59:53 kyle Exp $
 *
 * (c) Copyright 1989 - 1996 Rogue Wave Software, Inc.
 * ALL RIGHTS RESERVED
 *
 * The software and information contained herein are proprietary to, and
 * comprise valuable trade secrets of, Rogue Wave Software, Inc., which
 * intends to preserve as trade secrets such software and information.
 * This software is furnished pursuant to a written license agreement and
 * may be used, copied, transmitted, and stored only in accordance with
 * the terms of such license and with the inclusion of the above copyright
 * notice.  This software and information or any other copies thereof may
 * not be provided or otherwise made available to any other person.
 *
 * Notwithstanding any other lease or license that may pertain to, or
 * accompany the delivery of, this computer software and information, the
 * rights of the Government regarding its use, reproduction and disclosure
 * are as set forth in Section 52.227-19 of the FARS Computer
 * Software-Restricted Rights clause.
 * 
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
 * Technical Data and Computer Software clause at DFARS 252.227-7013.
 * Contractor/Manufacturer is Rogue Wave Software, Inc.,
 * P.O. Box 2328, Corvallis, Oregon 97339.
 *
 * This computer software and information is distributed with "restricted
 * rights."  Use, duplication or disclosure is subject to restrictions as
 * set forth in NASA FAR SUP 18-52.227-79 (April 1985) "Commercial
 * Computer Software-Restricted Rights (April 1985)."  If the Clause at
 * 18-52.227-74 "Rights in Data General" is specified in the contract,
 * then the "Alternate III" clause applies.
 *
 ***************************************************************************
 *
 * Stores a pointer to the inserted item into the collection.
 *
 * Assumes that TP has:
 *   - well-defined equality semantics (TP::operator==(const TP&)).
 *
 ***************************************************************************
 *
 * $Log: xpordvec.h,v $
 * Revision 7.5  1996/05/07 17:59:53  kyle
 * Added export pragma for Mac code fragments
 *
 * Revision 7.4  1996/03/18 16:04:45  jims
 * Port to cfront template mechanism
 *
 * Revision 7.3  1996/03/16 15:15:37  jims
 * Port non-stdlib template persistence to DEC and Watcom
 *
 * Revision 7.2  1996/01/27 01:36:34  kevinj
 * Simple External Template Persistence (ETP).
 *
 * Revision 7.1  1995/11/13 12:30:40  jims
 * Move to revision 7.1
 *
 * Revision 7.4  1995/09/17 07:52:14  jims
 * Don't decrement nitems_ in removeLast until safe from bounds error
 *
 * Revision 7.3  1995/09/05  20:23:26  jims
 * Use new copyright macro
 *
 * Revision 7.2  1995/04/18  08:35:02  jims
 * Scopus TAN ID# 82: Use RWTExport to use templates with Tools DLL under
 * MSVC 2.x
 *
 * Revision 7.1  1994/10/16  03:06:18  josh
 * Merged 6.1 and 7.0 development trees
 *
 * Revision 6.3  1994/07/12  19:58:19  vriezen
 * Update Copyright notice
 *
 * Revision 6.1.7.3  1994/04/20  22:16:14  vriezen
 * Bug #337 Fix bounds check for ordered and sorted vectors.
 *
 * Revision 6.2  1994/06/17  17:21:42  vriezen
 * Added virtual dtor or change dtor to virtual to enhance
 * derivability and quiet some compilers.
 *
 * Revision 6.1  1994/04/15  19:47:55  vriezen
 * Move all files to 6.1
 *
 * Revision 6.1.7.2  1994/04/18  20:17:15  vriezen
 * Added or changed to virtual dtor to make class more usable as base and quiet some compilers.
 *
 * Revision 6.1.7.1  1994/04/15  22:45:42  vriezen
 * Version 7, Initial code
 *
 * Revision 6.1  1994/04/15  19:47:55  vriezen
 * Move all files to 6.1
 *
 * Revision 2.12  1994/01/12  03:09:17  jims
 * Add constness to T* parameters where appropriate
 *
 * Revision 2.11  1993/12/31  00:56:30  jims
 * ObjectStore version: add get_os_typespec() static member function
 *
 * Revision 2.10  1993/12/10  19:44:18  jims
 * ObjectStore version: Add explicit copy constructors to avoid problem
 * with the ones generated by the OSCC compiler
 *
 * Revision 2.9  1993/09/10  02:56:53  keffer
 * Switched RCS idents to avoid spurious diffs
 *
 * Revision 2.8  1993/08/03  00:42:43  keffer
 * Changed return type of data().
 *
 * Revision 2.7  1993/06/06  01:29:31  keffer
 * Added RWTExport keyword to class declaration
 *
 * Revision 2.6  1993/04/09  19:35:45  keffer
 * Indexing is now done using size_t
 *
 * Revision 2.5  1993/03/24  01:29:51  keffer
 * Indexing operations now used unsigned
 *
 * Revision 2.4  1993/02/12  00:18:50  keffer
 * Ported to the IBM xlC compiler
 *
 * Revision 2.3  1993/01/29  03:07:03  keffer
 * Increased code reuse between ordered and sorted vectors
 *
 * Revision 2.2  1993/01/28  02:39:24  keffer
 * Ported to cfront V3.0
 *
 *    Rev 1.0   02 Mar 1992 16:10:54   KEFFER
 * Initial revision.
 */

#include "rw/tpvector.h"
#include "rw/rwerr.h"
#include "rw/toolerr.h"

/****************************************************************
 *								*
 *	Declarations for RWTPtrOrderedVector<TP>		*
 *								*
 ****************************************************************/

#ifdef RW_PRAGMA_EXPORT
#pragma export on
#endif

template <class TP> class RWTExport RWTPtrOrderedVector : private RWTPtrVector<TP>
{

public:

  //Constructors:
  RWTPtrOrderedVector(size_t capac=RWDEFAULT_CAPACITY)
    : RWTPtrVector<TP>(capac),
      nitems_(0)
  {;}

  TP*&		operator()(size_t i)       {
#ifdef RWBOUNDS_CHECK
    boundsCheck(i);
#endif
    return RWTPtrVector<TP>::operator()(i);
  }
  TP*const&	operator()(size_t i) const {
#ifdef RWBOUNDS_CHECK
    boundsCheck(i);
#endif
    return RWTPtrVector<TP>::operator()(i);
  }

  TP*&		operator[](size_t i)
    {boundsCheck(i); return RWTPtrVector<TP>::operator()(i);}
  TP*const&	operator[](size_t i) const
    {boundsCheck(i); return RWTPtrVector<TP>::operator()(i);}

  //Member functions:
  void			append(TP* val)		{insertAt(nitems_,val);}
  TP*&			at(size_t i)		{return (*this)[i];}
  TP*const&		at(size_t i) const	{return (*this)[i];}
  void			clear()			{nitems_=0; reshape(RWDEFAULT_CAPACITY);}
  void			clearAndDestroy();
  RWBoolean		contains(const TP* a) const {return index(a) != RW_NPOS;}
  TP*const*		data() const		{return RWTPtrVector<TP>::data();}
  size_t		entries() const		{return nitems_;}
  TP*			find(const TP* p) const;
  TP*&			first()      		{return (*this)(0);}
  TP*const&		first() const		{return (*this)(0);}
  virtual size_t	index(const TP* p) const;
  virtual void		insert(TP* val)		{insertAt(nitems_,val);}
  void			insertAt(size_t, TP*);
  RWBoolean		isEmpty() const		{return nitems_==0;}
  TP*&		        last()   		{return (*this)(nitems_-1);}
  TP*const&		last() const		{return (*this)(nitems_-1);}
  size_t		length() const		{return nitems_;}
  virtual size_t	occurrencesOf(const TP*) const;
  void			prepend(TP* val)	{insertAt(0, val);}
  virtual TP*		remove(const TP* p);
  virtual size_t	removeAll(const TP*);
  TP*			removeAt(size_t);
  TP*			removeFirst()		{return removeAt(0);}
  TP*			removeLast()
    { TP* ret = last(); --nitems_; return ret; }

  void			resize(size_t N)	{if(N>=nitems_) reshape(N);}

protected:
  void			boundsCheck(size_t i) const;

  size_t		nitems_;	// Number of items in the collection

};

#include "rw/edefs.h"
RWDECLARE_PERSISTABLE_TEMPLATE(RWTPtrOrderedVector)

#ifdef RW_NO_TEMPLINST_ON_BASE
class RWExport RWpistream; class RWExport RWpostream;
class RWExport RWbistream; class RWExport RWbostream; 
class RWExport RWeistream; class RWExport RWeostream;
RWDECLARE_PERSIST_TEMPLATE_IO(RWTPtrOrderedVector,RWpistream,RWpostream)
RWDECLARE_PERSIST_TEMPLATE_IO(RWTPtrOrderedVector,RWbistream,RWbostream)
RWDECLARE_PERSIST_TEMPLATE_IO(RWTPtrOrderedVector,RWeistream,RWeostream)
#endif     


template <class T, class S>
void rwSaveGuts(S& str, const RWTPtrOrderedVector<T>& c);

template <class T, class S>
void rwRestoreGuts(S& str, RWTPtrOrderedVector<T>& c);


#ifdef RW_COMPILE_INSTANTIATE
# include "rw/xpordvec.cc"
#endif

#ifdef RW_PRAGMA_EXPORT
#pragma export off
#endif

#endif  /* __RWXPORDVEC_H__ */

