17#ifndef AGX_REFERENCED_H
18#define AGX_REFERENCED_H
22# pragma warning(disable: 4251)
37#if AGX_DEBUG_REFERENCED()
39# include <agx/StackWalker.h>
43#if AGX_DEBUG_TRACK_REFERENCED_OBJECTS()
48#define OBSERVER_CONTAINER_TYPE 1
52#if OBSERVER_CONTAINER_TYPE == 1
54#define ObserverContainer VectorPOD< Observer* >*
55#define INSERT_OBSERVER( obs ) \
56 if ( !m_observers->contains( obs ) ) m_observers->push_back( obs )
57#define REMOVE_OBSERVER( obs ) \
58 if ( m_observers ) m_observers->findAndErase( obs )
59#define REPORT_REFERENCED_DELETED \
60 if ( m_observers ) { \
61 for ( size_t i = 0, numObservers = m_observers->size(); i < numObservers; ++i ) \
62 (*m_observers)[ i ]->objectDeleted( this ); \
64 m_observers = nullptr; \
66#elif OBSERVER_CONTAINER_TYPE == 2
68#define ObserverContainer HashSet< Observer* >*
69#define INSERT_OBSERVER( obs ) \
70 if ( m_observers == nullptr ) m_observers = new HashSet< Observer* >; \
71 m_observers->insert( obs )
72#define REMOVE_OBSERVER( obs ) \
73 if ( m_observers ) m_observers->erase( obs )
74#define REPORT_REFERENCED_DELETED \
75 if ( m_observers ) { \
76 for ( HashSet< Observer* >::iterator i = m_observers->begin(), end = m_observers->end(); i != end; ++i ) \
77 (*i)->objectDeleted( this ); \
79 m_observers = nullptr; \
81#elif OBSERVER_CONTAINER_TYPE == 3
83#define ObserverContainer Vector< Observer* >
84#define INSERT_OBSERVER( obs ) \
85 if ( !m_observers.contains( obs ) ) m_observers.push_back( obs )
86#define REMOVE_OBSERVER( obs ) \
87 m_observers.findAndErase( obs )
88#define REPORT_REFERENCED_DELETED \
89 for ( size_t i = 0, numObservers = m_observers.size(); i < numObservers; ++i ) \
90 m_observers[ i ]->objectDeleted( this );
101#define AGX_EXPIRED_SCOPE_ALLOCATION (-0xABC)
172 void setReferenceCount(
int count) const;
177 void addObserver( Observer* observer ) const;
182 void removeObserver( Observer* observer ) const;
189 template <typename T>
195 template <typename T>
198 template <typename T>
205 template <typename T>
208 template <typename T>
209 const T *asSafe() const;
211 friend class DeleteHandler;
213#if AGX_DEBUG_REFERENCED()
214 static bool getEnableStackTrace();
215 static void setEnableStackTrace(
bool flag );
217 typedef std::map<void*, agx::StackTrace> StackMap;
218 const StackMap& getStackMap()
const;
222 template <
typename T>
249#if AGX_DEBUG_REFERENCED()
250 mutable StackMap m_stackMap;
254#define AGX_DECLARE_POINTER_TYPES(type) \
256 typedef agx::ref_ptr< type > type ## Ref; \
257 typedef agx::observer_ptr< type > type ## Observer; \
258 typedef agx::ref_ptr< const type > type ## ConstRef;\
259 typedef agx::observer_ptr< const type > type ## ConstObserver
274 virtual ~DeleteHandler();
276 void doDelete(
const Referenced*
object);
282 virtual void requestDelete(
const Referenced*
object);
285#if AGX_DEBUG_REFERENCED()
289 if ( getEnableStackTrace() )
290 m_stackMap.insert( std::make_pair(ptr, agx::generateStackTrace()) );
298#if AGX_DEBUG_REFERENCED()
309#if AGX_DEBUG_REFERENCED()
310 if ( getEnableStackTrace() )
311 m_stackMap.erase( ptr );
327 INSERT_OBSERVER( observer );
330 AGX_FORCE_INLINE void Referenced::removeObserver( Observer* observer )
const
334 REMOVE_OBSERVER( observer );
342 template <
typename T>
352 template <
typename T>
357 template <
typename T>
361 template <
typename T>
364 template <
typename T>
367 template <
typename T>
#define AGX_EXPIRED_SCOPE_ALLOCATION
T get() const
Get the current value.
T inc()
Increment the value.
T dec()
Decrement the value.
Base class providing referencing counted objects.
void unreference_nodelete() const
Decrement the reference count by one, indicating that a pointer to this object is referencing it.
void reference(void *ptr=nullptr) const
Explicitly increment the reference count by one, indicating that this object has another pointer whic...
static bool ValidateCast(const Referenced *object)
ObserverContainer m_observers
T * asSafe()
Safe subclass casting, return nullptr if template type does not match.
static void setDeleteHandler(DeleteHandler *handler)
Internal: Set a DeleteHandler to which deletion of all referenced counted objects will be delegated t...
Referenced & operator=(const Referenced &)
Assignment operator. Will increment the number of references to the referenced object.
bool is() const
Subclass test.
void unreference(void *ptr=nullptr) const
Decrement the reference count by one, indicating that a pointer to this object is referencing it.
int getReferenceCount() const
void allocateObserverVector() const
virtual ~Referenced()
Destructor.
T * as()
Subclass casting.
Referenced(const Referenced &)
void deleteUsingDeleteHandler() const
Referenced()
Default constructor.
static DeleteHandler * getDeleteHandler()
#define DOXYGEN_END_INTERNAL_BLOCK()
#define DOXYGEN_START_INTERNAL_BLOCK()
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
std::lock_guard< T > ScopeLock
agx::ScopeLock is an alias for std::lock_guard