00001 00031 #ifndef LL_LLTREENODE_H 00032 #define LL_LLTREENODE_H 00033 00034 #include "stdtypes.h" 00035 #include "xform.h" 00036 #include <vector> 00037 00038 template <class T> class LLTreeNode; 00039 template <class T> class LLTreeTraveler; 00040 template <class T> class LLTreeListener; 00041 00042 template <class T> 00043 class LLTreeListener: public LLRefCount 00044 { 00045 public: 00046 virtual void handleInsertion(const LLTreeNode<T>* node, T* data) = 0; 00047 virtual void handleRemoval(const LLTreeNode<T>* node, T* data) = 0; 00048 virtual void handleDestruction(const LLTreeNode<T>* node) = 0; 00049 virtual void handleStateChange(const LLTreeNode<T>* node) = 0; 00050 }; 00051 00052 template <class T> 00053 class LLTreeNode 00054 { 00055 public: 00056 virtual ~LLTreeNode(); 00057 00058 virtual bool insert(T* data); 00059 virtual bool remove(T* data); 00060 virtual void notifyRemoval(T* data); 00061 virtual U32 getListenerCount() { return mListeners.size(); } 00062 virtual LLTreeListener<T>* getListener(U32 index) const { return mListeners[index]; } 00063 virtual void addListener(LLTreeListener<T>* listener) { mListeners.push_back(listener); } 00064 00065 protected: 00066 void destroyListeners() 00067 { 00068 for (U32 i = 0; i < mListeners.size(); i++) 00069 { 00070 mListeners[i]->handleDestruction(this); 00071 } 00072 mListeners.clear(); 00073 } 00074 00075 public: 00076 std::vector<LLPointer<LLTreeListener<T> > > mListeners; 00077 }; 00078 00079 template <class T> 00080 class LLTreeTraveler 00081 { 00082 public: 00083 virtual ~LLTreeTraveler() { }; 00084 virtual void traverse(const LLTreeNode<T>* node) = 0; 00085 virtual void visit(const LLTreeNode<T>* node) = 0; 00086 }; 00087 00088 template <class T> 00089 LLTreeNode<T>::~LLTreeNode() 00090 { 00091 destroyListeners(); 00092 }; 00093 00094 template <class T> 00095 bool LLTreeNode<T>::insert(T* data) 00096 { 00097 for (U32 i = 0; i < mListeners.size(); i++) 00098 { 00099 mListeners[i]->handleInsertion(this, data); 00100 } 00101 return true; 00102 }; 00103 00104 template <class T> 00105 bool LLTreeNode<T>::remove(T* data) 00106 { 00107 return true; 00108 }; 00109 00110 template <class T> 00111 void LLTreeNode<T>::notifyRemoval(T* data) 00112 { 00113 for (U32 i = 0; i < mListeners.size(); i++) 00114 { 00115 mListeners[i]->handleRemoval(this, data); 00116 } 00117 } 00118 00119 #endif