00001
00002
00003
00004
00005 #ifndef __FSLIST_H_
00006 #define __FSLIST_H_
00007
00008 namespace fs
00009 {
00010
00011 template <class T>
00012 class list
00013 {
00014
00015 public:
00016 template <class T>
00017 struct ListItem
00018 {
00019 T data;
00020 ListItem *next, *prev;
00021 };
00022
00023 void lock ()
00024 {
00025 EnterCriticalSection (&m_cs);
00026 }
00027
00028 void unlock ()
00029 {
00030 LeaveCriticalSection (&m_cs);
00031 }
00032
00033 BOOL save (HANDLE hFile)
00034 {
00035 lock ();
00036
00037 int sz = size ();
00038 DWORD dw;
00039
00040 if (!WriteFile (hFile, &sz, sizeof (sz), &dw, NULL))
00041 {
00042 unlock ();
00043 return FALSE;
00044 }
00045
00046 for (int i = 0; i < sz; i++)
00047 {
00048 if (!WriteFile (hFile, &at (i), sizeof (T), &dw, NULL))
00049 {
00050 unlock ();
00051 return FALSE;
00052 }
00053 }
00054
00055 unlock ();
00056 return TRUE;
00057 }
00058
00059 BOOL load (HANDLE hFile)
00060 {
00061 lock ();
00062
00063 int sz;
00064 DWORD dw;
00065
00066 if (!ReadFile (hFile, &sz, sizeof (sz), &dw, NULL) || dw != sizeof (sz))
00067 {
00068 unlock ();
00069 return FALSE;
00070 }
00071
00072 if (sz < 0)
00073 {
00074 unlock ();
00075 return FALSE;
00076 }
00077
00078 while (sz--)
00079 {
00080 T data;
00081 if (!ReadFile (hFile, &data, sizeof (T), &dw, NULL) || dw != sizeof (T))
00082 {
00083 unlock ();
00084 return FALSE;
00085 }
00086
00087 add (data);
00088 }
00089
00090 unlock ();
00091 return TRUE;
00092 }
00093
00094 void add (T data)
00095 {
00096 lock ();
00097
00098 ListItem <T> *item = new ListItem <T>;
00099
00100 item->data = data;
00101 item->next = item->prev = NULL;
00102
00103 if (end)
00104 {
00105 end->next = item;
00106 item->prev = end;
00107 end = item;
00108 }
00109 else
00110 {
00111 start = end = item;
00112 }
00113
00114 _size++;
00115
00116 unlock ();
00117 }
00118
00119 void insert (int iInsert, T data)
00120 {
00121 lock ();
00122
00123 ListItem <T> *itemAfter = start;
00124 ListItem <T> *itemBefore = start;
00125 ListItem <T> *item;
00126
00127 last = NULL;
00128
00129 while (iInsert && itemAfter)
00130 {
00131 itemBefore = itemAfter;
00132 itemAfter = itemAfter->next;
00133 iInsert--;
00134 }
00135
00136 if (itemAfter == NULL)
00137 {
00138 add (data);
00139 unlock ();
00140 return;
00141 }
00142
00143 item = new ListItem <T>;
00144
00145 item->data = data;
00146 item->next = itemAfter;
00147 item->prev = itemBefore;
00148
00149 itemAfter->prev = item;
00150
00151 if (itemAfter == itemBefore)
00152 {
00153 start = item;
00154 item->prev = NULL;
00155 }
00156 else
00157 {
00158 itemBefore->next = item;
00159 }
00160
00161 _size++;
00162 unlock ();
00163 }
00164
00165 void del (int i)
00166 {
00167 lock ();
00168
00169 ListItem <T> *item = start;
00170
00171 while (i--)
00172 {
00173 item = item->next;
00174 }
00175
00176 if (item->prev)
00177 item->prev->next = item->next;
00178 else
00179 start = item->next;
00180
00181 if (item->next)
00182 item->next->prev = item->prev;
00183 else
00184 end = item->prev;
00185
00186 delete item;
00187
00188 last = NULL;
00189
00190 _size--;
00191
00192 unlock ();
00193 }
00194
00195 void clear ()
00196 {
00197 lock ();
00198
00199 if (!start)
00200 {
00201 unlock ();
00202 return;
00203 }
00204
00205 ListItem <T> *item;
00206
00207 while (start)
00208 {
00209 item = start->next;
00210 delete start;
00211 start = item;
00212 }
00213
00214 start = end = NULL;
00215 last = NULL;
00216 _size = 0;
00217
00218 unlock ();
00219 }
00220
00221 int size () const
00222 {
00223 return _size;
00224 }
00225
00226 T& at (int i)
00227 {
00228 lock ();
00229
00230 ListItem <T> *item = NULL;
00231
00232 if (last)
00233 {
00234 if (lastIndex == i)
00235 item = last;
00236 else if (i == lastIndex - 1)
00237 {
00238 item = last->prev;
00239 }
00240 else if (i == lastIndex+1)
00241 {
00242 item = last->next;
00243 }
00244 }
00245
00246 lastIndex = i;
00247
00248 if (item == NULL)
00249 {
00250 item = start;
00251 while (i--)
00252 item = item->next;
00253 }
00254
00255 last = item;
00256
00257 unlock ();
00258
00259 return item->data;
00260 }
00261
00262 int find (T& item)
00263 {
00264 lock ();
00265 for (int i = 0; i < size (); i++)
00266 if (at (i) == item)
00267 break;
00268
00269 unlock ();
00270 return i != size () ? i : -1;
00271 }
00272
00273 T& operator [] (int i)
00274 {
00275 return at (i);
00276 }
00277
00278 list& operator = (list& l)
00279 {
00280 lock ();
00281
00282 clear ();
00283 for (int i = 0; i < l.size (); i++)
00284 add (l [i]);
00285
00286 unlock ();
00287
00288 return *this;
00289 }
00290
00291 list (list& l)
00292 {
00293 start = end = NULL;
00294 last = NULL;
00295 _size = 0;
00296
00297 InitializeCriticalSection (&m_cs);
00298
00299 *this = l;
00300 }
00301
00302 list ()
00303 {
00304 start = end = NULL;
00305 last = NULL;
00306 _size = 0;
00307
00308 InitializeCriticalSection (&m_cs);
00309 }
00310
00311 ~list ()
00312 {
00313 clear ();
00314 DeleteCriticalSection (&m_cs);
00315 };
00316
00317 private:
00318 ListItem <T> *start, *end;
00319 ListItem <T> *last; int lastIndex;
00320 int _size;
00321 CRITICAL_SECTION m_cs;
00322 };
00323
00324 };
00325
00326 #endif