44 #ifndef _INCLUDED_Field3D_REF_COUNT_H_
45 #define _INCLUDED_Field3D_REF_COUNT_H_
47 #define FIELD3D_USE_ATOMIC_COUNT
50 #include <boost/intrusive_ptr.hpp>
52 #ifdef FIELD3D_USE_ATOMIC_COUNT
53 #include <boost/detail/atomic_count.hpp>
55 #include <boost/thread/mutex.hpp>
68 #define DEFINE_CHECK_RTTI_CALL \
69 virtual bool checkRTTI(const char *typenameStr) \
70 { return matchRTTI(typenameStr); } \
72 #define DEFINE_MATCH_RTTI_CALL \
73 bool matchRTTI(const char *typenameStr) \
75 if (strcmp(typenameStr,classType()) == 0) { \
78 return base::matchRTTI(typenameStr); \
81 #define DEFINE_FIELD_RTTI_CONCRETE_CLASS \
82 DEFINE_CHECK_RTTI_CALL \
83 DEFINE_MATCH_RTTI_CALL \
85 #define DEFINE_FIELD_RTTI_ABSTRACT_CLASS \
86 DEFINE_MATCH_RTTI_CALL \
96 typedef boost::intrusive_ptr<RefBase>
Ptr;
131 #ifndef FIELD3D_USE_ATOMIC_COUNT
132 boost::mutex::scoped_lock lock(m_refMutex);
140 #ifndef FIELD3D_USE_ATOMIC_COUNT
141 boost::mutex::scoped_lock lock(m_refMutex);
163 virtual bool checkRTTI(
const char *typenameStr) = 0;
169 if (strcmp(
classType(), typenameStr) == 0)
184 #ifdef FIELD3D_USE_ATOMIC_COUNT
189 mutable boost::mutex m_refMutex;
222 template <
class Field_T>
223 typename Field_T::Ptr
229 const char *tgtTypeString = Field_T::classType();
231 if (field->checkRTTI(tgtTypeString)) {
232 return static_cast<Field_T*
>(field.get());
239 #define FIELD_DYNAMIC_CAST field_dynamic_cast
247 #endif // Include guard
#define FIELD3D_NAMESPACE_HEADER_CLOSE
Field_T::Ptr field_dynamic_cast(RefBase::Ptr field)
Dynamic cast that uses string-comparison in order to be safe even after an object crosses a shared li...
boost::detail::atomic_count m_counter
For boost intrusive pointer.
void intrusive_ptr_release(RefBase *r)
static const char * classType()
RefBase & operator=(const RefBase &)
Assignment operator.
bool matchRTTI(const char *typenameStr)
Performs a check to see if the given typename string matches this class' This needs to be implemented...
RefBase(const RefBase &)
Copy constructor.
boost::intrusive_ptr< RefBase > Ptr
void intrusive_ptr_add_ref(RefBase *r)
void unref() const
Used by boost::intrusive_pointer.
virtual ~RefBase()
Destructor.
size_t refcnt()
Used by boost::intrusive_pointer.
virtual bool checkRTTI(const char *typenameStr)=0
This function is only implemented by concrete classes and triggers the actual RTTI check through matc...
void ref() const
Used by boost::intrusive_pointer.