13 #ifndef _FBXSDK_CORE_BASE_INTRUSIVE_LIST_H_    14 #define _FBXSDK_CORE_BASE_INTRUSIVE_LIST_H_    23 #ifndef DOXYGEN_SHOULD_SKIP_THIS    25 #define FBXSDK_INTRUSIVE_LIST_NODE(Class, NodeCount)\    26     public: inline FbxListNode<Class>& GetListNode(int index = 0){ return this->mNode[index]; }\    27     private: FbxListNode<Class> mNode[NodeCount];    29 template <
typename T> 
class FbxListNode
    31     typedef FbxListNode<T> NodeT; 
    34     explicit FbxListNode(T* pData = 0):mNext(0),mPrev(0),mData(pData){}
    35     ~FbxListNode(){ Disconnect(); }
    57 template <
typename T, 
int NodeIndex=0> 
class FbxIntrusiveList
    60     typedef T         allocator_type;
    63     typedef const T&  const_reference;
    65     typedef const T*  const_pointer;
    67     typedef FbxListNode<T> NodeT;
    70     FbxIntrusiveList():mHead(0)
    72         mHead.mNext = mHead.mPrev = &mHead;
    77             Begin().Get()->Disconnect();  
    83         return ((mHead.mNext==&mHead)&&(mHead.mPrev==&mHead));
    87     void PushBack(T& pElement)
    89         NodeT* pNode = &pElement.GetListNode(NodeIndex);
    90         pNode->mData = &pElement;
    94             pNode->mNext = &mHead;
    95             pNode->mPrev = &mHead;
   101             pNode->mNext = &mHead;
   102             pNode->mPrev = mHead.mPrev;
   104             pNode->mPrev->mNext = pNode;
   109     void PushFront(T& pElement)
   111         NodeT* pNode = &pElement.GetListNode(NodeIndex);
   112         pNode->mData = &pElement;
   116             pNode->mNext = &mHead;
   117             pNode->mPrev = &mHead;
   123             pNode->mNext = mHead.mNext;
   124             pNode->mPrev = &mHead;
   126             pNode->mNext->mPrev = pNode;
   133         iterator begin = Begin();
   143     class IntrusiveListIterator
   146         explicit IntrusiveListIterator(NodeT* ptr=0):mPtr(ptr){}
   149         IntrusiveListIterator& operator++()
   151             mPtr = mPtr->mNext;
return (*
this);
   154         const IntrusiveListIterator operator++(
int)
   156             IntrusiveListIterator temp = *
this;
   161         IntrusiveListIterator& operator--()
   163             mPtr = mPtr->mPrev;
return *
this;
   166         const IntrusiveListIterator operator--(
int)
   168             IntrusiveListIterator temp = *
this;
   172         IntrusiveListIterator& operator=(
const IntrusiveListIterator &other){mPtr = other.mPtr; 
return *
this;}
   174         reference operator*()
 const { 
return *(mPtr->mData); }
   175         pointer operator->()
 const { 
return (&**
this); }
   176         bool operator==(
const IntrusiveListIterator& other)
const{ 
return mPtr==other.mPtr; } 
   177         bool operator!=(
const IntrusiveListIterator& other)
const{ 
return !(*
this == other); } 
   179         inline NodeT* Get()
const { 
return mPtr; }
   185     class  IntrusiveListConstIterator
   188         explicit IntrusiveListConstIterator(
const NodeT* ptr=0):mPtr(ptr){}
   191         IntrusiveListConstIterator& operator++()
   193             mPtr = mPtr->mNext;
return (*
this);
   196         const IntrusiveListConstIterator operator++(
int)
   198             IntrusiveListConstIterator temp = *
this;
   203         IntrusiveListConstIterator& operator--()
   205             mPtr = mPtr->mPrev;
return *
this;
   208         const IntrusiveListConstIterator operator--(
int)
   210             IntrusiveListConstIterator temp = *
this;
   214         IntrusiveListConstIterator& operator=(
const IntrusiveListConstIterator &other){mPtr = other.mPtr; 
return *
this;}
   216         const_reference operator*()
 const { 
return *(mPtr->mData); }
   217         const_pointer operator->()
 const { 
return (&**
this); }
   218         bool operator==(
const IntrusiveListConstIterator& other)
const{ 
return mPtr==other.mPtr; } 
   219         bool operator!=(
const IntrusiveListConstIterator& other)
const{ 
return !(*
this == other); } 
   221         inline const NodeT* Get()
const { 
return mPtr; }
   224         mutable const NodeT* mPtr;
   228     typedef IntrusiveListIterator iterator;
   229     typedef IntrusiveListConstIterator const_iterator;
   232     inline iterator Begin() { 
return iterator(mHead.mNext); }
   233     inline const_iterator Begin()
 const { 
return const_iterator(mHead.mNext); }
   234     inline iterator End() { 
return iterator(&mHead); }
   235     inline const_iterator End()
 const { 
return const_iterator(&mHead); }
   240     reference Front(){
return (*Begin());}
   241     const_reference Front()
 const { 
return (*Begin()); }
   242     reference Back(){ 
return (*(--End())); }
   243     const_reference Back()
 const{ 
return (*(--End())); }
   245     iterator& Erase(iterator& it)
   247         it.Get()->Disconnect();
   254     FbxIntrusiveList(
const FbxIntrusiveList&);
   255     FbxIntrusiveList& operator=(
const FbxIntrusiveList& Right){
return (*
this);}
 FBX SDK environment definition.