00001 #ifndef PROTON_INTERNAL_OBJECT_HPP
00002 #define PROTON_INTERNAL_OBJECT_HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "./config.hpp"
00026 #include "./export.hpp"
00027 #include "./comparable.hpp"
00028
00029 #include <memory>
00030 #include <string>
00031
00032 namespace proton {
00033
00034 template <class T> class thread_safe;
00035
00036 namespace internal {
00037
00038 class pn_ptr_base {
00039 protected:
00040 PN_CPP_EXTERN static void incref(void* p);
00041 PN_CPP_EXTERN static void decref(void* p);
00042 PN_CPP_EXTERN static std::string inspect(void* p);
00043 };
00044
00045 template <class T> class pn_ptr : private pn_ptr_base, private comparable<pn_ptr<T> > {
00046 public:
00047 pn_ptr() : ptr_(0) {}
00048 pn_ptr(T* p) : ptr_(p) { incref(ptr_); }
00049 pn_ptr(const pn_ptr& o) : ptr_(o.ptr_) { incref(ptr_); }
00050
00051 #if PN_CPP_HAS_RVALUE_REFERENCES
00052 pn_ptr(pn_ptr&& o) : ptr_(0) { std::swap(ptr_, o.ptr_); }
00053 #endif
00054
00055 ~pn_ptr() { decref(ptr_); }
00056
00057 pn_ptr& operator=(pn_ptr o) { std::swap(ptr_, o.ptr_); return *this; }
00058
00059 T* get() const { return ptr_; }
00060 T* release() { T *p = ptr_; ptr_ = 0; return p; }
00061
00062 bool operator!() const { return !ptr_; }
00063
00064 #if PN_CPP_HAS_EXPLICIT_CONVERSIONS
00065 explicit operator bool() const { return !!ptr_; }
00066 #endif
00067
00068 std::string inspect() const { return pn_ptr_base::inspect(ptr_); }
00069
00070 static pn_ptr take_ownership(T* p) { return pn_ptr<T>(p, true); }
00071
00072 private:
00073 T *ptr_;
00074
00075
00076
00077 pn_ptr(T* p, bool) : ptr_(p) {}
00078
00079 friend bool operator==(const pn_ptr& a, const pn_ptr& b) { return a.ptr_ == b.ptr_; }
00080 friend bool operator<(const pn_ptr& a, const pn_ptr& b) { return a.ptr_ < b.ptr_; }
00081 };
00082
00083 template <class T> pn_ptr<T> take_ownership(T* p) { return pn_ptr<T>::take_ownership(p); }
00084
00086 template <class T> class object : private comparable<object<T> > {
00087 public:
00088 bool operator!() const { return !object_; }
00089 #if PN_CPP_HAS_EXPLICIT_CONVERSIONS
00090 explicit operator bool() const { return object_; }
00091 #endif
00092
00093 protected:
00094 typedef T pn_type;
00095 object(pn_ptr<T> o) : object_(o) {}
00096 T* pn_object() const { return object_.get(); }
00097
00098 private:
00099 pn_ptr<T> object_;
00100
00101 friend bool operator==(const object& a, const object& b) { return a.object_ == b.object_; }
00102 friend bool operator<(const object& a, const object& b) { return a.object_ < b.object_; }
00103 friend std::ostream& operator<<(std::ostream& o, const object& a) { o << a.object_.inspect(); return o; }
00104 template <class U> friend class proton::thread_safe;
00105 };
00106
00108 template <class T> class factory;
00109
00110 }
00111 }
00112
00113 #endif // PROTON_INTERNAL_OBJECT_HPP