00001 //************************************************************************************ 00002 // Module : gtlistarray.hpp 00003 // Date : 4/19/05 (DLR) 00004 // Copyright : 2005-2006 Copyright University Corporation for Atmospheric 00005 // Research 00006 // Description : Encapsulates the methods and data associated with 00007 // a simple template linked list of linked lists. 00008 // Derived From : none. 00009 // Modifications: 00010 //************************************************************************************ 00011 #if !defined(GTLISTARRAY_HPP) 00012 #define GTLISTARRAY_HPP 00013 00014 #include <iostream.h> 00015 #include <string> 00016 #include <stdlib.h> 00017 #include "gtypes.h" 00018 #include "gelemlist.hpp" 00019 #include "gfieldlist.hpp" 00020 #include "gneighbor.hpp" 00021 00022 #if !defined(GFieldListArray) 00023 # define GFieldListArray GTListArray<GFieldList> 00024 #endif 00025 00026 #if !defined(GElemListArray) 00027 # define GElemListArray GTListArray<GElemList> 00028 #endif 00029 00030 #if !defined(LISTARRAYELEM_T) 00031 #define LISTARRAYELEM_T 00032 #define TListArrayElem ListArrayElemT<TT> 00033 template<class TT> class ListArrayElemT { 00034 public: 00035 GINT id; 00036 GBOOL cf; 00037 TT *member; 00038 TListArrayElem *next; 00039 TListArrayElem *prev; 00040 }; 00041 #endif 00042 00043 template <class TT> class GTListArray 00044 { 00045 00046 public: 00047 GTListArray(GBOOL renumber_on_delete=FALSE); 00048 GTListArray(GINT nelems, GBOOL renumber_on_delete=FALSE); 00049 GTListArray(const GTListArray &); 00050 ~GTListArray(); 00051 00052 friend ostream& operator<<(ostream&, GTListArray<TT>&); 00053 void add(); 00054 void add(TT *c, GBOOL delete_here=FALSE); 00055 TT *del(TListArrayElem *e); 00056 TT *del(TT *c); 00057 TT *del(GINT id); 00058 void start(TListArrayElem *p=NULL); 00059 GINT size() ; 00060 TT *member(); 00061 TT *member(GINT id); 00062 TListArrayElem *next(); 00063 TListArrayElem *curr(); 00064 inline TListArrayElem *find(GINT id){ TListArrayElem *p=pCurr; 00065 if ( p && p->id == id ) return p; 00066 else if ( p && p->next && p->next->id == id ) { 00067 next(); return p->next; } 00068 00069 start(NULL); 00070 while ( (p=curr()) != NULL ) { 00071 if ( p->id == id ) return p; next(); } 00072 return NULL; } 00073 inline TListArrayElem *find(TT *c) { TListArrayElem *p=pCurr; 00074 if ( p && p->member == c ) return p; 00075 else if ( p && p->next && p->next->member == c ) { 00076 next(); return p->next; } 00077 00078 start(NULL); 00079 while ( (p=curr()) != NULL ) { 00080 if ( p->member == c ) return p; next(); } 00081 return NULL; } 00082 TT &operator()(const GINT iElem); 00083 TT &operator[](const GINT iElem); 00084 GBOOL renumber(); 00085 void empty(); 00086 // GBOOL inlist(GSHORT iproc, GINT ielem); 00087 00088 00089 private: 00090 // Private methods: 00091 00092 00093 00094 // Private data: 00095 GINT nid; 00096 GINT num; 00097 GBOOL doRenumber; 00098 TListArrayElem *pStart; 00099 TListArrayElem *pCurr; 00100 TListArrayElem *pEnd; 00101 00102 }; 00103 # if defined(_LINUX) || defined(_AIX) 00104 template class GTListArray<GFieldList>; 00105 ostream &operator <<(ostream&, GTListArray<GFieldList>&); 00106 template class GTListArray<GElemList>; 00107 ostream &operator <<(ostream&, GTListArray<GElemList>&); 00108 template class GTListArray<GNeighbor>; 00109 ostream &operator <<(ostream&, GTListArray<GNeighbor>&); 00110 # endif 00111 #endif 00112