00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef IMP_REF_COUNTED_H
00010 #define IMP_REF_COUNTED_H
00011
00012 #include "kernel_config.h"
00013 #include "exception.h"
00014 #include <boost/static_assert.hpp>
00015 #include <boost/type_traits.hpp>
00016
00017 #include <vector>
00018
00019 #ifndef IMP_DOXYGEN
00020 #ifndef SWIG
00021
00022 namespace IMP {
00023 namespace internal {
00024 template <class R>
00025 void unref(R*);
00026 template <class R>
00027 void ref(R*);
00028 template <class R>
00029 void release(R*);
00030 }
00031 }
00032
00033 #endif
00034 #endif
00035
00036 IMP_BEGIN_NAMESPACE
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 class IMPEXPORT RefCounted
00073 {
00074 #ifndef IMP_DOXYGEN
00075 typedef RefCounted This;
00076 static unsigned int live_objects_;
00077 RefCounted(const RefCounted &){}
00078 RefCounted& operator=(const RefCounted &){return *this;}
00079
00080 #ifndef _MSC_VER
00081 template <class R>
00082 friend void internal::unref(R*);
00083 template <class R>
00084 friend void internal::ref(R*);
00085 template <class R>
00086 friend void internal::release(R*);
00087 #else
00088 public:
00089 #endif // _MSC_VER
00090 mutable int count_;
00091 protected:
00092 RefCounted() {
00093 ++live_objects_;
00094 count_=0;
00095 }
00096 ~RefCounted();
00097
00098 public:
00099 unsigned int get_ref_count() const {
00100 return count_;
00101 }
00102
00103 static unsigned int get_number_of_live_objects() {
00104
00105 return live_objects_;
00106 }
00107 #ifndef SWIG
00108 struct Policy {
00109 template <class O>
00110 static void ref(O*o) {
00111 IMP::internal::ref(o);
00112 }
00113 template <class O>
00114 static void unref(O*o) {
00115 IMP::internal::unref(o);
00116 }
00117 };
00118 struct NoPolicy {
00119 template <class O>
00120 static void ref(O o) {
00121 }
00122 template <class O>
00123 static void unref(O o) {
00124 }
00125 };
00126 #endif
00127 #endif // IMP_DOXYGEN
00128
00129 };
00130
00131 IMP_END_NAMESPACE
00132
00133 #include "internal/ref_counting.h"
00134
00135 #endif