home *** CD-ROM | disk | FTP | other *** search
- #ifndef __RWGORDVEC_H__
- #define __RWGORDVEC_H__
- pragma push_align_members(64);
-
- /*
- * GOrderedVector(val): <generic.h> style Ordered Vector of type val
- *
- * $Header: E:/vcs/rw/gordvec.h_v 1.0 04 Mar 1992 18:57:56 KEFFER $
- *
- ****************************************************************************
- *
- * Rogue Wave
- * P.O. Box 2328
- * Corvallis, OR 97339
- * Voice: (503) 754-3010 FAX: (503) 757-6650
- *
- * Copyright (C) 1989, 1990, 1991, 1992. This software is subject to copyright
- * protection under the laws of the United States and other countries.
- *
-
- *
- * To use this class you must declare and implement the
- * base class GVector(val), as well as the ordered collection itself.
- *
- * Example: To declare and implement an ordered vector of doubles:
- *
- * #include <rw/gordvec.h>
- *
- * declare(GVector,double) // Declare the base class
- * declare(GOrderedVector,double) // Declare the ordered vector
- *
- * // In one and only one .cpp file you must put the following:
- * implement(GVector,double) // Implement the base class
- * implement(GOrderedVector,double) // Implement the ordered vector
- *
- * // To use:
- * void func(){
- * GOrderedVector(double) ord;
- * ord.insert(22.1);
- * ord.insert(5.0); // etc.
- * }
- *
- ***************************************************************************
- *
- * $Log: E:/vcs/rw/gordvec.h_v $
- *
- * Rev 1.0 04 Mar 1992 18:57:56 KEFFER
- * Initial revision.
- *
- */
-
- #include "rw/tooldefs.h"
- #include "rw/gvector.h"
-
- #define GOrderedVector(val) name2(val,GOrderedVector)
-
- #define GOrderedVectordeclare(val) \
- class RWExport GOrderedVector(val) : private GVector(val) { \
- unsigned _nitems; /* Number of slots in use */ \
- public: \
- GOrderedVector(val)(unsigned capac=RWDEFAULT_CAPACITY) : GVector(val)(capac) \
- {_nitems=0;} \
- val operator()(int i) const { return array[i];} \
- val& operator()(int i) { return array[i];} \
- val operator[](int i) const \
- { if (i<0 || i>=_nitems) callerror(GVector,val,1,"GOrderedVector index out of range."); \
- return array[i]; } \
- val& operator[](int i) \
- { if (i<0 || i>=_nitems) callerror(GVector,val,1,"GOrderedVector index out of range."); \
- return array[i]; } \
- void clear() {_nitems=0;} \
- unsigned entries() const {return _nitems;} \
- int index(val) const; \
- void insert(val item) {insertAt(_nitems, item);} \
- void insertAt(int indx, val item); \
- RWBoolean isEmpty() const {return _nitems==0;} \
- unsigned length() const {return _nitems;} \
- void removeAt(int); \
- void resize(unsigned N); \
- };
-
- #define GOrderedVectorimplement(val) \
- int GOrderedVector(val)::index(val item) const \
- { \
- for(int i=0; i<_nitems; i++) if (array[i]==item) return i; \
- return -1; \
- } \
- \
- void GOrderedVector(val)::insertAt(int ipt, val item) \
- { \
- if(_nitems>=GVector(val)::length()) /* Check for overflow */ \
- resize(_nitems + RWDEFAULT_RESIZE); \
- \
- for(register i=(int)_nitems; i>ipt; i--) /* Slide right (could be very expensive) */ \
- array[i] = array[i-1]; \
- \
- _nitems++; \
- array[ipt] = item; \
- } \
- \
- void GOrderedVector(val)::removeAt(int ipt) \
- { \
- /* Slide left (could be very expensive): */ \
- for(register i=ipt; i<_nitems-1; i++) array[i] = array[i+1]; \
- _nitems--; \
- } \
- \
- void GOrderedVector(val)::resize(unsigned N) \
- { if(N>_nitems) GVector(val)::resize(N); }
-
- pragma pop_align_members();
- #endif
-