17 #ifndef ZORBA_UNIQUE_PTR_H
18 #define ZORBA_UNIQUE_PTR_H
20 #include <zorba/config.h>
22 #ifdef ZORBA_CXX_UNIQUE_PTR
34 template<
typename T>
inline
35 typename enable_if<!zorba::internal::is_movable<T>::value,T&>
::type
40 template<
typename T>
inline
41 typename enable_if<zorba::internal::is_movable<T>::value,
47 template<
typename T>
inline
48 typename enable_if<zorba::internal::is_movable<T>::value,
63 template<typename T,typename D,bool = ZORBA_TR1_NS::is_empty<D>::value>
74 ptr_( p ), deleter_( d )
100 template<
typename T,
typename D>
135 template<
typename T,
typename D,
bool IsEmpty>
inline
161 typename enable_if<ZORBA_TR1_NS::is_convertible<U*,T*>::value>::
type* = 0 )
200 template<
typename T,
class D = default_delete<T> >
206 deleter_const_reference;
209 struct pointer_conversion {
int valid; };
210 typedef int pointer_conversion::*explicit_bool;
261 template<
typename U,
typename E>
266 ZORBA_TR1_NS::is_convertible<E,D>::value && (
267 !ZORBA_TR1_NS::is_reference<D>::value ||
268 ZORBA_TR1_NS::is_same<D,E>::value
293 reset( p.release() );
308 template<
typename U,
typename E>
310 reset( p.release() );
349 return storage_.
ptr_;
390 if ( p != storage_.
ptr_ ) {
411 operator explicit_bool()
const throw() {
412 return get() ? &pointer_conversion::valid : 0;
418 void call_deleter() {
426 template<
typename U,
typename E>
unique_ptr( unique_ptr<U,E>& );
430 operator ::zorba::internal::rv<unique_ptr>&()
throw() {
434 operator ::zorba::internal::rv<unique_ptr>
const&()
const throw() {
451 template<
typename T,
typename D>
457 deleter_const_reference;
459 struct pointer_conversion {
int valid; };
460 typedef int pointer_conversion::*explicit_bool;
478 reset( p.release() );
484 return storage_.
ptr_;
506 if ( p != storage_.
ptr_ ) {
516 operator explicit_bool()
const throw() {
517 return get() ? &pointer_conversion::valid : 0;
523 void call_deleter() {
531 template<
typename U,
typename E>
unique_ptr( unique_ptr<U,E>& );
535 operator ::zorba::internal::rv<unique_ptr>&()
throw() {
539 operator ::zorba::internal::rv<unique_ptr>
const&()
const throw() {
546 #define ZORBA_UNIQUE_PTR_RELOP(OP) \
547 template<typename T1,typename D1,typename T2,typename D2> inline \
548 bool operator OP( unique_ptr<T1,D1> const &a, unique_ptr<T2,D2> const &b ) { \
549 return a.get() OP b.get(); \
559 #undef ZORBA_UNIQUE_PTR_RELOP
571 template<
typename T,
typename D>
inline