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