17 #ifndef ZORBA_UNIQUE_PTR_H
18 #define ZORBA_UNIQUE_PTR_H
20 #include <zorba/config.h>
22 #ifdef ZORBA_HAVE_UNIQUE_PTR
35 template<
typename T>
inline
36 typename enable_if<!zorba::internal::is_movable<T>::value,T&>
::type
41 template<
typename T>
inline
42 typename enable_if<zorba::internal::is_movable<T>::value,
48 template<
typename T>
inline
49 typename enable_if<zorba::internal::is_movable<T>::value,
64 template<typename T,typename D,bool = ZORBA_TR1_NS::is_empty<D>::value>
75 ptr_( p ), deleter_( d )
101 template<
typename T,
typename D>
136 template<
typename T,
typename D,
bool IsEmpty>
inline
162 typename enable_if<ZORBA_TR1_NS::is_convertible<U*,T*>::value>::
type* = 0 )
201 template<
typename T,
class D = default_delete<T> >
207 deleter_const_reference;
260 template<
typename U,
typename E>
265 ZORBA_TR1_NS::is_convertible<E,D>::value && (
266 !ZORBA_TR1_NS::is_reference<D>::value ||
267 ZORBA_TR1_NS::is_same<D,E>::value
292 reset( p.release() );
307 template<
typename U,
typename E>
309 reset( p.release() );
348 return storage_.
ptr_;
389 if ( p != storage_.
ptr_ ) {
417 void call_deleter() {
419 get_deleter()( storage_.ptr_ );
423 unique_ptr( unique_ptr& );
424 unique_ptr& operator=( unique_ptr& );
425 template<
typename U,
typename E> unique_ptr( unique_ptr<U,E>& );
426 template<
typename U,
typename E> unique_ptr& operator=( unique_ptr<U,E>& );
429 operator ::zorba::internal::rv<unique_ptr>&()
throw() {
433 operator ::zorba::internal::rv<unique_ptr>
const&()
const throw() {
450 template<
typename T,
typename D>
456 deleter_const_reference;
458 struct pointer_conversion {
int valid; };
459 typedef int pointer_conversion::*explicit_bool;
477 reset( p.release() );
478 storage_.deleter() =
move( p.get_deleter() );
483 return storage_.ptr_;
491 return storage_.deleter();
495 return storage_.deleter();
505 if ( p != storage_.ptr_ ) {
515 operator explicit_bool()
const throw() {
516 return get() ? &pointer_conversion::valid : 0;
522 void call_deleter() {
524 get_deleter()( storage_.ptr_ );
528 unique_ptr( unique_ptr& );
529 unique_ptr& operator=( unique_ptr& );
530 template<
typename U,
typename E> unique_ptr( unique_ptr<U,E>& );
531 template<
typename U,
typename E> unique_ptr& operator=( unique_ptr<U,E>& );
534 operator ::zorba::internal::rv<unique_ptr>&()
throw() {
538 operator ::zorba::internal::rv<unique_ptr>
const&()
const throw() {
545 #define ZORBA_UNIQUE_PTR_RELOP(OP) \
546 template<typename T1,typename D1,typename T2,typename D2> inline \
547 bool operator OP( unique_ptr<T1,D1> const &a, unique_ptr<T2,D2> const &b ) { \
548 return a.get() OP b.get(); \
558 #undef ZORBA_UNIQUE_PTR_RELOP
570 template<
typename T,
typename D>
inline