00001
00010 #ifndef _CONTAIN_H_
00011 #define _CONTAIN_H_
00012
00013 #include "LgiInc.h"
00014 #include "LgiOsDefs.h"
00015 #include "GStream.h"
00016
00017 class DLinkList;
00018 class DLinkInterator;
00019
00021 typedef int (*ListSortFunc)(void*, void*, int);
00022
00023 class LgiClass DLinkList
00024 {
00025 friend class DLinkIterator;
00026 friend class Item;
00027 friend class ItemIter;
00028
00029 protected:
00030 int Items;
00031 class Item *FirstObj, *LastObj;
00032 class ItemIter *Cur;
00033
00034 ItemIter GetIndex(int Index);
00035 ItemIter GetPtr(void *Ptr, int &Base);
00036
00037 public:
00038 DLinkList();
00039 virtual ~DLinkList();
00040
00041 bool IsValid();
00042
00043 int Length() { return Items; }
00044 virtual void Empty();
00045 void *operator [](int Index);
00046 DLinkList &operator =(DLinkList &lst);
00047
00048 bool Delete();
00049 bool Delete(int Index);
00050 bool Delete(void *p);
00051 bool Insert(void *p, int Index = -1);
00052 void *Current();
00053 void *First();
00054 void *Last();
00055 void *Next();
00056 void *Prev();
00057 int IndexOf(void *p);
00058 bool HasItem(void *p);
00059 void *ItemAt(int i);
00060 void Sort(ListSortFunc Compare, int Data);
00061 };
00062
00064 class LgiClass DLinkIterator
00065 {
00066 protected:
00067 DLinkList *List;
00068 class ItemIter *Cur;
00069
00070 public:
00071 DLinkIterator(DLinkList *list);
00072 DLinkIterator(const DLinkIterator &it);
00073 ~DLinkIterator();
00074
00075 void *operator [](int Index);
00076 DLinkIterator operator =(const DLinkIterator &it);
00077 void *Current();
00078 void *First();
00079 void *Last();
00080 void *Next();
00081 void *Prev();
00082 bool HasItem(void *p);
00083 int IndexOf(void *p);
00084 int Length();
00085 };
00086
00088 template <class Type>
00089 class List : public DLinkList
00090 {
00091 public:
00093 virtual bool Delete() { return DLinkList::Delete(); }
00095 virtual bool Delete(int i) { return DLinkList::Delete(i); }
00097 virtual bool Delete(Type *p) { return DLinkList::Delete((void*)p); }
00099 virtual bool Insert
00100 (
00102 Type *p,
00104 int Index = -1
00105 )
00106 { return DLinkList::Insert((void*)p, Index); }
00108 bool Add(Type *p) { return Insert(p); }
00109
00111 Type *First() { return (Type*) DLinkList::First(); }
00113 Type *Last() { return (Type*) DLinkList::Last(); }
00115 Type *Next() { return (Type*) DLinkList::Next(); }
00117 Type *Prev() { return (Type*) DLinkList::Prev(); }
00119 Type *Current() { return (Type*) DLinkList::Current(); }
00121 Type *operator [](int Index) { return ((Type*) ((*((DLinkList*)this))[Index])); }
00122
00124 int IndexOf(Type *p) { return DLinkList::IndexOf((void*)p); }
00126 bool HasItem(Type *p) { return DLinkList::HasItem((void*)p); }
00128 Type *ItemAt(int i) { return (Type*) DLinkList::ItemAt(i); }
00130 void Sort
00131 (
00133 int (*Compare)(Type *a, Type *b, int data),
00135 int Data
00136 )
00137 { DLinkList::Sort( (int (*)(void *a, void *b, int data)) Compare, Data); }
00138
00140 void DeleteObjects()
00141 {
00142 for (Type *o=(Type*)DLinkList::First(); o; o=(Type*)DLinkList::Next())
00143 {
00144 DeleteObj(o);
00145 }
00146 DLinkList::Empty();
00147 }
00149 void DeleteArrays()
00150 {
00151 for (Type *o=(Type*)DLinkList::First(); o; o=(Type*)DLinkList::Next())
00152 {
00153 delete [] (void*)o;
00154 }
00155 DLinkList::Empty();
00156 }
00157
00159 List &operator =
00160 (
00162 List<Type> &lst
00163 )
00164 {
00165 DLinkList *l = this;
00166 *l = (DLinkList&)lst;
00167 return *this;
00168 }
00169
00170
00171 template <class T>
00172 class Iter : public DLinkIterator
00173 {
00174 int8 each_dir;
00175
00176 public:
00177 Iter(DLinkList *l, int At) : DLinkIterator(l)
00178 {
00179 if (At < 0) Last();
00180 else if (At) (*this)[At];
00181 else First();
00182 each_dir = 0;
00183 }
00184
00185 Iter(const Iter<T> &it) : DLinkIterator(it)
00186 {
00187 each_dir = it.each_dir;
00188 }
00189
00190 operator bool() { return In(); }
00191 bool In() { return Current() != 0; }
00192 bool End() { return Current() == 0; }
00193 Iter<T> &operator ++() { Next(); return *this; }
00194 Iter<T> &operator --() { Prev(); return *this; }
00195 Iter<T> &operator ++(int) { Next(); return *this; }
00196 Iter<T> &operator --(int) { Prev(); return *this; }
00197 T *operator *() { return (T*)Current(); }
00198
00199 bool Each()
00200 {
00201 if (each_dir > 0) return Next() != 0;
00202 else if (each_dir < 0) return Prev() != 0;
00203 else each_dir = IndexOf(Current()) == 0 ? 1 : -1;
00204 return Current() != 0;
00205 }
00206 };
00207
00208 typedef Iter<Type> I;
00209 I Start(int At = 0) { return I(this, At); }
00210 I End() { return I(this, -1); }
00211 };
00212
00213 #if 0
00215 template <class Type>
00216 class Iterator : public DLinkIterator
00217 {
00218 public:
00220 Iterator
00221 (
00223 DLinkList *l
00224 ) : DLinkIterator(l) {}
00226 Iterator
00227 (
00229 const Iterator<Type> &it
00230 ) : DLinkIterator(it) {}
00231
00233 ~Iterator() {}
00234
00236 Type *operator [](int Index) { return (Type*) (* (DLinkIterator*)this)[Index]; }
00238 Type *First() { return (Type*) DLinkIterator::First(); }
00240 Type *Last() { return (Type*) DLinkIterator::Last(); }
00242 Type *Next() { return (Type*) DLinkIterator::Next(); }
00244 Type *Prev() { return (Type*) DLinkIterator::Prev(); }
00246 Type *Current() { return (Type*) DLinkIterator::Current(); }
00248 bool HasItem(Type *p) { return DLinkIterator::HasItem((Type*)p); }
00250 int IndexOf(Type *p) { return DLinkIterator::IndexOf((Type*)p); }
00251 };
00252 #endif
00253
00262 class LgiClass GBytePipe : public GStream
00263 {
00264 protected:
00279 struct Block
00280 {
00283 int Next;
00286 int Used;
00289 int Size;
00290 uint8 *Ptr() { return (uint8*) (this + 1); }
00291
00292 Block()
00293 {
00294 Next = 0;
00295 Size = 0;
00296 Used = 0;
00297 }
00298 };
00299
00300 int PreAlloc;
00301 List<Block> Mem;
00302
00303 public:
00305 GBytePipe
00306 (
00309 int PreAlloc = 0
00310 );
00312 virtual ~GBytePipe();
00313
00314 GBytePipe &operator =(GBytePipe &p);
00315
00317 virtual bool IsEmpty() { return Mem.Length() == 0; }
00319 virtual void Empty();
00322 virtual void *New
00323 (
00327 int AddBytes = 0
00328 );
00331 virtual int64 Peek
00332 (
00334 uchar *Ptr,
00336 int Size
00337 );
00340 virtual int64 Peek
00341 (
00343 GStreamI *Str,
00345 int Size
00346 );
00349 int StringAt(char *Str);
00350
00352 int64 GetSize();
00354 int Read(void *Buffer, int Size, int Flags = 0);
00356 int Write(const void *Buffer, int Size, int Flags = 0);
00357
00359 int Pop(short &i);
00361 int Pop(int &i);
00363 int Pop(double &i);
00364
00366 int Push(short i) { return Write((uchar*)&i, sizeof(i)); }
00368 int Push(int i) { return Write((uchar*)&i, sizeof(i)); }
00370 int Push(double i) { return Write((uchar*)&i, sizeof(i)); }
00371 };
00372
00374 class LgiClass GStringPipe : public GBytePipe
00375 {
00376 public:
00378 GStringPipe
00379 (
00381 int PreAlloc = -1
00382 ) : GBytePipe(PreAlloc) {}
00383
00384 ~GStringPipe() {}
00385
00387 virtual int Pop
00388 (
00390 char *Str,
00392 int BufSize
00393 );
00395 virtual int Push
00396 (
00398 const char *Str,
00400 int Chars = -1
00401 );
00403 virtual int Push
00404 (
00406 const char16 *Str,
00408 int Chars = -1
00409 );
00410
00412 char *NewStr();
00414 char16 *NewStrW();
00415 };
00416
00417 #endif