fbxstringlist.h

Go to the documentation of this file.
00001 /****************************************************************************************
00002  
00003    Copyright (C) 2013 Autodesk, Inc.
00004    All rights reserved.
00005  
00006    Use of this software is subject to the terms of the Autodesk license agreement
00007    provided at the time of installation or download, or which otherwise accompanies
00008    this software in either electronic or hard copy form.
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; // NULL
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 /* _FBXSDK_CORE_BASE_STRING_LIST_H_ */