3 #ifndef DUNE_SHARED_PTR_HH
4 #define DUNE_SHARED_PTR_HH
6 #if defined SHARED_PTR_HEADER
7 # include SHARED_PTR_HEADER
9 #if defined HAVE_BOOST_SHARED_PTR_HPP
10 #if defined HAVE_BOOST_MAKE_SHARED_HPP
11 # include <boost/make_shared.hpp>
26 #ifdef SHARED_PTR_NAMESPACE
27 using SHARED_PTR_NAMESPACE :: shared_ptr;
79 template<
class Deleter>
80 inline shared_ptr(T * pointer, Deleter deleter);
110 return rep_==0 ? 0 : rep_->rep_;
122 inline void reset(T* pointer);
125 template<
class Deleter>
126 inline void reset(T* pointer, Deleter deleter);
144 virtual ~PointerRep() {};
148 template<
class Deleter>
149 class PointerRepImpl :
155 PointerRepImpl(
element_type * p,
const Deleter& deleter) :
162 { deleter_(this->rep_); }
169 struct DefaultDeleter
179 typedef T* shared_ptr::PointerRep::*__unspecified_bool_type;
183 operator __unspecified_bool_type() const
185 return rep_ == 0 ? 0 : &shared_ptr::PointerRep::rep_;
194 rep_ =
new PointerRepImpl<DefaultDeleter>(p, DefaultDeleter());
198 template<
class Deleter>
201 rep_ =
new PointerRepImpl<Deleter>(p, deleter);
221 (other.rep_->count_)++;
223 if(rep_!=0 && --(rep_->count_)<=0)
233 if(rep_!=0 && --(rep_->count_)==0){
242 return *(rep_->rep_);
254 return *(rep_->rep_);
272 PointerRep* dummy = rep_;
290 template<
class Deleter>
297 #endif // #ifdef SHARED_PTR_NAMESPACE
304 #ifdef SHARED_PTR_NAMESPACE
315 template<
typename T,
typename Arg1>
321 template<
typename T,
typename Arg1,
typename Arg2>
327 template<
typename T,
typename Arg1,
typename Arg2,
typename Arg3>
333 template<
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
339 template<
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
347 template<
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
348 typename Arg5,
typename Arg6>
350 const Arg5& arg5,
const Arg6& arg6)
355 template<
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
356 typename Arg5,
typename Arg6,
typename Arg7>
358 const Arg5& arg5,
const Arg6& arg6,
const Arg7& arg7)
360 return shared_ptr<T>(
new T(arg1,arg2,arg3,arg4,arg5,arg6,arg7));
363 template<
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
364 typename Arg5,
typename Arg6,
typename Arg7,
typename Arg8>
366 const Arg5& arg5,
const Arg6& arg6,
const Arg7& arg7,
const Arg8& arg8)
368 return shared_ptr<T>(
new T(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8));
371 template<
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
372 typename Arg5,
typename Arg6,
typename Arg7,
typename Arg8,
typename Arg9>
374 const Arg5& arg5,
const Arg6& arg6,
const Arg7& arg7,
const Arg8& arg8,
377 return shared_ptr<T>(
new T(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9));
380 #endif // custom make_shared
443 template<
typename T,
typename T2>