Remove cds/details/std/tuple.h, use STL <tuple> instead
[libcds.git] / cds / details / std / memory.h
1 //$$CDS-header$$
2
3 //@cond
4 #ifndef __CDS_DETAILS_STD_MEMORY_H
5 #define __CDS_DETAILS_STD_MEMORY_H
6
7 #include <cds/details/defs.h>
8 #include <memory>
9
10 // -----------------------------------------------------------------
11 // std::unique_ptr
12
13 #if ((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500) \
14     || (CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40400 )
15 // MS VC 2008, GCC 4.3
16
17 namespace std {
18     template <class T> struct default_delete {
19         default_delete()
20         {}
21         void operator()(T* p) const
22         {
23             delete p;
24         }
25     };
26
27     template <typename T, typename Deleter = default_delete<T> >
28     class unique_ptr: private auto_ptr<T>
29     {
30         typedef auto_ptr<T> base_class;
31
32         // copy ctor is deleted
33         template <typename Q, typename D> unique_ptr( unique_ptr<Q, D> const& s );
34
35     public:
36         unique_ptr() throw()
37         {}
38
39         explicit unique_ptr( T * p ) throw()
40             : base_class( p )
41         {}
42
43         ~unique_ptr()
44         {
45             T * p = release();
46             if ( p )
47                 Deleter()( p );
48         }
49
50         T * operator ->() const throw()
51         {
52             return base_class::operator->();
53         }
54
55         T& operator *() throw()
56         {
57             return base_class::operator*();
58         }
59
60         unique_ptr& operator=( T * p )
61         {
62             base_class::operator=(p);
63             return *this;
64         }
65
66         T * get() const throw()
67         {
68             return base_class::get();
69         }
70
71         T * release() throw()
72         {
73             return base_class::release();
74         }
75
76         void reset( T * p )
77         {
78             T * pOld = release();
79             assert( p != pOld );
80             if ( pOld )
81                 Deleter()( pOld );
82             base_class::reset( p );
83         }
84     };
85 }
86
87 #endif
88 // -----------------------------------------------------------------
89 // std::shared_ptr
90
91 #if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
92 // MS VC 2008
93
94 #include <boost/shared_ptr.hpp>
95 #include <boost/make_shared.hpp>
96 #include <boost/enable_shared_from_this.hpp>
97
98 namespace std {
99     using boost::shared_ptr;
100     using boost::make_shared;
101     using boost::allocate_shared;
102     using boost::enable_shared_from_this;
103 }   // namespace std
104 #endif
105
106
107 #endif // #ifndef __CDS_DETAILS_STD_MEMORY_H
108 //@endcond