25 #include "proton/config.hpp"
26 #include "proton/export.hpp"
27 #include "proton/comparable.hpp"
34 PN_CPP_EXTERN
static void incref(
void* p);
35 PN_CPP_EXTERN
static void decref(
void* p);
38 template <
class T>
class pn_ptr :
private pn_ptr_base,
public comparable<pn_ptr<T> > {
41 pn_ptr(T* p) : ptr_(p) { incref(ptr_); }
42 pn_ptr(
const pn_ptr& o) : ptr_(o.ptr_) { incref(ptr_); }
45 pn_ptr(pn_ptr&& o) : ptr_(0) { std::swap(ptr_, o.ptr_); }
48 ~pn_ptr() { decref(ptr_); }
50 pn_ptr& operator=(pn_ptr o) { std::swap(ptr_, o.ptr_);
return *
this; }
52 T*
get()
const {
return ptr_; }
53 T* release() { T *p = ptr_; ptr_ = 0;
return p; }
54 bool operator!()
const {
return !ptr_; }
56 static pn_ptr take_ownership(T* p) {
return pn_ptr<T>(p,
true); }
63 pn_ptr(T* p,
bool) : ptr_(p) {}
65 friend bool operator==(
const pn_ptr& a,
const pn_ptr& b) {
return a.ptr_ == b.ptr_; }
66 friend bool operator<(
const pn_ptr& a,
const pn_ptr& b) {
return a.ptr_ < b.ptr_; }
69 template <
class T> pn_ptr<T> take_ownership(T* p) {
return pn_ptr<T>::take_ownership(p); }
72 template <
class T>
class object :
public comparable<object<T> > {
74 bool operator!()
const {
return !object_; }
77 object(pn_ptr<T> o) : object_(o) {}
78 T* pn_object()
const {
return object_.get(); }
83 friend bool operator==(
const object& a,
const object& b) {
return a.object_ == b.object_; }
84 friend bool operator<(
const object& a,
const object& b) {
return a.object_ < b.object_; }