initial commit for version 1.5.x patch release
[OpenFOAM-1.5.x.git] / applications / utilities / surface / surfaceCoarsen / bunnylod / list.h
blobf3b593f96c026e0f5f7136d31131de0740c10114
1 /*
2 * A generic template list class.
3 * Fairly typical of the list example you would
4 * find in any c++ book.
5 */
6 #ifndef GENERIC_LIST_H
7 #define GENERIC_LIST_H
9 #include <assert.h>
10 #include <stdio.h>
12 template <class Type> class List {
13 public:
14 List(int s=0);
15 ~List();
16 void allocate(int s);
17 void SetSize(int s);
18 void Pack();
19 void Add(Type);
20 void AddUnique(Type);
21 int Contains(Type);
22 void Remove(Type);
23 void DelIndex(int i);
24 Type * element;
25 int num;
26 int array_size;
27 Type &operator[](int i){assert(i>=0 && i<num); return element[i];}
31 template <class Type>
32 List<Type>::List(int s){
33 num=0;
34 array_size = 0;
35 element = NULL;
36 if(s) {
37 allocate(s);
41 template <class Type>
42 List<Type>::~List(){
43 delete element;
46 template <class Type>
47 void List<Type>::allocate(int s){
48 assert(s>0);
49 assert(s>=num);
50 Type *old = element;
51 array_size =s;
52 element = new Type[array_size];
53 assert(element);
54 for(int i=0;i<num;i++){
55 element[i]=old[i];
57 if(old) delete old;
59 template <class Type>
60 void List<Type>::SetSize(int s){
61 if(s==0) { if(element) delete element;}
62 else { allocate(s); }
63 num=s;
65 template <class Type>
66 void List<Type>::Pack(){
67 allocate(num);
70 template <class Type>
71 void List<Type>::Add(Type t){
72 assert(num<=array_size);
73 if(num==array_size) {
74 allocate((array_size)?array_size *2:16);
76 //int i;
77 //for(i=0;i<num;i++) {
78 // dissallow duplicates
79 // assert(element[i] != t);
80 //}
81 element[num++] = t;
84 template <class Type>
85 int List<Type>::Contains(Type t){
86 int i;
87 int count=0;
88 for(i=0;i<num;i++) {
89 if(element[i] == t) count++;
91 return count;
94 template <class Type>
95 void List<Type>::AddUnique(Type t){
96 if(!Contains(t)) Add(t);
100 template <class Type>
101 void List<Type>::DelIndex(int i){
102 assert(i<num);
103 num--;
104 while(i<num){
105 element[i] = element[i+1];
106 i++;
110 template <class Type>
111 void List<Type>::Remove(Type t){
112 int i;
113 for(i=0;i<num;i++) {
114 if(element[i] == t) {
115 break;
118 DelIndex(i);
119 for(i=0;i<num;i++) {
120 assert(element[i] != t);
128 #endif