fbxmap.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_MAP_H_
00014 #define _FBXSDK_CORE_BASE_MAP_H_
00015 
00016 #include <fbxsdk/fbxsdk_def.h>
00017 
00018 #include <fbxsdk/core/base/fbxstring.h>
00019 #include <fbxsdk/core/base/fbxredblacktree.h>
00020 
00021 #include <fbxsdk/fbxsdk_nsbegin.h>
00022 
00023 class FbxObject;
00024 
00058 template <typename Type> struct FbxLessCompare
00059 {
00060     inline int operator()(const Type& pLeft, const Type& pRight) const
00061     {
00062         return (pLeft < pRight) ? -1 : ((pRight < pLeft) ? 1 : 0);
00063     }
00064 };
00065 
00068 template <typename Key, typename Type, typename Compare=FbxLessCompare<Key>, typename Allocator=FbxBaseAllocator> class FbxMap
00069 {
00070 protected:
00072     class KeyValuePair : private FbxPair<const Key, Type>
00073     {
00074     /*****************************************************************************************************************************
00075     ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
00076     *****************************************************************************************************************************/
00077     #ifndef DOXYGEN_SHOULD_SKIP_THIS
00078     public:
00079         typedef const Key   KeyType;
00080         typedef const Key   ConstKeyType;
00081         typedef Type        ValueType;
00082         typedef const Type  ConstValueType;
00083 
00084         KeyValuePair(const Key& pFirst, const Type& pSecond) : FbxPair<const Key, Type>(pFirst, pSecond){}
00085         ConstKeyType& GetKey() const { return this->mFirst; }
00086         KeyType& GetKey(){ return this->mFirst; }
00087         ConstValueType& GetValue() const { return this->mSecond; }
00088         ValueType& GetValue(){ return this->mSecond; }
00089     #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
00090     };
00091 
00093     typedef FbxRedBlackTree<KeyValuePair, Compare, Allocator> StorageType;
00094 
00095 public:
00096     typedef Type                                    ValueType;
00097     typedef Key                                     KeyType;
00098     typedef typename StorageType::RecordType        RecordType;
00099     typedef typename StorageType::IteratorType      Iterator;
00100     typedef typename StorageType::ConstIteratorType ConstIterator;
00101 
00104     inline void Reserve(unsigned int pRecordCount)
00105     {
00106         mTree.Reserve(pRecordCount);
00107     }
00108 
00110     inline int GetSize() const
00111     {
00112         return mTree.GetSize();
00113     }
00114 
00119     inline FbxPair<RecordType*, bool> Insert(const KeyType& pKey, const ValueType& pValue)
00120     {
00121         return mTree.Insert(KeyValuePair(pKey, pValue));
00122     }
00123 
00127     inline int Remove(const KeyType& pKey)
00128     {
00129         return mTree.Remove(pKey);
00130     }
00131 
00133     inline void Clear()
00134     {
00135         mTree.Clear();
00136     }
00137 
00139     inline bool Empty() const
00140     {
00141         return mTree.Empty();
00142     }
00143 
00145     Iterator Begin()
00146     {
00147         return Iterator(Minimum());
00148     }
00149 
00151     Iterator End()
00152     {
00153         return Iterator();
00154     }
00155 
00157     ConstIterator Begin() const
00158     {
00159         return ConstIterator(Minimum());
00160     }
00161 
00163     ConstIterator End() const
00164     {
00165         return ConstIterator();
00166     }
00167 
00171     inline const RecordType* Find(const KeyType& pKey) const
00172     {
00173         return mTree.Find(pKey);
00174     }
00175 
00179     inline RecordType* Find(const KeyType& pKey)
00180     {
00181         return mTree.Find(pKey);
00182     }
00183 
00187     inline const RecordType* UpperBound(const KeyType& pKey) const
00188     {
00189         return mTree.UpperBound(pKey);
00190     }
00191 
00195     inline RecordType* UpperBound(const KeyType& pKey)
00196     {
00197         return mTree.UpperBound(pKey);
00198     }
00199 
00204     inline ValueType& operator[](const KeyType& pKey)
00205     {
00206         RecordType* lRecord = Find(pKey);
00207 
00208         if( !lRecord )
00209         {
00210             lRecord = Insert(pKey, ValueType()).mFirst;
00211         }
00212 
00213         return lRecord->GetValue();
00214     }
00215 
00217     inline const RecordType* Minimum() const
00218     {
00219         return mTree.Minimum();
00220     }
00221 
00223     inline RecordType* Minimum()
00224     {
00225         return mTree.Minimum();
00226     }
00227 
00229     inline const RecordType* Maximum() const
00230     {
00231         return mTree.Maximum();
00232     }
00233 
00235     inline RecordType* Maximum()
00236     {
00237         return mTree.Maximum();
00238     }
00239 
00240 /*****************************************************************************************************************************
00241 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
00242 *****************************************************************************************************************************/
00243 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00244     inline FbxMap(){}
00245     inline FbxMap(const FbxMap& pMap) : mTree(pMap.mTree){}
00246     inline ~FbxMap(){ Clear(); }
00247 
00248 private:
00249     StorageType mTree;
00250 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
00251 };
00252 
00255 template <class Key, class Type, class Compare> class FBXSDK_DLL FbxSimpleMap
00256 {
00257 public:
00258     typedef typename FbxMap<Key, Type, Compare>::RecordType* Iterator;
00259 
00263     inline void Add(const Key& pKey, const Type& pValue)
00264     {
00265         mMap.Insert(pKey, pValue);
00266     }
00267 
00271     inline Iterator Find(const Key& pKey) const
00272     {
00273         return (Iterator)mMap.Find(pKey);
00274     }
00275 
00279     inline Iterator Find(const Type& pValue) const
00280     {
00281         Iterator lIterator = GetFirst();
00282         while( lIterator )
00283         {
00284             if( lIterator->GetValue() == pValue )
00285             {
00286                 return lIterator;
00287             }
00288             lIterator = GetNext(lIterator);
00289         }
00290         return 0;
00291     }
00292 
00295     inline void Remove(Iterator pIterator)
00296     {
00297         if( pIterator ) mMap.Remove(pIterator->GetKey());
00298     }
00299 
00302     inline Iterator GetFirst() const
00303     {
00304         return (Iterator)mMap.Minimum();
00305     }
00306 
00310     inline Iterator GetNext(Iterator pIterator) const
00311     {
00312         return (Iterator)pIterator ? pIterator->Successor() : 0;
00313     }
00314 
00316     inline void Clear() 
00317     {
00318         mMap.Clear();
00319     }
00320 
00323     inline void Reserve(int pSize)
00324     {
00325         mMap.Reserve(pSize);
00326     }
00327 
00330     inline int GetCount() const
00331     {
00332         return mMap.GetSize();
00333     }
00334 
00335 /*****************************************************************************************************************************
00336 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
00337 *****************************************************************************************************************************/
00338 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00339     inline FbxSimpleMap(){}
00340 
00341 private:
00342     FbxMap<Key, Type, Compare> mMap;
00343 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
00344 };
00345 
00348 template <class Type, class Compare> class FBXSDK_DLL FbxObjectMap : public FbxSimpleMap<Type, FbxObject*, Compare>
00349 {
00350 public:
00352     inline FbxObjectMap(){}
00353 
00358     inline FbxObject* Get(typename FbxSimpleMap<Type, FbxObject*, Compare>::Iterator pIterator)
00359     {
00360         return pIterator ? pIterator->GetValue() : 0;
00361     }
00362 };
00363 
00366 class FBXSDK_DLL FbxObjectStringMap : public FbxObjectMap<class FbxString, class FbxStringCompare>
00367 {
00368 public:
00370     inline FbxObjectStringMap(){}
00371 };
00372 
00373 #include <fbxsdk/fbxsdk_nsend.h>
00374 
00375 #endif /* _FBXSDK_CORE_BASE_MAP_H_ */