lltreenode.h

Go to the documentation of this file.
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

Generated on Fri May 16 08:32:16 2008 for SecondLife by  doxygen 1.5.5