10 #include <gobject.hpp>
15 template <
typename T>
class gptr {
17 gptr() noexcept : p_{} {}
18 gptr(T* p) : p_(p) {gaddPtr(p_,
true);}
19 gptr(T& p) : p_(&p) {gaddPtr(p_,
true);}
20 gptr(
gptr const& b) : p_(b.p_) {gaddPtr(p_,
true);}
21 gptr(
gptr const&& b) : p_(b.p_) {gaddPtr(p_,
true);}
22 template <
typename B>
gptr(
gptr<B> const& b) : p_(b.p_) {gaddPtr(p_,
true);}
23 template <
typename B>
gptr(
gptr<B> const&& b) : p_(b.p_) {gaddPtr(p_,
true);}
25 ~
gptr() {gremovePtr(p_);}
27 gptr& operator=(T* p) {
reset(p);
return *
this;}
28 gptr& operator=(T& p) {
reset(&p);
return *
this;}
31 template <
class B>
gptr& operator=(B* p) {
reset(p);
return *
this;}
32 template <
class B>
gptr& operator=(
gptr<B> const& b) {
reset(b.p_);
return *
this;}
33 template <
class B>
gptr& operator=(
gptr<B> const&& b) {
reset(b.p_);
return *
this;}
40 void swap(
gptr& b) noexcept {T* tmp = p_; p_ = b.p_; b.p_ = tmp;}
43 unsigned int useCount() const noexcept {
return p_ ? p_->refcount_ : 0;}
46 T*
get()
const noexcept {
return p_;}
49 operator T*()
const noexcept {
return p_;}
61 bool operator!() const noexcept {
return p_ ==
nullptr;}
70 auto&
operator<<(
const char* child)
const {
return *p_ << child;}
71 auto&
operator<<(GString
const& child)
const {
return *p_ << child;}
72 auto&
operator<<(GStrings
const& child)
const {
return *p_ << child;}
73 auto&
operator<<(Gadget& child)
const {
return *p_ << child;}
74 auto&
operator<<(Gadget* child)
const {
return *p_ << child;}
75 auto&
operator<<(GProp& child)
const {
return *p_ << child;}
76 auto&
operator<<(GProp* child)
const {
return *p_ << child;}
77 auto&
operator<<(
class GPropList
const& list)
const {
return *p_ << list;}
80 template <
typename C>
auto&
operator<<=(C& from) {
return *p_ <<= from;}
83 template <
typename C>
auto&
operator>>(C& to) {
return *p_ >> to;}
86 template <
class X>
friend class gptr;
91 inline bool operator==(gptr<T>
const & a, std::nullptr_t b) {
96 inline bool operator!=(gptr<T>
const & a, std::nullptr_t b) {
100 template<
class T,
class U>
101 inline bool operator==(gptr<T>
const & a, U
const * b) {
105 template<
class T,
class U>
106 inline bool operator!=(gptr<T>
const & a, U
const * b) {
110 template<
class T,
class U>
111 inline bool operator==(gptr<T>
const & a, U
const & b) {
112 return a.get() == &b;
115 template<
class T,
class U>
116 inline bool operator!=(gptr<T>
const & a, U
const & b) {
117 return a.get() != &b;
120 template<
class T,
class U>
121 inline bool operator==(gptr<T>
const & a, gptr<U>
const & b) {
122 return a.get() == b.get();
125 template<
class T,
class U>
126 inline bool operator!=(gptr<T>
const & a, gptr<U>
const & b) {
127 return a.get() != b.get();
132 template <
typename T>
class gnew :
public gptr<T> {
134 gnew() : gptr<T>(new T) {}
136 template <
typename A>
137 gnew(A arg) : gptr<T>(new T(arg)) {}
150 void init(T* p) {this->p_ = p; gaddPtr(p,
false);}
160 gprotect& operator=(T* p) {reset(p);
return *
this;}
161 gprotect& operator=(T& p) {reset(&p);
return *
this;}
164 template <
class B>
gprotect& operator=(B* p) {reset(p);
return *
this;}
168 void reset() {
gprotect().swap(*
this);}
169 void reset(T* b) {
gprotect(b).swap(*
this);}
170 void swap(
gprotect& b) noexcept {T* tmp = this->p_; this->p_ = b.p_; b.p_ = tmp;}