21 #include <boost/mpl/assert.hpp>
25 template<
class V,
class LkT>
inline typename shared_ptr<V, LkT>::atomic_ptr_t
30 typename atomic_ptr_t::value_type tmp=
static_cast<
typename atomic_ptr_t::value_type>(data_.get());
31 assert(
dynamic_cast<
typename atomic_ptr_t::value_type>(tmp));
32 assert(tmp->sp_count()>0);
34 if (
LIKELY(tmp->sp_release())) {
35 assert(tmp->sp_count()<=0);
37 data_=
typename atomic_ptr_t::value_type();
40 const bool ret=(!data_ &&
dynamic_cast<
typename atomic_ptr_t::value_type>(tmp));
42 assert(
dynamic_cast<ctr_type *>(tmp));
49 template<
class V,
class LkT>
inline void
54 template<
class V,
class LkT>
inline
57 BOOST_MPL_ASSERT((
std::is_same<deleter_t,
typename value_type::deleter_t>));
59 assert(
dynamic_cast<ctr_type *>(ptr));
61 assert(
dynamic_cast<value_type *>(data_.get()));
62 assert(ptr->sp_count()>0);
66 template<
class V,
class LkT>
71 typedef typename std::remove_const<V1>::type v1_t;
73 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, v1_t>));
77 assert(
dynamic_cast<v1_t *>(ptr));
78 assert(
dynamic_cast<ctr_type
const *>(ptr));
80 data_=
static_cast<value_type *>(
const_cast<v1_t *>(ptr));
81 assert(
dynamic_cast<value_type *>(data_.get()));
82 assert(ptr->sp_count()>0);
86 template<
class V,
class LkT>
inline
89 BOOST_MPL_ASSERT((
std::is_same<deleter_t,
typename value_type::deleter_t>));
91 assert(
dynamic_cast<ctr_type *>(ptr.get()));
93 assert(
dynamic_cast<value_type *>(data_.get()));
94 assert(ptr->sp_count()>0);
98 template<
class V,
class LkT>
103 BOOST_MPL_ASSERT((
std::is_same<deleter_t,
typename value_type::deleter_t>));
105 assert(
dynamic_cast<ctr_type *>(ptr.get()));
107 assert(
dynamic_cast<value_type *>(data_.get()));
108 assert(ptr->sp_count()>0);
112 template<
class V,
class LkT>
113 template<
class V1,
template<
class>
class At>
117 BOOST_MPL_ASSERT((
std::is_base_of<value_type, V1>));
118 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, V1>));
121 assert(
dynamic_cast<V1 *>(ptr.get()));
122 assert(
dynamic_cast<ctr_type *>(ptr.get()));
124 assert(
dynamic_cast<value_type *>(data_.get()));
125 assert(ptr->sp_count()>0);
129 template<
class V,
class LkT>
inline
133 assert(
dynamic_cast<ctr_type *>(d.get()));
136 assert(
dynamic_cast<value_type *>(data_.get()));
137 assert(data_->sp_count()>0);
141 template<
class V,
class LkT>
146 BOOST_MPL_ASSERT((
std::is_base_of<value_type, V1>));
147 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, V1>));
148 BOOST_MPL_ASSERT((
std::is_same<deleter_t,
typename V1::deleter_t>));
150 assert(
dynamic_cast<ctr_type *>(d.get()));
152 data_=
static_cast<value_type *>(d.release());
153 assert(
dynamic_cast<value_type *>(data_));
154 assert(data_->sp_count()>0);
158 template<
class V,
class LkT>
inline
160 : data_(d.release()) {
161 if (
LIKELY(data_.get())) {
162 assert(
dynamic_cast<ctr_type *>(data_.get()));
164 assert(
dynamic_cast<value_type *>(data_.get()));
165 assert(data_->sp_count()>0);
169 template<
class V,
class LkT>
173 : data_(d.release()) {
174 BOOST_MPL_ASSERT((
std::is_base_of<value_type, V1>));
175 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, V1>));
179 if (
LIKELY(data_.get())) {
180 assert(
dynamic_cast<ctr_type *>(d.get()));
182 assert(
dynamic_cast<value_type *>(data_));
183 assert(data_->sp_count()>0);
187 template<
class V,
class LkT>
inline
191 const bool ret=(s.data_.get() && s.data_->sp_acquire()>1);
193 assert(
dynamic_cast<ctr_type *>(s.data_.get()));
195 assert(data_==s.data_);
196 assert(
dynamic_cast<value_type *>(data_.get()));
197 assert(data_->sp_count()>0);
201 template<
class V,
class LkT>
inline
205 assert(data_.get() ? data_->sp_count()>0 :
true);
208 template<
class V,
class LkT>
209 template<
typename V2,
class LkT2>
inline
212 typedef typename shared_ptr<V2, LkT2>::ctr_type ctr2_type;
214 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, V2>));
215 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, ctr2_type>));
218 const bool ret=(s.data_.get() && s.data_->sp_acquire()>1);
220 assert(
dynamic_cast<ctr2_type *>(s.data_.get()));
222 assert(data_==s.data_);
223 assert(
dynamic_cast<value_type *>(data_.get()));
224 assert(data_.get() ? data_->sp_count()>0 :
true);
228 template<
class V,
class LkT>
229 template<
typename V2,
class LkT2>
inline
232 BOOST_MPL_ASSERT((
std::is_base_of<value_type, V2>));
233 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, V2>));
234 BOOST_MPL_ASSERT((
std::is_same<base_ctr_type,
typename V2::base_ctr_type>));
236 assert(data_.get() ? data_->sp_count()>0 :
true);
239 template<
class V,
class LkT>
inline
244 template<
class V,
class LkT>
inline void
247 assert(data_.get() ? data_->sp_count()>0 :
true);
250 template<
class V,
class LkT>
251 template<
typename V2,
class LkT2>
inline void
253 BOOST_MPL_ASSERT((
std::is_base_of<value_type, V2>));
254 BOOST_MPL_ASSERT((
std::is_base_of<base_ctr_type, V2>));
255 BOOST_MPL_ASSERT((
std::is_same<base_ctr_type,
typename V2::base_ctr_type>));
258 assert(data_.get() ? data_->sp_count()>0 :
true);
261 template<
class V,
class LkT>
262 template<
typename V2,
class LkT2>
inline void
265 assert(data_.get() ? data_->sp_count()>0 :
true);
268 template<
class V,
class LkT>
inline void
272 assert(data_.get() ? data_->sp_count()>0 :
true);
275 template<
class V,
class LkT>
inline void
278 assert(data_.get() ? data_->sp_count()>0 :
true);
281 template<
class V,
class LkT>
constexpr inline bool
283 return (data_.get() && s.data_.get()) ? (*data_.get()<*s.data_.get()) :
false;
285 template<
class V,
class LkT>
constexpr inline bool
287 return !((data_<s.data_) || (s.data_<data_));
289 template<
class V,
class LkT>
inline constexpr bool
293 template<
class V,
class LkT>
constexpr inline
295 return dynamic_cast<value_type
const *>(data_.get())!=
nullptr;
297 template<
class V,
class LkT>
constexpr inline bool
299 return (data_!=s.data_) && (s.data_<data_);
302 template<
class V,
class LkT>
constexpr inline typename shared_ptr<V, LkT>::atomic_ptr_t
const &
306 template<
class V,
class LkT>
inline typename shared_ptr<V, LkT>::atomic_ptr_t &
310 template<
class V,
class LkT>
constexpr inline typename shared_ptr<V, LkT>::value_type
const &
312 assert(
dynamic_cast<value_type
const *>(data_.get()));
315 template<
class V,
class LkT>
inline typename shared_ptr<V, LkT>::value_type &
317 assert(
dynamic_cast<value_type *>(data_.get()));
320 template<
class V,
class LkT>
constexpr inline typename shared_ptr<V, LkT>::value_type
const *
324 template<
class V,
class LkT>
inline typename shared_ptr<V, LkT>::value_type *
329 template<
class V,
class LkT>
inline tstring
332 os<<
"data_="<<data_.get();
333 if (
LIKELY(
dynamic_cast<value_type *>(data_.get()))) {
334 os<<
", data: "<<data_->to_string()
335 <<
", count="<<data_.get()->sp_to_string()
336 <<
", type: "<<exception_type::thread_traits::demangle_name(
typeid(
shared_ptr));