1 #ifndef PROTON_INTERNAL_OBJECT_HPP
2 #define PROTON_INTERNAL_OBJECT_HPP
25 #include "./config.hpp"
26 #include "./export.hpp"
27 #include "./comparable.hpp"
33 template <
class T>
class thread_safe;
39 PN_CPP_EXTERN
static void incref(
void* p);
40 PN_CPP_EXTERN
static void decref(
void* p);
43 template <
class T>
class pn_ptr :
private pn_ptr_base,
private comparable<pn_ptr<T> > {
46 pn_ptr(T* p) : ptr_(p) { incref(ptr_); }
47 pn_ptr(
const pn_ptr& o) : ptr_(o.ptr_) { incref(ptr_); }
49 #if PN_CPP_HAS_RVALUE_REFERENCES
50 pn_ptr(pn_ptr&& o) : ptr_(0) { std::swap(ptr_, o.ptr_); }
53 ~pn_ptr() { decref(ptr_); }
55 pn_ptr& operator=(pn_ptr o) { std::swap(ptr_, o.ptr_);
return *
this; }
57 T*
get()
const {
return ptr_; }
58 T* release() { T *p = ptr_; ptr_ = 0;
return p; }
60 bool operator!()
const {
return !ptr_; }
62 #if PN_CPP_HAS_EXPLICIT_CONVERSIONS
63 explicit operator bool()
const {
return !!ptr_; }
66 static pn_ptr take_ownership(T* p) {
return pn_ptr<T>(p,
true); }
73 pn_ptr(T* p,
bool) : ptr_(p) {}
75 friend bool operator==(
const pn_ptr& a,
const pn_ptr& b) {
return a.ptr_ == b.ptr_; }
76 friend bool operator<(
const pn_ptr& a,
const pn_ptr& b) {
return a.ptr_ < b.ptr_; }
79 template <
class T> pn_ptr<T> take_ownership(T* p) {
return pn_ptr<T>::take_ownership(p); }
82 template <
class T>
class object :
private comparable<object<T> > {
84 bool operator!()
const {
return !object_; }
85 #if PN_CPP_HAS_EXPLICIT_CONVERSIONS
86 explicit operator bool()
const {
return object_; }
91 object(pn_ptr<T> o) : object_(o) {}
92 T* pn_object()
const {
return object_.get(); }
97 friend bool operator==(
const object& a,
const object& b) {
return a.object_ == b.object_; }
98 friend bool operator<(
const object& a,
const object& b) {
return a.object_ < b.object_; }
103 template <
class T>
class factory;
108 #endif // PROTON_INTERNAL_OBJECT_HPP
Experimental - A thread-safe object wrapper.
Definition: connection.hpp:45