1 #ifndef PROTON_INTERNAL_OBJECT_HPP 2 #define PROTON_INTERNAL_OBJECT_HPP 25 #include "./config.hpp" 26 #include "./export.hpp" 27 #include "./comparable.hpp" 34 template <
class T>
class thread_safe;
40 PN_CPP_EXTERN
static void incref(
void* p);
41 PN_CPP_EXTERN
static void decref(
void* p);
42 PN_CPP_EXTERN
static std::string inspect(
void* p);
45 template <
class T>
class pn_ptr :
private pn_ptr_base,
private comparable<pn_ptr<T> > {
48 pn_ptr(T* p) : ptr_(p) { incref(ptr_); }
49 pn_ptr(
const pn_ptr& o) : ptr_(o.ptr_) { incref(ptr_); }
51 #if PN_CPP_HAS_RVALUE_REFERENCES 52 pn_ptr(pn_ptr&& o) : ptr_(0) { std::swap(ptr_, o.ptr_); }
55 ~pn_ptr() { decref(ptr_); }
57 pn_ptr& operator=(pn_ptr o) { std::swap(ptr_, o.ptr_);
return *
this; }
59 T*
get()
const {
return ptr_; }
60 T* release() { T *p = ptr_; ptr_ = 0;
return p; }
62 bool operator!()
const {
return !ptr_; }
64 #if PN_CPP_HAS_EXPLICIT_CONVERSIONS 65 explicit operator bool()
const {
return !!ptr_; }
68 std::string inspect()
const {
return pn_ptr_base::inspect(ptr_); }
70 static pn_ptr take_ownership(T* p) {
return pn_ptr<T>(p,
true); }
77 pn_ptr(T* p,
bool) : ptr_(p) {}
79 friend bool operator==(
const pn_ptr& a,
const pn_ptr& b) {
return a.ptr_ == b.ptr_; }
80 friend bool operator<(
const pn_ptr& a,
const pn_ptr& b) {
return a.ptr_ < b.ptr_; }
83 template <
class T> pn_ptr<T> take_ownership(T* p) {
return pn_ptr<T>::take_ownership(p); }
86 template <
class T>
class object :
private comparable<object<T> > {
88 bool operator!()
const {
return !object_; }
89 #if PN_CPP_HAS_EXPLICIT_CONVERSIONS 90 explicit operator bool()
const {
return object_; }
95 object(pn_ptr<T> o) : object_(o) {}
96 T* pn_object()
const {
return object_.get(); }
101 friend bool operator==(
const object& a,
const object& b) {
return a.object_ == b.object_; }
102 friend bool operator<(
const object& a,
const object& b) {
return a.object_ < b.object_; }
103 friend std::ostream&
operator<<(std::ostream& o,
const object& a) { o << a.object_.inspect();
return o; }
108 template <
class T>
class factory;
113 #endif // PROTON_INTERNAL_OBJECT_HPP std::ostream & operator<<(std::ostream &, const binary &)
Print a binary value.
The main Proton namespace.
Definition: annotation_key.hpp:30
Experimental - A thread-safe object wrapper.
Definition: fwd.hpp:65