00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __PEEKABOT_SCENE_TREE_PTR_HH
00019 #define __PEEKABOT_SCENE_TREE_PTR_HH
00020
00021
00022 #include "SceneTree.hh"
00023
00024
00025 namespace peekabot
00026 {
00027
00028
00029 class TheSceneTree;
00030
00031
00032 class SceneTreePtr
00033 {
00034 friend class TheSceneTree;
00035
00036 SceneTree *m_scene_tree;
00037
00038 SceneTree::SceneTreeMutex::scoped_lock *m_lock;
00039
00040 explicit SceneTreePtr(SceneTree *scene_tree)
00041 : m_scene_tree(scene_tree),
00042 m_lock(new SceneTree::SceneTreeMutex::scoped_lock(scene_tree->m_scene_mutex))
00043 {
00044 }
00045
00046 public:
00047
00048 SceneTreePtr() throw() : m_scene_tree(0), m_lock(0) {}
00049
00050 ~SceneTreePtr() throw()
00051 {
00052 if( m_lock )
00053 delete m_lock;
00054 }
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 SceneTreePtr &operator=(SceneTreePtr &ptr) throw()
00066 {
00067 m_scene_tree = ptr.m_scene_tree;
00068 m_lock = ptr.m_lock;
00069
00070 ptr.m_scene_tree = 0;
00071 ptr.m_lock = 0;
00072
00073 return *this;
00074 }
00075
00076
00077 SceneTree *operator->() throw()
00078 {
00079 return m_scene_tree;
00080 }
00081 };
00082
00083
00084
00085 class TheSceneTree
00086 {
00087 public:
00088 static SceneTreePtr acquire() throw()
00089 {
00090 static SceneTree scene_tree;
00091
00092 return SceneTreePtr(&scene_tree);
00093 }
00094 };
00095
00096
00097 }
00098
00099
00100 #endif // __PEEKABOT_SCENE_TREE_PTR_HH