OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
observer_ptr.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  *
3  * This library is open source and may be redistributed and/or modified under
4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5  * (at your option) any later version. The full license is in LICENSE file
6  * included with this distribution, and on the openscenegraph.org website.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * OpenSceneGraph Public License for more details.
12 */
13 
14 #ifndef OSG_OBSERVER_PTR
15 #define OSG_OBSERVER_PTR
16 
17 #include <osg/Notify>
18 #include <osg/ref_ptr>
19 #include <osg/Observer>
20 
21 #include <OpenThreads/ScopedLock>
22 #include <OpenThreads/Mutex>
23 
24 namespace osg {
25 
37 template<class T>
39 {
40 public:
41  typedef T element_type;
43 
48  {
49  _reference = rp.valid() ? rp->getOrCreateObserverSet() : 0;
50  _ptr = (_reference.valid() && _reference->getObserverdObject()!=0) ? rp.get() : 0;
51  }
52 
57  observer_ptr(T* rp)
58  {
59  _reference = rp ? rp->getOrCreateObserverSet() : 0;
60  _ptr = (_reference.valid() && _reference->getObserverdObject()!=0) ? rp : 0;
61  }
62 
65  _ptr(wp._ptr)
66  {
67  }
68 
70  {
71  }
72 
74  {
75  if (&wp==this) return *this;
76 
78  _ptr = wp._ptr;
79  return *this;
80  }
81 
83  {
84  _reference = rp.valid() ? rp->getOrCreateObserverSet() : 0;
85  _ptr = (_reference.valid() && _reference->getObserverdObject()!=0) ? rp.get() : 0;
86  return *this;
87  }
88 
90  {
91  _reference = rp ? rp->getOrCreateObserverSet() : 0;
92  _ptr = (_reference.valid() && _reference->getObserverdObject()!=0) ? rp : 0;
93  return *this;
94  }
95 
100  bool lock(ref_ptr<T>& rptr) const
101  {
102  if (!_reference)
103  {
104  rptr = 0;
105  return false;
106  }
107 
108  Referenced* obj = _reference->addRefLock();
109  if (!obj)
110  {
111  rptr = 0;
112  return false;
113  }
114 
115  rptr = _ptr;
116  obj->unref_nodelete();
117  return rptr.valid();
118  }
119 
123  bool operator == (const observer_ptr& wp) const { return _reference == wp._reference; }
124  bool operator != (const observer_ptr& wp) const { return _reference != wp._reference; }
125  bool operator < (const observer_ptr& wp) const { return _reference < wp._reference; }
126  bool operator > (const observer_ptr& wp) const { return _reference > wp._reference; }
127 
128  // Non-strict interface, for compatibility
129  // comparison operator for const T*.
130  inline bool operator == (const T* ptr) const { return _ptr == ptr; }
131  inline bool operator != (const T* ptr) const { return _ptr != ptr; }
132  inline bool operator < (const T* ptr) const { return _ptr < ptr; }
133  inline bool operator > (const T* ptr) const { return _ptr > ptr; }
134 
135  // Convenience methods for operating on object, however, access is not automatically threadsafe.
136  // To make thread safe, one should either ensure at a high level
137  // that the object will not be deleted while operating on it, or
138  // by using the observer_ptr<>::lock() to get a ref_ptr<> that
139  // ensures the objects stay alive throughout all access to it.
140 
141  // Throw an error if _reference is null?
142  inline T& operator*() const { return *_ptr; }
143  inline T* operator->() const { return _ptr; }
144 
145  // get the raw C pointer
146  inline T* get() const { return (_reference.valid() && _reference->getObserverdObject()!=0) ? _ptr : 0; }
147 
148  inline bool operator!() const { return get() == 0; }
149  inline bool valid() const { return get() != 0; }
150 
151 protected:
152 
154  T* _ptr;
155 };
156 
157 }
158 
159 #endif
T & operator*() const
Definition: observer_ptr.h:142
bool valid() const
Definition: ref_ptr.h:95
bool operator>(const observer_ptr &wp) const
Definition: observer_ptr.h:126
bool operator==(const observer_ptr &wp) const
Definition: observer_ptr.h:123
bool operator!() const
Definition: observer_ptr.h:148
observer_ptr(const ref_ptr< T > &rp)
Definition: observer_ptr.h:47
observer_ptr & operator=(const observer_ptr &wp)
Definition: observer_ptr.h:73
T * get() const
Definition: ref_ptr.h:92
observer_ptr(const observer_ptr &wp)
Definition: observer_ptr.h:63
bool valid() const
Definition: observer_ptr.h:149
bool lock(ref_ptr< T > &rptr) const
Definition: observer_ptr.h:100
bool operator!=(const observer_ptr &wp) const
Definition: observer_ptr.h:124
int unref_nodelete() const
Definition: AlphaFunc.h:19
osg::ref_ptr< ObserverSet > _reference
Definition: observer_ptr.h:153
bool operator<(const observer_ptr &wp) const
Definition: observer_ptr.h:125
T * operator->() const
Definition: observer_ptr.h:143