boost fails on mac gcc 4.2; refs #11
This commit is contained in:
		| @@ -50,15 +50,370 @@ | ||||
|  | ||||
| #  ifdef MRW__OLD_PRE11_COMPILER | ||||
| #    if __cplusplus<200300L | ||||
| #      include <boost/shared_ptr.hpp> | ||||
| namespace std { | ||||
|   // there is no std::shared_ptr in pre C++11 compilers, so we use the | ||||
|   // one from the boost library as a 1:1 replacement | ||||
|   template <typename T> class shared_ptr: public boost::shared_ptr<T> { | ||||
|        namespace std { | ||||
|          // there is no std::shared_ptr in pre C++11 compilers, so we use the | ||||
|          // one copied from newer gcc | ||||
|          template<typename _Ch, typename _Tr, typename _Tp, _Lock_policy _Lp> | ||||
|              inline std::basic_ostream<_Ch, _Tr>& | ||||
|              operator<<(std::basic_ostream<_Ch, _Tr>& __os, | ||||
|                         const __shared_ptr<_Tp, _Lp>& __p) | ||||
|          { | ||||
|            __os << __p.get(); | ||||
|            return __os; | ||||
|          } | ||||
|          template<typename _Del, typename _Tp, _Lock_policy _Lp> | ||||
|              inline _Del* | ||||
|              get_deleter(const __shared_ptr<_Tp, _Lp>& __p) noexcept | ||||
|          { | ||||
| #ifdef __GXX_RTTI | ||||
|            return static_cast<_Del*>(__p._M_get_deleter(typeid(_Del))); | ||||
| #else | ||||
|            return 0; | ||||
| #endif | ||||
|          } | ||||
|          template<typename _Tp> class shared_ptr : public __shared_ptr<_Tp> { | ||||
|            public: | ||||
|              constexpr shared_ptr() noexcept: __shared_ptr<_Tp>() { } | ||||
|              shared_ptr(const shared_ptr&) noexcept = default; | ||||
|              template<typename _Tp1> explicit shared_ptr(_Tp1* __p) | ||||
|                  : __shared_ptr<_Tp>(__p) { } | ||||
|              template<typename _Tp1, typename _Deleter> | ||||
|                  shared_ptr(_Tp1* __p, _Deleter __d) | ||||
|                      : __shared_ptr<_Tp>(__p, __d) { } | ||||
|              template<typename _Deleter> | ||||
|                  shared_ptr(nullptr_t __p, _Deleter __d) | ||||
|                      : __shared_ptr<_Tp>(__p, __d) { } | ||||
|              template<typename _Tp1, typename _Deleter, typename _Alloc> | ||||
|                  shared_ptr(_Tp1* __p, _Deleter __d, _Alloc __a) | ||||
|                      : __shared_ptr<_Tp>(__p, __d, std::move(__a)) { } | ||||
|              template<typename _Deleter, typename _Alloc> | ||||
|                  shared_ptr(nullptr_t __p, _Deleter __d, _Alloc __a) | ||||
|                      : __shared_ptr<_Tp>(__p, __d, std::move(__a)) { } | ||||
|              template<typename _Tp1> | ||||
|                  shared_ptr(const shared_ptr<_Tp1>& __r, _Tp* __p) noexcept | ||||
|                  : __shared_ptr<_Tp>(__r, __p) { } | ||||
|              template<typename _Tp1, typename = typename | ||||
|                  std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type> | ||||
|                  shared_ptr(const shared_ptr<_Tp1>& __r) noexcept | ||||
|                  : __shared_ptr<_Tp>(__r) { } | ||||
|              shared_ptr(shared_ptr&& __r) noexcept | ||||
|                  : __shared_ptr<_Tp>(std::move(__r)) { } | ||||
|              template<typename _Tp1, typename = typename | ||||
|                  std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type> | ||||
|                  shared_ptr(shared_ptr<_Tp1>&& __r) noexcept | ||||
|                  : __shared_ptr<_Tp>(std::move(__r)) { } | ||||
|              template<typename _Tp1> | ||||
|                  explicit shared_ptr(const weak_ptr<_Tp1>& __r) | ||||
|                      : __shared_ptr<_Tp>(__r) { } | ||||
|              template<typename _Tp1, typename _Del> | ||||
|                  shared_ptr(std::unique_ptr<_Tp1, _Del>&& __r) | ||||
|                      : __shared_ptr<_Tp>(std::move(__r)) { } | ||||
|              constexpr shared_ptr(nullptr_t __p) noexcept | ||||
|                  : __shared_ptr<_Tp>(__p) { } | ||||
|              shared_ptr& operator=(const shared_ptr&) noexcept = default; | ||||
|              template<typename _Tp1> | ||||
|                  shared_ptr& operator=(const shared_ptr<_Tp1>& __r) noexcept { | ||||
|                this->__shared_ptr<_Tp>::operator=(__r); | ||||
|                return *this; | ||||
|              } | ||||
|              shared_ptr& operator=(shared_ptr&& __r) noexcept { | ||||
|                this->__shared_ptr<_Tp>::operator=(std::move(__r)); | ||||
|                return *this; | ||||
|              } | ||||
|              template<class _Tp1> | ||||
|                  shared_ptr& operator=(shared_ptr<_Tp1>&& __r) noexcept { | ||||
|                this->__shared_ptr<_Tp>::operator=(std::move(__r)); | ||||
|                return *this; | ||||
|              } | ||||
|              template<typename _Tp1, typename _Del> | ||||
|                  shared_ptr& operator=(std::unique_ptr<_Tp1, _Del>&& __r) { | ||||
|                this->__shared_ptr<_Tp>::operator=(std::move(__r)); | ||||
|                return *this; | ||||
|              } | ||||
|            private: | ||||
|              template<typename _Alloc, typename... _Args> | ||||
|                  shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a, | ||||
|                             _Args&&... __args) | ||||
|                      : __shared_ptr<_Tp>(__tag, __a, | ||||
|                                          std::forward<_Args>(__args)...) { } | ||||
|              template<typename _Tp1, typename _Alloc, typename... _Args> | ||||
|                  friend shared_ptr<_Tp1> | ||||
|                  allocate_shared(const _Alloc& __a, _Args&&... __args); | ||||
|          }; | ||||
|          template<typename _Tp1, typename _Tp2> | ||||
|              inline bool operator==(const shared_ptr<_Tp1>& __a, | ||||
|                                     const shared_ptr<_Tp2>& __b) noexcept { | ||||
|            return __a.get() == __b.get(); | ||||
|          } | ||||
|          template<typename _Tp> | ||||
|              inline bool operator==(const shared_ptr<_Tp>& __a, | ||||
|                                     nullptr_t) noexcept { | ||||
|            return !__a; | ||||
|          } | ||||
|          template<typename _Tp> | ||||
|              inline bool operator==(nullptr_t, | ||||
|                                     const shared_ptr<_Tp>& __a) noexcept { | ||||
|            return !__a; | ||||
|          } | ||||
|          template<typename _Tp1, typename _Tp2> | ||||
|              inline bool operator!=(const shared_ptr<_Tp1>& __a, | ||||
|                                     const shared_ptr<_Tp2>& __b) noexcept { | ||||
|            return __a.get() != __b.get(); | ||||
|          } | ||||
|          template<typename _Tp> | ||||
|              inline bool operator!=(const shared_ptr<_Tp>& __a, | ||||
|                                     nullptr_t) noexcept { | ||||
|            return (bool)__a; | ||||
|          } | ||||
|          template<typename _Tp> | ||||
|              inline bool operator!=(nullptr_t, | ||||
|                                     const shared_ptr<_Tp>& __a) noexcept { | ||||
|            return (bool)__a; | ||||
|          } | ||||
|          template<typename _Tp1, typename _Tp2> | ||||
|              inline bool operator<(const shared_ptr<_Tp1>& __a, | ||||
|                                    const shared_ptr<_Tp2>& __b) noexcept { | ||||
|            typedef typename std::common_type<_Tp1*, _Tp2*>::type _CT; | ||||
|            return std::less<_CT>()(__a.get(), __b.get()); | ||||
|          } | ||||
|          template<typename _Tp> | ||||
|     inline bool | ||||
|     operator<(const shared_ptr<_Tp>& __a, nullptr_t) noexcept | ||||
|     { return std::less<_Tp*>()(__a.get(), nullptr); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     inline bool | ||||
|     operator<(nullptr_t, const shared_ptr<_Tp>& __a) noexcept | ||||
|     { return std::less<_Tp*>()(nullptr, __a.get()); } | ||||
|  | ||||
|   template<typename _Tp1, typename _Tp2> | ||||
|     inline bool | ||||
|     operator<=(const shared_ptr<_Tp1>& __a, | ||||
| 	       const shared_ptr<_Tp2>& __b) noexcept | ||||
|     { return !(__b < __a); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     inline bool | ||||
|     operator<=(const shared_ptr<_Tp>& __a, nullptr_t) noexcept | ||||
|     { return !(nullptr < __a); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     inline bool | ||||
|     operator<=(nullptr_t, const shared_ptr<_Tp>& __a) noexcept | ||||
|     { return !(__a < nullptr); } | ||||
|  | ||||
|   template<typename _Tp1, typename _Tp2> | ||||
|     inline bool | ||||
|     operator>(const shared_ptr<_Tp1>& __a, | ||||
| 	      const shared_ptr<_Tp2>& __b) noexcept | ||||
|     { return (__b < __a); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     inline bool | ||||
|     operator>(const shared_ptr<_Tp>& __a, nullptr_t) noexcept | ||||
|     { return std::less<_Tp*>()(nullptr, __a.get()); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     inline bool | ||||
|     operator>(nullptr_t, const shared_ptr<_Tp>& __a) noexcept | ||||
|     { return std::less<_Tp*>()(__a.get(), nullptr); } | ||||
|  | ||||
|   template<typename _Tp1, typename _Tp2> | ||||
|     inline bool | ||||
|     operator>=(const shared_ptr<_Tp1>& __a, | ||||
| 	       const shared_ptr<_Tp2>& __b) noexcept | ||||
|     { return !(__a < __b); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     inline bool | ||||
|     operator>=(const shared_ptr<_Tp>& __a, nullptr_t) noexcept | ||||
|     { return !(__a < nullptr); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     inline bool | ||||
|     operator>=(nullptr_t, const shared_ptr<_Tp>& __a) noexcept | ||||
|     { return !(nullptr < __a); } | ||||
|  | ||||
|   template<typename _Tp> | ||||
|     struct less<shared_ptr<_Tp>> : public _Sp_less<shared_ptr<_Tp>> | ||||
|     { }; | ||||
|  | ||||
|   // 20.7.2.2.8 shared_ptr specialized algorithms. | ||||
|   template<typename _Tp> | ||||
|     inline void | ||||
|     swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>& __b) noexcept | ||||
|     { __a.swap(__b); } | ||||
|  | ||||
|   // 20.7.2.2.9 shared_ptr casts. | ||||
|   template<typename _Tp, typename _Tp1> | ||||
|     inline shared_ptr<_Tp> | ||||
|     static_pointer_cast(const shared_ptr<_Tp1>& __r) noexcept | ||||
|     { return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); } | ||||
|  | ||||
|   template<typename _Tp, typename _Tp1> | ||||
|     inline shared_ptr<_Tp> | ||||
|     const_pointer_cast(const shared_ptr<_Tp1>& __r) noexcept | ||||
|     { return shared_ptr<_Tp>(__r, const_cast<_Tp*>(__r.get())); } | ||||
|  | ||||
|   template<typename _Tp, typename _Tp1> | ||||
|     inline shared_ptr<_Tp> | ||||
|     dynamic_pointer_cast(const shared_ptr<_Tp1>& __r) noexcept | ||||
|     { | ||||
|       if (_Tp* __p = dynamic_cast<_Tp*>(__r.get())) | ||||
| 	return shared_ptr<_Tp>(__r, __p); | ||||
|       return shared_ptr<_Tp>(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    *  @brief  A smart pointer with weak semantics. | ||||
|    * | ||||
|    *  With forwarding constructors and assignment operators. | ||||
|    */ | ||||
|   template<typename _Tp> | ||||
|     class weak_ptr : public __weak_ptr<_Tp> | ||||
|     { | ||||
|     public: | ||||
|       explicit shared_ptr(): boost::shared_ptr<T>() {} | ||||
|       explicit shared_ptr(T* p): boost::shared_ptr<T>(p) {} | ||||
|   }; | ||||
|       constexpr weak_ptr() noexcept | ||||
|       : __weak_ptr<_Tp>() { } | ||||
|  | ||||
|       template<typename _Tp1, typename = typename | ||||
| 	       std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type> | ||||
| 	weak_ptr(const weak_ptr<_Tp1>& __r) noexcept | ||||
| 	: __weak_ptr<_Tp>(__r) { } | ||||
|  | ||||
|       template<typename _Tp1, typename = typename | ||||
| 	       std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type> | ||||
| 	weak_ptr(const shared_ptr<_Tp1>& __r) noexcept | ||||
| 	: __weak_ptr<_Tp>(__r) { } | ||||
|  | ||||
|       template<typename _Tp1> | ||||
| 	weak_ptr& | ||||
| 	operator=(const weak_ptr<_Tp1>& __r) noexcept | ||||
| 	{ | ||||
| 	  this->__weak_ptr<_Tp>::operator=(__r); | ||||
| 	  return *this; | ||||
| 	} | ||||
|  | ||||
|       template<typename _Tp1> | ||||
| 	weak_ptr& | ||||
| 	operator=(const shared_ptr<_Tp1>& __r) noexcept | ||||
| 	{ | ||||
| 	  this->__weak_ptr<_Tp>::operator=(__r); | ||||
| 	  return *this; | ||||
| 	} | ||||
|  | ||||
|       shared_ptr<_Tp> | ||||
|       lock() const noexcept | ||||
|       { | ||||
| #ifdef __GTHREADS | ||||
| 	if (this->expired()) | ||||
| 	  return shared_ptr<_Tp>(); | ||||
|  | ||||
| 	__try | ||||
| 	  { | ||||
| 	    return shared_ptr<_Tp>(*this); | ||||
| 	  } | ||||
| 	__catch(const bad_weak_ptr&) | ||||
| 	  { | ||||
| 	    return shared_ptr<_Tp>(); | ||||
| 	  } | ||||
| #else | ||||
| 	return this->expired() ? shared_ptr<_Tp>() : shared_ptr<_Tp>(*this); | ||||
| #endif | ||||
|       } | ||||
|     }; | ||||
|  | ||||
|   // 20.7.2.3.6 weak_ptr specialized algorithms. | ||||
|   template<typename _Tp> | ||||
|     inline void | ||||
|     swap(weak_ptr<_Tp>& __a, weak_ptr<_Tp>& __b) noexcept | ||||
|     { __a.swap(__b); } | ||||
|  | ||||
|  | ||||
|   /// Primary template owner_less | ||||
|   template<typename _Tp> | ||||
|     struct owner_less; | ||||
|  | ||||
|   /// Partial specialization of owner_less for shared_ptr. | ||||
|   template<typename _Tp> | ||||
|     struct owner_less<shared_ptr<_Tp>> | ||||
|     : public _Sp_owner_less<shared_ptr<_Tp>, weak_ptr<_Tp>> | ||||
|     { }; | ||||
|  | ||||
|   /// Partial specialization of owner_less for weak_ptr. | ||||
|   template<typename _Tp> | ||||
|     struct owner_less<weak_ptr<_Tp>> | ||||
|     : public _Sp_owner_less<weak_ptr<_Tp>, shared_ptr<_Tp>> | ||||
|     { }; | ||||
|  | ||||
|   /** | ||||
|    *  @brief Base class allowing use of member function shared_from_this. | ||||
|    */ | ||||
|   template<typename _Tp> | ||||
|     class enable_shared_from_this | ||||
|     { | ||||
|     protected: | ||||
|       constexpr enable_shared_from_this() noexcept { } | ||||
|  | ||||
|       enable_shared_from_this(const enable_shared_from_this&) noexcept { } | ||||
|  | ||||
|       enable_shared_from_this& | ||||
|       operator=(const enable_shared_from_this&) noexcept | ||||
|       { return *this; } | ||||
|  | ||||
|       ~enable_shared_from_this() { } | ||||
|  | ||||
|     public: | ||||
|       shared_ptr<_Tp> | ||||
|       shared_from_this() | ||||
|       { return shared_ptr<_Tp>(this->_M_weak_this); } | ||||
|  | ||||
|       shared_ptr<const _Tp> | ||||
|       shared_from_this() const | ||||
|       { return shared_ptr<const _Tp>(this->_M_weak_this); } | ||||
|  | ||||
|     private: | ||||
|       template<typename _Tp1> | ||||
| 	void | ||||
| 	_M_weak_assign(_Tp1* __p, const __shared_count<>& __n) const noexcept | ||||
| 	{ _M_weak_this._M_assign(__p, __n); } | ||||
|  | ||||
|       template<typename _Tp1> | ||||
| 	friend void | ||||
| 	__enable_shared_from_this_helper(const __shared_count<>& __pn, | ||||
| 					 const enable_shared_from_this* __pe, | ||||
| 					 const _Tp1* __px) noexcept | ||||
| 	{ | ||||
| 	  if (__pe != 0) | ||||
| 	    __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn); | ||||
| 	} | ||||
|  | ||||
|       mutable weak_ptr<_Tp>  _M_weak_this; | ||||
|     }; | ||||
|   template<typename _Tp, typename _Alloc, typename... _Args> | ||||
|     inline shared_ptr<_Tp> | ||||
|     allocate_shared(const _Alloc& __a, _Args&&... __args) | ||||
|     { | ||||
|       return shared_ptr<_Tp>(_Sp_make_shared_tag(), __a, | ||||
| 			     std::forward<_Args>(__args)...); | ||||
|     } | ||||
|   template<typename _Tp, typename... _Args> | ||||
|     inline shared_ptr<_Tp> | ||||
|     make_shared(_Args&&... __args) | ||||
|     { | ||||
|       typedef typename std::remove_const<_Tp>::type _Tp_nc; | ||||
|       return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(), | ||||
| 				       std::forward<_Args>(__args)...); | ||||
|     } | ||||
|   template<typename _Tp> | ||||
|     struct hash<shared_ptr<_Tp>> | ||||
|     : public __hash_base<size_t, shared_ptr<_Tp>> | ||||
|     { | ||||
|       size_t | ||||
|       operator()(const shared_ptr<_Tp>& __s) const noexcept | ||||
|       { return std::hash<_Tp*>()(__s.get()); } | ||||
|     }; | ||||
|   // auto_ptr is deprecated in favour of unique_ptr, simulate unique_ptr | ||||
|   template <typename T> class unique_ptr: public std::auto_ptr<T> { | ||||
|     public: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user