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