00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 #include <stdlib.h>
00059 #include "defs.h"
00060 #include "mempool.h"
00061 #include "errors.h"
00062 #include "cg_vector.h"
00063
00064
00065 VECTOR
00066 VECTOR_Init (INT size, MEM_POOL *pool)
00067 {
00068 VECTOR v = TYPE_MEM_POOL_ALLOC (VECTOR_STRUCT, pool);
00069 v->vector = TYPE_MEM_POOL_ALLOC_N (void *, pool, size);
00070 VECTOR_size(v) = size;
00071 VECTOR_count(v) = 0;
00072 return v;
00073 }
00074
00075
00076 void
00077 VECTOR_Add_Element (VECTOR vector, void *element)
00078 {
00079 INT count = VECTOR_count(vector);
00080 FmtAssert (count < VECTOR_size(vector), ("VECTOR overflow"));
00081 VECTOR_element(vector, count) = element;
00082 count++;
00083 VECTOR_count(vector) = count;
00084 }
00085
00086
00087 BOOL
00088 VECTOR_Member_Element (VECTOR vector, void *element)
00089 {
00090 INT i, count = VECTOR_count(vector);
00091 #ifdef KEY
00092 FmtAssert (count <= VECTOR_size(vector), ("VECTOR overflow"));
00093 #else
00094 FmtAssert (count < VECTOR_size(vector), ("VECTOR overflow"));
00095 #endif // KEY
00096
00097 for (i = 0; i < count; i++) {
00098 if (VECTOR_element(vector,i) == element) {
00099 return TRUE;
00100 }
00101 }
00102
00103 return FALSE;
00104 }
00105
00106 void
00107 VECTOR_Sorted_Add_Element (
00108 VECTOR vector,
00109 void *element,
00110 VECTOR_ELEMENT_COMPARE compare_func)
00111 {
00112 INT i;
00113 INT count = VECTOR_count(vector);
00114 FmtAssert (count < VECTOR_size(vector), ("VECTOR overflow"));
00115 for (i = count; i > 0; i--) {
00116 void *cur_element = VECTOR_element(vector,i-1);
00117 if (compare_func (cur_element, element) > 0) break;
00118 VECTOR_element(vector,i) = cur_element;
00119 }
00120 VECTOR_element(vector, i) = element;
00121 count++;
00122 VECTOR_count(vector) = count;
00123 }
00124
00125
00126 void
00127 VECTOR_Sort (VECTOR vector, VECTOR_ELEMENT_COMPARE compare_func)
00128 {
00129 qsort (
00130 &VECTOR_element(vector,0),
00131 VECTOR_count(vector),
00132 sizeof (void *),
00133 compare_func);
00134 }
00135
00136 void
00137 VECTOR_Reset (VECTOR vector)
00138 {
00139 VECTOR_count(vector) = 0;
00140 }
00141
00142 void
00143 VECTOR_Delete_Element (VECTOR vector, void *element)
00144 {
00145 INT i, j;
00146 INT count = VECTOR_count(vector);
00147
00148 for (i = 0; i < count; i++) {
00149 if (VECTOR_element(vector,i) == element) {
00150 for (j = i+1; j < count; j++) {
00151 VECTOR_element(vector, j-1) = VECTOR_element(vector, j);
00152 }
00153 VECTOR_count(vector) = count-1;
00154 return;
00155 }
00156 }
00157 }