]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/smart_ptr/detail/shared_array_nmt.hpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
d811a0562a9da768b5695b52f30c334b029286e9
[canny.git] / stc / exp / ml_stc_linux_make_v1.0 / include / boost / smart_ptr / detail / shared_array_nmt.hpp
1 #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED\r
2 #define BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED\r
3 \r
4 //\r
5 //  detail/shared_array_nmt.hpp - shared_array.hpp without member templates\r
6 //\r
7 //  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.\r
8 //  Copyright (c) 2001, 2002 Peter Dimov\r
9 //\r
10 //  Distributed under the Boost Software License, Version 1.0. (See\r
11 //  accompanying file LICENSE_1_0.txt or copy at\r
12 //  http://www.boost.org/LICENSE_1_0.txt)\r
13 //\r
14 //  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.\r
15 //\r
16 \r
17 #include <boost/assert.hpp>\r
18 #include <boost/checked_delete.hpp>\r
19 #include <boost/throw_exception.hpp>\r
20 #include <boost/smart_ptr/detail/atomic_count.hpp>\r
21 \r
22 #include <cstddef>          // for std::ptrdiff_t\r
23 #include <algorithm>        // for std::swap\r
24 #include <functional>       // for std::less\r
25 #include <new>              // for std::bad_alloc\r
26 \r
27 namespace boost\r
28 {\r
29 \r
30 template<class T> class shared_array\r
31 {\r
32 private:\r
33 \r
34     typedef detail::atomic_count count_type;\r
35 \r
36 public:\r
37 \r
38     typedef T element_type;\r
39       \r
40     explicit shared_array(T * p = 0): px(p)\r
41     {\r
42 #ifndef BOOST_NO_EXCEPTIONS\r
43 \r
44         try  // prevent leak if new throws\r
45         {\r
46             pn = new count_type(1);\r
47         }\r
48         catch(...)\r
49         {\r
50             boost::checked_array_delete(p);\r
51             throw;\r
52         }\r
53 \r
54 #else\r
55 \r
56         pn = new count_type(1);\r
57 \r
58         if(pn == 0)\r
59         {\r
60             boost::checked_array_delete(p);\r
61             boost::throw_exception(std::bad_alloc());\r
62         }\r
63 \r
64 #endif\r
65     }\r
66 \r
67     ~shared_array()\r
68     {\r
69         if(--*pn == 0)\r
70         {\r
71             boost::checked_array_delete(px);\r
72             delete pn;\r
73         }\r
74     }\r
75 \r
76     shared_array(shared_array const & r) : px(r.px)  // never throws\r
77     {\r
78         pn = r.pn;\r
79         ++*pn;\r
80     }\r
81 \r
82     shared_array & operator=(shared_array const & r)\r
83     {\r
84         shared_array(r).swap(*this);\r
85         return *this;\r
86     }\r
87 \r
88     void reset(T * p = 0)\r
89     {\r
90         BOOST_ASSERT(p == 0 || p != px);\r
91         shared_array(p).swap(*this);\r
92     }\r
93 \r
94     T * get() const  // never throws\r
95     {\r
96         return px;\r
97     }\r
98 \r
99     T & operator[](std::ptrdiff_t i) const  // never throws\r
100     {\r
101         BOOST_ASSERT(px != 0);\r
102         BOOST_ASSERT(i >= 0);\r
103         return px[i];\r
104     }\r
105 \r
106     long use_count() const  // never throws\r
107     {\r
108         return *pn;\r
109     }\r
110 \r
111     bool unique() const  // never throws\r
112     {\r
113         return *pn == 1;\r
114     }\r
115 \r
116     void swap(shared_array<T> & other)  // never throws\r
117     {\r
118         std::swap(px, other.px);\r
119         std::swap(pn, other.pn);\r
120     }\r
121 \r
122 private:\r
123 \r
124     T * px;            // contained pointer\r
125     count_type * pn;   // ptr to reference counter\r
126       \r
127 };  // shared_array\r
128 \r
129 template<class T, class U> inline bool operator==(shared_array<T> const & a, shared_array<U> const & b)\r
130 {\r
131     return a.get() == b.get();\r
132 }\r
133 \r
134 template<class T, class U> inline bool operator!=(shared_array<T> const & a, shared_array<U> const & b)\r
135 {\r
136     return a.get() != b.get();\r
137 }\r
138 \r
139 template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b)\r
140 {\r
141     return std::less<T*>()(a.get(), b.get());\r
142 }\r
143 \r
144 template<class T> void swap(shared_array<T> & a, shared_array<T> & b)\r
145 {\r
146     a.swap(b);\r
147 }\r
148 \r
149 } // namespace boost\r
150 \r
151 #endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED\r