SharingPtr.h revision bdcb6abaa287df2c5f312c51d993c1d0b0cb120c
1b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner//===---------------------SharingPtr.h --------------------------*- C++ -*-===// 2b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// 3b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// The LLVM Compiler Infrastructure 4b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// 5b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// This file is distributed under the University of Illinois Open Source 6b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// License. See LICENSE.TXT for details. 7b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// 8b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner//===----------------------------------------------------------------------===// 9b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 1078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng#ifndef utility_SharingPtr_h_ 11966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng#define utility_SharingPtr_h_ 12966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 132c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky#include <algorithm> 14aa4b7dd13ba83152473950d7014a29686dc7eef6Daniel Dunbar#include <memory> 15b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 16b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattnernamespace lldb_private { 17ba8297ec08cdf7ae0c1e0c18ce07922e1f822643Jim Grosbach 1836d76a8dbc87b62de82a4a8c0d7cb4bb2a202934Daniel Dunbarnamespace imp { 192c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 202c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackyclass shared_count 213e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng{ 22b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner shared_count(const shared_count&); 23b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner shared_count& operator=(const shared_count&); 242c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 252c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackyprotected: 262c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky long shared_owners_; 272c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky virtual ~shared_count(); 282c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackyprivate: 292c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky virtual void on_zero_shared() = 0; 302c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 312c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackypublic: 322c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky explicit shared_count(long refs = 0) 332c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky : shared_owners_(refs) {} 342c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 352c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky void add_shared(); 362c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky void release_shared(); 372c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky long use_count() const {return shared_owners_ + 1;} 382c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky}; 392c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 402c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackytemplate <class T> 412c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackyclass shared_ptr_pointer 422c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky : public shared_count 432c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky{ 442c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky T data_; 452c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackypublic: 462c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky shared_ptr_pointer(T p) 47b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner : data_(p) {} 48ae5abd595f5442767313a4c8a24008ad19323cebDaniel Dunbar 495d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbarprivate: 505d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar virtual void on_zero_shared(); 515d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar 525d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar // Outlaw copy constructor and assignment operator to keep effictive C++ 53ba8297ec08cdf7ae0c1e0c18ce07922e1f822643Jim Grosbach // warnings down to a minumum 54ba8297ec08cdf7ae0c1e0c18ce07922e1f822643Jim Grosbach shared_ptr_pointer (const shared_ptr_pointer &); 55ba8297ec08cdf7ae0c1e0c18ce07922e1f822643Jim Grosbach shared_ptr_pointer & operator=(const shared_ptr_pointer &); 56ba8297ec08cdf7ae0c1e0c18ce07922e1f822643Jim Grosbach}; 57ba8297ec08cdf7ae0c1e0c18ce07922e1f822643Jim Grosbach 58ae5abd595f5442767313a4c8a24008ad19323cebDaniel Dunbartemplate <class T> 59ae5abd595f5442767313a4c8a24008ad19323cebDaniel Dunbarvoid 6078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Chengshared_ptr_pointer<T>::on_zero_shared() 61297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar{ 62297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar delete data_; 6378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng} 642761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar 65297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbartemplate <class T> 66297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbarclass shared_ptr_emplace 67297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar : public shared_count 68297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar{ 69297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar T data_; 70297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbarpublic: 71297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 72297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar shared_ptr_emplace() 73297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar : data_() {} 74297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 75297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar template <class A0> 76bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach shared_ptr_emplace(A0& a0) 77297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar : data_(a0) {} 7878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng 79bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach template <class A0, class A1> 80297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar shared_ptr_emplace(A0& a0, A1& a1) 81297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar : data_(a0, a1) {} 82297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 83297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar template <class A0, class A1, class A2> 84bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach shared_ptr_emplace(A0& a0, A1& a1, A2& a2) 85ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach : data_(a0, a1, a2) {} 86297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 87297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar template <class A0, class A1, class A2, class A3> 88297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar shared_ptr_emplace(A0& a0, A1& a1, A2& a2, A3& a3) 89370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach : data_(a0, a1, a2, a3) {} 90370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach 91370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach template <class A0, class A1, class A2, class A3, class A4> 92370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach shared_ptr_emplace(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4) 93370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach : data_(a0, a1, a2, a3, a4) {} 94370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach 95ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbachprivate: 966482e9114954def43fc08e83aadec1aadfc64200NAKAMURA Takumi virtual void on_zero_shared(); 97370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbachpublic: 98370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach T* get() {return &data_;} 99bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach}; 100ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach 101297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbartemplate <class T> 102ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbachvoid 103297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbarshared_ptr_emplace<T>::on_zero_shared() 104bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach{ 105ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach} 106297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 107297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar} // namespace 108297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 109297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbartemplate<class T> 110297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbarclass SharingPtr 111bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach{ 112bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbachpublic: 113297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar typedef T element_type; 114297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbarprivate: 115297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar element_type* ptr_; 116297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar imp::shared_count* cntrl_; 117297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 118297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar struct nat {int for_bool_;}; 119297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbarpublic: 120b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner SharingPtr(); 121b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner template<class Y> explicit SharingPtr(Y* p); 122b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner template<class Y> SharingPtr(const SharingPtr<Y>& r, element_type *p); 123b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner SharingPtr(const SharingPtr& r); 124b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner template<class Y> 125b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner SharingPtr(const SharingPtr<Y>& r); 126b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 1277b62afac0a6f967e7466e60ceb26bfdcff2e59f4Daniel Dunbar ~SharingPtr(); 128bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 129ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach SharingPtr& operator=(const SharingPtr& r); 130b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner template<class Y> SharingPtr& operator=(const SharingPtr<Y>& r); 131b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 132b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner void swap(SharingPtr& r); 133bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach void reset(); 134b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner template<class Y> void reset(Y* p); 135b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 1365d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar element_type* get() const {return ptr_;} 1375d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar element_type& operator*() const {return *ptr_;} 1385d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar element_type* operator->() const {return ptr_;} 1395d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar long use_count() const {return cntrl_ ? cntrl_->use_count() : 0;} 1405d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar bool unique() const {return use_count() == 1;} 1415d05d9769ec98cdee359fd934a56c9455e21232bDaniel Dunbar bool empty() const {return cntrl_ == 0;} 142b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner operator nat*() const {return (nat*)get();} 143bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 144b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner static SharingPtr<T> make_shared(); 145b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 146b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner template<class A0> 147b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner static SharingPtr<T> make_shared(A0&); 1482c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 1492c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky template<class A0, class A1> 150dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola static SharingPtr<T> make_shared(A0&, A1&); 1512c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 152dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola template<class A0, class A1, class A2> 153dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola static SharingPtr<T> make_shared(A0&, A1&, A2&); 154bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 155ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach template<class A0, class A1, class A2, class A3> 1562c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky static SharingPtr<T> make_shared(A0&, A1&, A2&, A3&); 1572c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 1582c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky template<class A0, class A1, class A2, class A3, class A4> 1592c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky static SharingPtr<T> make_shared(A0&, A1&, A2&, A3&, A4&); 1602c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 1612c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackyprivate: 1622c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 1632c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky template <class U> friend class SharingPtr; 1642c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky}; 1652c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 1662c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackytemplate<class T> 1672c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackyinline 168bc3af9b618c061294c7df00f3313f9c5234b8450Jim GrosbachSharingPtr<T>::SharingPtr() 1692c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky : ptr_(0), 1702c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky cntrl_(0) 171f51e95a9f2ce10ca0eb8a353e1fc1d9d49ec130cRafael Espindola{ 1722c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky} 173bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 1742c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackytemplate<class T> 1752c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divackytemplate<class Y> 1762c0d69fad0e658117922f3d96d9b732bedf9fd47Roman DivackySharingPtr<T>::SharingPtr(Y* p) 1772c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky : ptr_(p), cntrl_(0) 1782c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky{ 179b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner std::auto_ptr<Y> hold(p); 180b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner typedef imp::shared_ptr_pointer<Y*> _CntrlBlk; 181b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner cntrl_ = new _CntrlBlk(p); 182b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner hold.release(); 183b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner} 18478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng 185912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbartemplate<class T> 186b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattnertemplate<class Y> 187912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbarinline 188dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael EspindolaSharingPtr<T>::SharingPtr(const SharingPtr<Y>& r, element_type *p) 189dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola : ptr_(p), 190b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner cntrl_(r.cntrl_) 191{ 192 if (cntrl_) 193 cntrl_->add_shared(); 194} 195 196template<class T> 197inline 198SharingPtr<T>::SharingPtr(const SharingPtr& r) 199 : ptr_(r.ptr_), 200 cntrl_(r.cntrl_) 201{ 202 if (cntrl_) 203 cntrl_->add_shared(); 204} 205 206template<class T> 207template<class Y> 208inline 209SharingPtr<T>::SharingPtr(const SharingPtr<Y>& r) 210 : ptr_(r.ptr_), 211 cntrl_(r.cntrl_) 212{ 213 if (cntrl_) 214 cntrl_->add_shared(); 215} 216 217template<class T> 218SharingPtr<T>::~SharingPtr() 219{ 220 if (cntrl_) 221 cntrl_->release_shared(); 222} 223 224template<class T> 225inline 226SharingPtr<T>& 227SharingPtr<T>::operator=(const SharingPtr& r) 228{ 229 SharingPtr(r).swap(*this); 230 return *this; 231} 232 233template<class T> 234template<class Y> 235inline 236SharingPtr<T>& 237SharingPtr<T>::operator=(const SharingPtr<Y>& r) 238{ 239 SharingPtr(r).swap(*this); 240 return *this; 241} 242 243template<class T> 244inline 245void 246SharingPtr<T>::swap(SharingPtr& r) 247{ 248 std::swap(ptr_, r.ptr_); 249 std::swap(cntrl_, r.cntrl_); 250} 251 252template<class T> 253inline 254void 255SharingPtr<T>::reset() 256{ 257 SharingPtr().swap(*this); 258} 259 260template<class T> 261template<class Y> 262inline 263void 264SharingPtr<T>::reset(Y* p) 265{ 266 SharingPtr(p).swap(*this); 267} 268 269template<class T> 270SharingPtr<T> 271SharingPtr<T>::make_shared() 272{ 273 typedef imp::shared_ptr_emplace<T> CntrlBlk; 274 SharingPtr<T> r; 275 r.cntrl_ = new CntrlBlk(); 276 r.ptr_ = static_cast<CntrlBlk*>(r.cntrl_)->get(); 277 return r; 278} 279 280template<class T> 281template<class A0> 282SharingPtr<T> 283SharingPtr<T>::make_shared(A0& a0) 284{ 285 typedef imp::shared_ptr_emplace<T> CntrlBlk; 286 SharingPtr<T> r; 287 r.cntrl_ = new CntrlBlk(a0); 288 r.ptr_ = static_cast<CntrlBlk*>(r.cntrl_)->get(); 289 return r; 290} 291 292template<class T> 293template<class A0, class A1> 294SharingPtr<T> 295SharingPtr<T>::make_shared(A0& a0, A1& a1) 296{ 297 typedef imp::shared_ptr_emplace<T> CntrlBlk; 298 SharingPtr<T> r; 299 r.cntrl_ = new CntrlBlk(a0, a1); 300 r.ptr_ = static_cast<CntrlBlk*>(r.cntrl_)->get(); 301 return r; 302} 303 304template<class T> 305template<class A0, class A1, class A2> 306SharingPtr<T> 307SharingPtr<T>::make_shared(A0& a0, A1& a1, A2& a2) 308{ 309 typedef imp::shared_ptr_emplace<T> CntrlBlk; 310 SharingPtr<T> r; 311 r.cntrl_ = new CntrlBlk(a0, a1, a2); 312 r.ptr_ = static_cast<CntrlBlk*>(r.cntrl_)->get(); 313 return r; 314} 315 316template<class T> 317template<class A0, class A1, class A2, class A3> 318SharingPtr<T> 319SharingPtr<T>::make_shared(A0& a0, A1& a1, A2& a2, A3& a3) 320{ 321 typedef imp::shared_ptr_emplace<T> CntrlBlk; 322 SharingPtr<T> r; 323 r.cntrl_ = new CntrlBlk(a0, a1, a2, a3); 324 r.ptr_ = static_cast<CntrlBlk*>(r.cntrl_)->get(); 325 return r; 326} 327 328template<class T> 329template<class A0, class A1, class A2, class A3, class A4> 330SharingPtr<T> 331SharingPtr<T>::make_shared(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4) 332{ 333 typedef imp::shared_ptr_emplace<T> CntrlBlk; 334 SharingPtr<T> r; 335 r.cntrl_ = new CntrlBlk(a0, a1, a2, a3, a4); 336 r.ptr_ = static_cast<CntrlBlk*>(r.cntrl_)->get(); 337 return r; 338} 339 340template<class T> 341inline 342SharingPtr<T> 343make_shared() 344{ 345 return SharingPtr<T>::make_shared(); 346} 347 348template<class T, class A0> 349inline 350SharingPtr<T> 351make_shared(A0& a0) 352{ 353 return SharingPtr<T>::make_shared(a0); 354} 355 356template<class T, class A0, class A1> 357inline 358SharingPtr<T> 359make_shared(A0& a0, A1& a1) 360{ 361 return SharingPtr<T>::make_shared(a0, a1); 362} 363 364template<class T, class A0, class A1, class A2> 365inline 366SharingPtr<T> 367make_shared(A0& a0, A1& a1, A2& a2) 368{ 369 return SharingPtr<T>::make_shared(a0, a1, a2); 370} 371 372template<class T, class A0, class A1, class A2, class A3> 373inline 374SharingPtr<T> 375make_shared(A0& a0, A1& a1, A2& a2, A3& a3) 376{ 377 return SharingPtr<T>::make_shared(a0, a1, a2, a3); 378} 379 380template<class T, class A0, class A1, class A2, class A3, class A4> 381inline 382SharingPtr<T> 383make_shared(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4) 384{ 385 return SharingPtr<T>::make_shared(a0, a1, a2, a3, a4); 386} 387 388 389template<class T, class U> 390inline 391bool 392operator==(const SharingPtr<T>& __x, const SharingPtr<U>& __y) 393{ 394 return __x.get() == __y.get(); 395} 396 397template<class T, class U> 398inline 399bool 400operator!=(const SharingPtr<T>& __x, const SharingPtr<U>& __y) 401{ 402 return !(__x == __y); 403} 404 405template<class T, class U> 406inline 407bool 408operator<(const SharingPtr<T>& __x, const SharingPtr<U>& __y) 409{ 410 return __x.get() < __y.get(); 411} 412 413template<class T> 414inline 415void 416swap(SharingPtr<T>& __x, SharingPtr<T>& __y) 417{ 418 __x.swap(__y); 419} 420 421template<class T, class U> 422inline 423SharingPtr<T> 424static_pointer_cast(const SharingPtr<U>& r) 425{ 426 return SharingPtr<T>(r, static_cast<T*>(r.get())); 427} 428 429template<class T, class U> 430SharingPtr<T> 431const_pointer_cast(const SharingPtr<U>& r) 432{ 433 return SharingPtr<T>(r, const_cast<T*>(r.get())); 434} 435 436} // namespace lldb 437 438#endif // utility_SharingPtr_h_ 439