00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef IMP_WEAK_POINTER_H
00010 #define IMP_WEAK_POINTER_H
00011
00012 #include "log.h"
00013 #include "Object.h"
00014 #include "macros.h"
00015 #include "utility.h"
00016 #include "exception.h"
00017
00018 #include <boost/static_assert.hpp>
00019 #include <boost/type_traits.hpp>
00020
00021 IMP_BEGIN_NAMESPACE
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 template <class O>
00033 class WeakPointer
00034 {
00035 typedef WeakPointer<O> This;
00036
00037 void set_pointer(O* p) {
00038 if (p == o_) return;
00039 if (p) {
00040
00041 }
00042 o_=p;
00043 }
00044
00045 void audit() const {
00046 IMP_INTERNAL_CHECK(o_ != NULL, "Pointer is NULL");
00047
00048 }
00049 protected:
00050 IMP_NO_DOXYGEN(O* o_);
00051 public:
00052
00053 WeakPointer(): o_(NULL) {}
00054
00055 explicit WeakPointer(O* o): o_(NULL) {
00056 IMP_INTERNAL_CHECK(o, "Can't initialize with NULL pointer");
00057 set_pointer(o);
00058 }
00059
00060 const O& operator*() const {
00061 audit();
00062 return *o_;
00063 }
00064
00065 O& operator*() {
00066 audit();
00067 return *o_;
00068 }
00069
00070 const O* operator->() const {
00071 audit();
00072 return o_;
00073 }
00074
00075 O* operator->() {
00076 audit();
00077 return o_;
00078 }
00079
00080 O* get() const {
00081 audit();
00082 return o_;
00083 }
00084
00085 WeakPointer<O>& operator=(O* o) {
00086 set_pointer(o);
00087 return *this;
00088 }
00089
00090 IMP_COMPARISONS_1(o_);
00091
00092
00093 bool operator!() const {
00094 return !o_;
00095 }
00096
00097
00098 operator O*() const {
00099 return o_;
00100 }
00101 };
00102
00103 IMP_END_NAMESPACE
00104
00105 #endif