Go to the
documentation of this file.
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013 #ifndef _FBXSDK_CORE_BASE_STRING_LIST_H_
00014 #define _FBXSDK_CORE_BASE_STRING_LIST_H_
00015
00016 #include <fbxsdk/fbxsdk_def.h>
00017
00018 #include <fbxsdk/core/base/fbxarray.h>
00019 #include <fbxsdk/core/base/fbxstring.h>
00020
00021 #include <fbxsdk/fbxsdk_nsbegin.h>
00022
00024 class FbxStringListItem
00025 {
00026 public:
00027 FbxStringListItem(){ mReference = 0; }
00028 FbxStringListItem(const char* pString, FbxHandle pRef=0){ mString = pString; mReference = pRef; }
00029
00030 FbxString mString;
00031 FbxHandle mReference;
00032 };
00033
00034 inline int FbxCompareStringListSort(const void* E1, const void* E2)
00035 {
00036 return FBXSDK_stricmp((*(FbxStringListItem**)E1)->mString.Buffer(), (*(FbxStringListItem**)E2)->mString.Buffer());
00037 }
00038
00039 inline int FbxCompareStringListFindEqual(const void* E1, const void* E2)
00040 {
00041 return FBXSDK_stricmp((*(FbxStringListItem*)E1).mString.Buffer(), (*(FbxStringListItem**)E2)->mString.Buffer());
00042 }
00043
00044 inline int FbxCompareCaseSensitiveStringList(const void *E1,const void *E2)
00045 {
00046 return strcmp((*(FbxStringListItem*)E1).mString.Buffer(), (*(FbxStringListItem**)E2)->mString.Buffer());
00047 }
00048
00050 template <class Type> class FbxStringListT
00051 {
00052 protected:
00053 FbxArray<Type*> mList;
00054
00055 public:
00060
00064 int AddItem( Type* pItem ) { return mList.Add( pItem ); }
00065
00072 int InsertItemAt( int pIndex, Type* pItem ) { return mList.InsertAt( pIndex, pItem ); }
00073
00075 Type* GetItemAt( int pIndex ) const { return mList[pIndex]; }
00076
00080 int FindItem( Type* pItem ) const { return mList.Find( pItem ); }
00081
00082
00083 public :
00088
00090 FbxStringListT()
00091 {
00092 }
00093
00095 virtual ~FbxStringListT() { Clear(); }
00096
00097
00099 void RemoveLast() { RemoveAt( mList.GetCount()-1 ); }
00100
00104 inline int GetCount() const { return mList.GetCount(); }
00105
00107 FbxString& operator[](int pIndex) { return mList[pIndex]->mString; }
00108
00110 FbxHandle GetReferenceAt(int pIndex) const { return mList[pIndex]->mReference; }
00111
00113 void SetReferenceAt(int pIndex, FbxHandle pRef) { mList[pIndex]->mReference = pRef; }
00114
00116 char* GetStringAt(int pIndex) const { if (pIndex<mList.GetCount()) return mList[pIndex]->mString.Buffer(); else return NULL; }
00117
00119 virtual bool SetStringAt(int pIndex, const char* pString)
00120 {
00121 if (pIndex<mList.GetCount())
00122 {
00123 mList[pIndex]->mString = pString;
00124 return true;
00125 } else return false;
00126 }
00127
00132 int Find( Type& pItem ) const
00133 {
00134 for (int Count=0; Count<mList.GetCount(); Count++) {
00135 if (mList[Count]==&pItem) {
00136 return Count;
00137 }
00138 }
00139 return -1;
00140 }
00141
00146 int FindIndex( FbxHandle pReference ) const
00147 {
00148 for (int Count=0; Count<mList.GetCount(); Count++) {
00149 if (mList[Count]->mReference==pReference) {
00150 return Count;
00151 }
00152 }
00153 return -1;
00154 }
00155
00160 int FindIndex( const char* pString ) const
00161 {
00162 for (int lCount=0; lCount<mList.GetCount(); lCount++) {
00163 if (mList[lCount]->mString==pString) {
00164 return lCount;
00165 }
00166 }
00167 return -1;
00168 }
00169
00175 FbxHandle FindReference(const char* pString ) const
00176 {
00177 int lIndex = FindIndex( pString );
00178 if (lIndex!=-1) {
00179 return mList[lIndex]->mReference;
00180 }
00181 return 0;
00182 }
00183
00185 bool Remove ( Type& pItem )
00186 {
00187 int lIndex = Find( pItem );
00188 if (lIndex>=0) {
00189 RemoveAt( lIndex );
00190 return true;
00191 }
00192 return false;
00193 }
00194
00196 bool Remove (const char* pString )
00197 {
00198 int lIndex = FindIndex( pString );
00199 if (lIndex>=0) {
00200 RemoveAt( lIndex );
00201 return true;
00202 }
00203 return false;
00204 }
00205
00207 bool RemoveIt ( Type& pItem )
00208 {
00209 int lIndex = Find( pItem );
00210 if (lIndex>=0) {
00211 RemoveAt( lIndex );
00212 return true;
00213 }
00214 return false;
00215 }
00216
00218 void Sort( )
00219 {
00220 qsort( &(mList.GetArray()[0]),mList.GetCount(),sizeof(FbxStringListItem*),FbxCompareStringListSort );
00221 }
00222
00227 void* FindEqual(const char* pString) const
00228 {
00229 FbxStringListItem Key(pString);
00230
00231 if (mList.GetCount() != 0)
00232 {
00233 return bsearch ( &Key, &(mList.GetArray()[0]),mList.GetCount(),sizeof(FbxStringListItem*),FbxCompareStringListFindEqual );
00234 }
00235 else
00236 {
00237 return NULL ;
00238 }
00239 }
00240
00245 void* FindCaseSensitive(const char* pString) const
00246 {
00247 FbxStringListItem Key(pString);
00248
00249 if (mList.GetCount() != 0)
00250 {
00251 return bsearch ( &Key, &(mList.GetArray()[0]),mList.GetCount(),sizeof(FbxStringListItem*), FbxCompareCaseSensitiveStringList);
00252 }
00253 else
00254 {
00255 return NULL ;
00256 }
00257
00258 }
00259
00260
00262 int Add( const char* pString, FbxHandle pItem=0 )
00263 {
00264 return InsertAt( mList.GetCount(),pString,pItem );
00265 }
00266
00267 virtual int InsertAt( int pIndex, const char* pString, FbxHandle pItem=0 )
00268 {
00269 return mList.InsertAt( pIndex,FbxNew< Type >( pString,(FbxHandle)pItem ));
00270 }
00271
00278 virtual void RemoveAt(int pIndex)
00279 {
00280 FbxDelete(mList.RemoveAt(pIndex));
00281 }
00282
00284 virtual void Clear()
00285 {
00286 FbxArrayDelete(mList);
00287 }
00288
00292 virtual void GetText(FbxString& pText) const
00293 {
00294 int lCount;
00295 for (lCount=0; lCount<mList.GetCount(); lCount++)
00296 {
00297 pText += mList[lCount]->mString;
00298 if (lCount<mList.GetCount()-1)
00299 {
00300 pText += "~";
00301 }
00302 }
00303 }
00304
00311 virtual int SetText(const char* pList)
00312 {
00313 int lPos=0, lOldPos = 0;
00314 int lLastIndex=0;
00315 FbxString lName=pList;
00316
00317 Clear();
00318 for (lPos=0; lName.Buffer()[lPos]!=0; lPos++) {
00319 if (lName.Buffer()[lPos]=='~') {
00320 lName.Buffer()[lPos]=0;
00321 lLastIndex = Add(lName.Buffer()+lOldPos);
00322 lOldPos=lPos+1;
00323 }
00324 }
00325
00326 if(lOldPos != lPos)
00327 {
00328 lLastIndex = Add(lName.Buffer()+lOldPos);
00329 }
00330 return lLastIndex;
00331 }
00332
00333
00334 };
00335
00338 class FBXSDK_DLL FbxStringList : public FbxStringListT<FbxStringListItem>
00339 {
00340 public:
00345
00346 FbxStringList();
00347
00349 FbxStringList( const FbxStringList& pOriginal );
00351
00356
00357 void CopyFrom( const FbxStringList* pOriginal );
00358
00360 FbxStringList& operator=(const FbxStringList& pOriginal);
00362 };
00363
00364 #include <fbxsdk/fbxsdk_nsend.h>
00365
00366 #endif