00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __NOBJVEC_H__
00021 #define __NOBJVEC_H__
00022
00023 #include "csutil/csobjvec.h"
00024 #include "csutil/typedvec.h"
00025 #include "iutil/object.h"
00026
00027 class csObject;
00028 struct iObject;
00029
00030 SCF_DECLARE_FAST_INTERFACE (iObject);
00031
00038 class csNamedObjVector : public csObjVector
00039 {
00040 public:
00042 csNamedObjVector (int ilimit = 8, int ithreshold = 16) :
00043 csObjVector (ilimit, ithreshold) {}
00044
00046 csObject *FindByName (const char* iName) const;
00047
00049 virtual int Compare (csSome Item1, csSome Item2, int Mode) const;
00050
00052 virtual int CompareKey (csSome Item, csConstSome Key, int Mode) const;
00053
00055 csObject *Get (int idx) const
00056 { return (csObject *)csVector::Get (idx); }
00057 };
00058
00089 class csNamedObjectVector
00090 {
00091 private:
00092
00093 csVector *Vector;
00094
00095 public:
00097 inline csNamedObjectVector ();
00098
00100 int GetIndexByName (const char *name) const;
00102 iObject *FindByName (const char *name) const;
00103
00105 inline void SetLength (int n);
00107 inline int Length () const;
00109 inline int Limit () const;
00111 inline void Exchange (int n1, int n2);
00113 inline void QuickSort (int Left, int Right, int Mode = 0);
00115 inline void QuickSort (int Mode = 0);
00117 int Find (iObject *obj) const;
00119 inline int FindKey (csConstSome Key, int Mode = 0) const;
00121 inline int FindSortedKey (csConstSome Key, int Mode = 0) const;
00123 inline iObject *Pop ();
00125 inline iObject *Top () const;
00127 inline bool Delete (int n);
00129 bool Delete (iObject *obj);
00131 inline void DeleteAll ();
00133 inline iObject *Get (int n) const;
00135 inline iObject *operator[] (int n) const;
00136
00137
00138 static int Compare (csSome Item1, csSome Item2, int Mode);
00139
00140 static int CompareKey (csSome Item, csConstSome Key, int Mode);
00141
00142 inline void SetVector (void *vec);
00143 };
00144
00149 #define CS_DECLARE_OBJECT_VECTOR_NOREF(NAME,TYPE) \
00150 CS_PRIVATE_DECLARE_OBJECT_VECTOR_NOREF (NAME, TYPE)
00151
00157 #define CS_DECLARE_RESTRICTED_ACCESS_OBJECT_VECTOR(NAME,TYPE) \
00158 CS_PRIVATE_DECLARE_RESTRICTED_ACCESS_OBJECT_VECTOR (NAME, TYPE)
00159
00165 #define CS_DECLARE_OBJECT_VECTOR(NAME,TYPE) \
00166 CS_PRIVATE_DECLARE_OBJECT_VECTOR (NAME, TYPE)
00167
00168
00169
00170
00171
00172 #define CS_PRIVATE_DECLARE_OBJECT_VECTOR(NAME,TYPE) \
00173 CS_PRIVATE_DECLARE_OBJECT_VECTOR_COMMON ( \
00174 CS_DECLARE_TYPED_IBASE_VECTOR, NAME, TYPE)
00175
00176 #define CS_PRIVATE_DECLARE_OBJECT_VECTOR_NOREF(NAME,TYPE) \
00177 CS_PRIVATE_DECLARE_OBJECT_VECTOR_COMMON ( \
00178 CS_DECLARE_TYPED_VECTOR_NODELETE, NAME, TYPE)
00179
00180 #define CS_PRIVATE_DECLARE_RESTRICTED_ACCESS_OBJECT_VECTOR(NAME,TYPE) \
00181 CS_PRIVATE_DECLARE_OBJECT_VECTOR_COMMON ( \
00182 CS_DECLARE_TYPED_RESTRICTED_ACCESS_VECTOR, NAME, TYPE)
00183
00184 #define CS_PRIVATE_DECLARE_OBJECT_VECTOR_COMMON(MACRO,NAME,TYPE) \
00185 MACRO (NAME##_Helper, TYPE); \
00186 class NAME : public NAME##_Helper { \
00187 private: \
00188 csNamedObjectVector ObjVec; \
00189 public: \
00190 NAME (int ilimit = 16, int ithreshold = 16) : \
00191 NAME##_Helper (ilimit, ithreshold) \
00192 {ObjVec.SetVector (this);} \
00193 virtual ~NAME () \
00194 { DeleteAll (); } \
00195 inline csNamedObjectVector *GetObjectVector () \
00196 { return &ObjVec; } \
00197 inline const csNamedObjectVector *GetObjectVector () const \
00198 { return &ObjVec; } \
00199 int GetIndexByName (const char* iName) const \
00200 { return ObjVec.GetIndexByName (iName); } \
00201 TYPE *FindByName (const char* iName) const \
00202 { int n = GetIndexByName (iName); \
00203 return (n==-1) ? 0 : Get(n); } \
00204 iObject *FindObjectByName (const char* iName) const \
00205 { return ObjVec.FindByName (iName); } \
00206 virtual int Compare (csSome Item1, csSome Item2, int Mode) const \
00207 { return csNamedObjectVector::Compare (Item1, Item2, Mode); } \
00208 virtual int CompareKey (csSome Item, csConstSome Key, int Mode) const \
00209 { return csNamedObjectVector::CompareKey (Item, Key, Mode); } \
00210 }
00211
00212
00213 inline csNamedObjectVector::csNamedObjectVector ()
00214 { Vector = 0; }
00215 inline void csNamedObjectVector::SetVector (void *v)
00216 { Vector = (csVector*)v; }
00217 inline void csNamedObjectVector::SetLength (int n)
00218 { Vector->SetLength(n); }
00219 inline int csNamedObjectVector::Length () const
00220 { return Vector->Length (); }
00221 inline int csNamedObjectVector::Limit () const
00222 { return Vector->Limit (); }
00223 inline void csNamedObjectVector::Exchange (int n1, int n2)
00224 { Vector->Exchange (n1, n2); }
00225 inline void csNamedObjectVector::QuickSort (int Left, int Right, int Mode)
00226 { Vector->QuickSort (Left, Right, Mode); }
00227 inline void csNamedObjectVector::QuickSort (int Mode)
00228 { Vector->QuickSort (Mode); }
00229 inline int csNamedObjectVector::FindKey (csConstSome Key, int Mode) const
00230 { return Vector->FindKey (Key, Mode); }
00231 inline int csNamedObjectVector::FindSortedKey (csConstSome Key, int Mode) const
00232 { return Vector->FindSortedKey (Key, Mode); }
00233 inline iObject *csNamedObjectVector::Pop ()
00234 {
00235 iBase *objbase = (iBase*)Vector->Pop ();
00236 if (!objbase) return 0;
00237 iObject *obj = SCF_QUERY_INTERFACE_FAST (objbase, iObject);
00238 CS_ASSERT (obj);
00239 obj->DecRef ();
00240 return obj;
00241 }
00242 inline iObject *csNamedObjectVector::Top () const
00243 {
00244 iBase *objbase = (iBase*)Vector->Top ();
00245 if (!objbase) return 0;
00246 iObject *obj = SCF_QUERY_INTERFACE_FAST (objbase, iObject);
00247 CS_ASSERT (obj);
00248 obj->DecRef ();
00249 return obj;
00250 }
00251 inline bool csNamedObjectVector::Delete (int n)
00252 { return Vector->Delete (n); }
00253 inline void csNamedObjectVector::DeleteAll ()
00254 { Vector->DeleteAll (); }
00255 inline iObject *csNamedObjectVector::Get (int n) const
00256 {
00257 iBase *objbase = (iBase*)Vector->Get (n);
00258 iObject *o = objbase ? SCF_QUERY_INTERFACE_FAST (objbase, iObject) : 0;
00259 if (o) o->DecRef ();
00260 return o;
00261 }
00262 inline iObject *csNamedObjectVector::operator[] (int n) const
00263 {
00264 iBase *objbase = (iBase*)Vector->Get (n);
00265 iObject *o = objbase ? SCF_QUERY_INTERFACE_FAST (objbase, iObject) : 0;
00266 if (o) o->DecRef ();
00267 return o;
00268 }
00269
00270 #endif // __NOBJVEC_H__