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 BOOL save (HANDLE hFile)
00024 {
00025 int sz = size ();
00026 DWORD dw;
00027
00028 if (!WriteFile (hFile, &sz, sizeof (sz), &dw, NULL))
00029 return FALSE;
00030
00031 for (int i = 0; i < sz; i++)
00032 {
00033 if (!WriteFile (hFile, &at (i), sizeof (T), &dw, NULL))
00034 return FALSE;
00035 }
00036
00037 return TRUE;
00038 }
00039
00040 BOOL load (HANDLE hFile)
00041 {
00042 int sz;
00043 DWORD dw;
00044
00045 if (!ReadFile (hFile, &sz, sizeof (sz), &dw, NULL) || dw != sizeof (sz))
00046 return FALSE;
00047
00048 if (sz < 0)
00049 return FALSE;
00050
00051 while (sz--)
00052 {
00053 T data;
00054 if (!ReadFile (hFile, &data, sizeof (T), &dw, NULL) || dw != sizeof (T))
00055 return FALSE;
00056
00057 add (data);
00058 }
00059
00060 return TRUE;
00061 }
00062
00063 void add (T data)
00064 {
00065 ListItem <T> *item = new ListItem <T>;
00066
00067 item->data = data;
00068 item->next = item->prev = NULL;
00069
00070 if (end)
00071 {
00072 end->next = item;
00073 item->prev = end;
00074 end = item;
00075 }
00076 else
00077 {
00078 start = end = item;
00079 }
00080
00081 _size++;
00082 }
00083
00084 void insert (int iInsert, T data)
00085 {
00086 ListItem <T> *itemAfter = start;
00087 ListItem <T> *itemBefore = start;
00088 ListItem <T> *item;
00089
00090 last = NULL;
00091
00092 while (iInsert && itemAfter)
00093 {
00094 itemBefore = itemAfter;
00095 itemAfter = itemAfter->next;
00096 iInsert--;
00097 }
00098
00099 if (itemAfter == NULL)
00100 {
00101 add (data);
00102 return;
00103 }
00104
00105 item = new ListItem <T>;
00106
00107 item->data = data;
00108 item->next = itemAfter;
00109 item->prev = itemBefore;
00110
00111 itemAfter->prev = item;
00112
00113 if (itemAfter == itemBefore)
00114 {
00115 start = item;
00116 item->prev = NULL;
00117 }
00118 else
00119 {
00120 itemBefore->next = item;
00121 }
00122
00123 _size++;
00124 }
00125
00126 void del (int i)
00127 {
00128 ListItem <T> *item = start;
00129
00130 while (item && i--)
00131 {
00132 item = item->next;
00133 }
00134
00135 if (item == NULL)
00136 return;
00137
00138 if (item->prev)
00139 item->prev->next = item->next;
00140 else
00141 start = item->next;
00142
00143 if (item->next)
00144 item->next->prev = item->prev;
00145 else
00146 end = item->prev;
00147
00148 delete item;
00149
00150 last = NULL;
00151
00152 _size--;
00153 }
00154
00155 void clear ()
00156 {
00157 if (!start)
00158 return;
00159
00160 ListItem <T> *item;
00161
00162 while (start)
00163 {
00164 item = start->next;
00165 delete start;
00166 start = item;
00167 }
00168
00169 start = end = NULL;
00170 last = NULL;
00171 _size = 0;
00172 }
00173
00174 int size () const
00175 {
00176 return _size;
00177 }
00178
00179 T& at (int i)
00180 {
00181 ListItem <T> *item = NULL;
00182
00183 if (last)
00184 {
00185 if (lastIndex == i)
00186 item = last;
00187 else if (i == lastIndex - 1)
00188 {
00189 item = last->prev;
00190 }
00191 else if (i == lastIndex+1)
00192 {
00193 item = last->next;
00194 }
00195 }
00196
00197 lastIndex = i;
00198
00199 if (item == NULL)
00200 {
00201 item = start;
00202 while (i--)
00203 item = item->next;
00204 }
00205
00206 last = item;
00207
00208 return item->data;
00209 }
00210
00211 int find (T& item)
00212 {
00213 for (int i = 0; i < size (); i++)
00214 if (at (i) == item)
00215 break;
00216
00217 return i != size () ? i : -1;
00218 }
00219
00220 T& operator [] (int i)
00221 {
00222 return at (i);
00223 }
00224
00225 list& operator = (list& l)
00226 {
00227 clear ();
00228 for (int i = 0; i < l.size (); i++)
00229 add (l [i]);
00230
00231 return *this;
00232 }
00233
00234 list (list& l)
00235 {
00236 start = end = NULL;
00237 last = NULL;
00238 _size = 0;
00239
00240 *this = l;
00241 }
00242
00243 list ()
00244 {
00245 start = end = NULL;
00246 last = NULL;
00247 _size = 0;
00248 }
00249
00250 ~list ()
00251 {
00252 clear ();
00253 };
00254
00255 private:
00256 ListItem <T> *start, *end;
00257 ListItem <T> *last; int lastIndex;
00258 int _size;
00259 };
00260
00261 };
00262
00263 #endif