592 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			592 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| // (C) Copyright Ion Gaztanaga 2012-2012.
 | |
| // Distributed under the Boost Software License, Version 1.0.
 | |
| // (See accompanying file LICENSE_1_0.txt or copy at
 | |
| // http://www.boost.org/LICENSE_1_0.txt)
 | |
| //
 | |
| // See http://www.boost.org/libs/move for documentation.
 | |
| //
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| //! \file
 | |
| 
 | |
| #ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
 | |
| #define BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
 | |
| 
 | |
| #ifndef BOOST_CONFIG_HPP
 | |
| #  include <boost/config.hpp>
 | |
| #endif
 | |
| #
 | |
| #if defined(BOOST_HAS_PRAGMA_ONCE)
 | |
| #  pragma once
 | |
| #endif
 | |
| 
 | |
| #include <cstddef>   //for std::size_t
 | |
| 
 | |
| //Small meta-typetraits to support move
 | |
| 
 | |
| namespace boost {
 | |
| 
 | |
| namespace movelib {
 | |
| 
 | |
| template <class T>
 | |
| struct default_delete;
 | |
| 
 | |
| }  //namespace movelib {
 | |
| 
 | |
| #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
 | |
| //Forward declare boost::rv
 | |
| template <class T> class rv;
 | |
| #endif
 | |
| 
 | |
| namespace move_upmu {
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //              nat
 | |
| //////////////////////////////////////
 | |
| struct nat{};
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //            natify
 | |
| //////////////////////////////////////
 | |
| template <class T> struct natify{};
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             if_c
 | |
| //////////////////////////////////////
 | |
| template<bool C, typename T1, typename T2>
 | |
| struct if_c
 | |
| {
 | |
|    typedef T1 type;
 | |
| };
 | |
| 
 | |
| template<typename T1, typename T2>
 | |
| struct if_c<false,T1,T2>
 | |
| {
 | |
|    typedef T2 type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             if_
 | |
| //////////////////////////////////////
 | |
| template<typename T1, typename T2, typename T3>
 | |
| struct if_ : if_c<0 != T1::value, T2, T3>
 | |
| {};
 | |
| 
 | |
| //enable_if_
 | |
| template <bool B, class T = nat>
 | |
| struct enable_if_c
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //          enable_if_c
 | |
| //////////////////////////////////////
 | |
| template <class T>
 | |
| struct enable_if_c<false, T> {};
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //           enable_if
 | |
| //////////////////////////////////////
 | |
| template <class Cond, class T = nat>
 | |
| struct enable_if : public enable_if_c<Cond::value, T> {};
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //          remove_reference
 | |
| //////////////////////////////////////
 | |
| template<class T>
 | |
| struct remove_reference
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| template<class T>
 | |
| struct remove_reference<T&>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | |
| 
 | |
| template<class T>
 | |
| struct remove_reference<T&&>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| #else
 | |
| 
 | |
| template<class T>
 | |
| struct remove_reference< rv<T> >
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| template<class T>
 | |
| struct remove_reference< rv<T> &>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| template<class T>
 | |
| struct remove_reference< const rv<T> &>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             remove_const
 | |
| //////////////////////////////////////
 | |
| template< class T >
 | |
| struct remove_const
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| template< class T >
 | |
| struct remove_const<const T>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             remove_volatile
 | |
| //////////////////////////////////////
 | |
| template< class T >
 | |
| struct remove_volatile
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| template< class T >
 | |
| struct remove_volatile<volatile T>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             remove_cv
 | |
| //////////////////////////////////////
 | |
| template< class T >
 | |
| struct remove_cv
 | |
| {
 | |
|     typedef typename remove_volatile
 | |
|       <typename remove_const<T>::type>::type type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //          remove_extent
 | |
| //////////////////////////////////////
 | |
| template<class T>
 | |
| struct remove_extent
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
|  
 | |
| template<class T>
 | |
| struct remove_extent<T[]>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
|  
 | |
| template<class T, std::size_t N>
 | |
| struct remove_extent<T[N]>
 | |
| {
 | |
|    typedef T type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             extent
 | |
| //////////////////////////////////////
 | |
| 
 | |
| template<class T, unsigned N = 0>
 | |
| struct extent
 | |
| {
 | |
|    static const std::size_t value = 0;
 | |
| };
 | |
|  
 | |
| template<class T>
 | |
| struct extent<T[], 0> 
 | |
| {
 | |
|    static const std::size_t value = 0;
 | |
| };
 | |
| 
 | |
| template<class T, unsigned N>
 | |
| struct extent<T[], N>
 | |
| {
 | |
|    static const std::size_t value = extent<T, N-1>::value;
 | |
| };
 | |
| 
 | |
| template<class T, std::size_t N>
 | |
| struct extent<T[N], 0> 
 | |
| {
 | |
|    static const std::size_t value = N;
 | |
| };
 | |
|  
 | |
| template<class T, std::size_t I, unsigned N>
 | |
| struct extent<T[I], N>
 | |
| {
 | |
|    static const std::size_t value = extent<T, N-1>::value;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //      add_lvalue_reference
 | |
| //////////////////////////////////////
 | |
| template<class T>
 | |
| struct add_lvalue_reference
 | |
| {
 | |
|    typedef T& type;
 | |
| };
 | |
| 
 | |
| template<class T>
 | |
| struct add_lvalue_reference<T&>
 | |
| {
 | |
|    typedef T& type;
 | |
| };
 | |
| 
 | |
| template<>
 | |
| struct add_lvalue_reference<void>
 | |
| {
 | |
|    typedef void type;
 | |
| };
 | |
| 
 | |
| template<>
 | |
| struct add_lvalue_reference<const void>
 | |
| {
 | |
|    typedef const void type;
 | |
| };
 | |
| 
 | |
| template<>
 | |
| struct add_lvalue_reference<volatile void>
 | |
| {
 | |
|    typedef volatile void type;
 | |
| };
 | |
| 
 | |
| template<>
 | |
| struct add_lvalue_reference<const volatile void>
 | |
| {
 | |
|    typedef const volatile void type;
 | |
| };
 | |
| 
 | |
| template<class T>
 | |
| struct add_const_lvalue_reference
 | |
| {
 | |
|    typedef typename remove_reference<T>::type   t_unreferenced;
 | |
|    typedef const t_unreferenced                 t_unreferenced_const;
 | |
|    typedef typename add_lvalue_reference
 | |
|       <t_unreferenced_const>::type              type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             is_same
 | |
| //////////////////////////////////////
 | |
| template<class T, class U>
 | |
| struct is_same
 | |
| {
 | |
|    static const bool value = false;
 | |
| };
 | |
|  
 | |
| template<class T>
 | |
| struct is_same<T, T>
 | |
| {
 | |
|    static const bool value = true;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             is_pointer
 | |
| //////////////////////////////////////
 | |
| template< class T >
 | |
| struct is_pointer
 | |
| {
 | |
|     static const bool value = false;
 | |
| };
 | |
| 
 | |
| template< class T >
 | |
| struct is_pointer<T*>
 | |
| {
 | |
|     static const bool value = true;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             is_reference
 | |
| //////////////////////////////////////
 | |
| template< class T >
 | |
| struct is_reference
 | |
| {
 | |
|     static const bool value = false;
 | |
| };
 | |
| 
 | |
| template< class T >
 | |
| struct is_reference<T&>
 | |
| {
 | |
|     static const bool value = true;
 | |
| };
 | |
| 
 | |
| #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | |
| 
 | |
| template< class T >
 | |
| struct is_reference<T&&>
 | |
| {
 | |
|     static const bool value = true;
 | |
| };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             is_lvalue_reference
 | |
| //////////////////////////////////////
 | |
| template<class T>
 | |
| struct is_lvalue_reference
 | |
| {
 | |
|     static const bool value = false;
 | |
| };
 | |
| 
 | |
| template<class T>
 | |
| struct is_lvalue_reference<T&>
 | |
| {
 | |
|     static const bool value = true;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //          is_array
 | |
| //////////////////////////////////////
 | |
| template<class T>
 | |
| struct is_array
 | |
| {
 | |
|    static const bool value = false;
 | |
| };
 | |
|  
 | |
| template<class T>
 | |
| struct is_array<T[]>
 | |
| {
 | |
|    static const bool value = true;
 | |
| };
 | |
|  
 | |
| template<class T, std::size_t N>
 | |
| struct is_array<T[N]>
 | |
| {
 | |
|    static const bool value = true;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //          has_pointer_type
 | |
| //////////////////////////////////////
 | |
| template <class T>
 | |
| struct has_pointer_type
 | |
| {
 | |
|    struct two { char c[2]; };
 | |
|    template <class U> static two test(...);
 | |
|    template <class U> static char test(typename U::pointer* = 0);
 | |
|    static const bool value = sizeof(test<T>(0)) == 1;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //             pointer_type
 | |
| //////////////////////////////////////
 | |
| template <class T, class D, bool = has_pointer_type<D>::value>
 | |
| struct pointer_type_imp
 | |
| {
 | |
|     typedef typename D::pointer type;
 | |
| };
 | |
| 
 | |
| template <class T, class D>
 | |
| struct pointer_type_imp<T, D, false>
 | |
| {
 | |
|     typedef typename remove_extent<T>::type* type;
 | |
| };
 | |
| 
 | |
| template <class T, class D>
 | |
| struct pointer_type
 | |
| {
 | |
|     typedef typename pointer_type_imp
 | |
|       <typename remove_extent<T>::type, typename remove_reference<D>::type>::type type;
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //           is_convertible
 | |
| //////////////////////////////////////
 | |
| #if defined(_MSC_VER) && (_MSC_VER >= 1400)
 | |
| 
 | |
| //use intrinsic since in MSVC
 | |
| //overaligned types can't go through ellipsis
 | |
| template <class T, class U>
 | |
| struct is_convertible
 | |
| {
 | |
|    static const bool value = __is_convertible_to(T, U);
 | |
| };
 | |
| 
 | |
| #else
 | |
| 
 | |
| template <class T, class U>
 | |
| class is_convertible
 | |
| {
 | |
|    typedef typename add_lvalue_reference<T>::type t_reference;
 | |
|    typedef char true_t;
 | |
|    class false_t { char dummy[2]; };
 | |
|    static false_t dispatch(...);
 | |
|    static true_t  dispatch(U);
 | |
|    static t_reference       trigger();
 | |
|    public:
 | |
|    static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
 | |
| };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //       is_unary_function
 | |
| //////////////////////////////////////
 | |
| #if defined(BOOST_MSVC) || defined(__BORLANDC_)
 | |
| #define BOOST_MOVE_TT_DECL __cdecl
 | |
| #else
 | |
| #define BOOST_MOVE_TT_DECL
 | |
| #endif
 | |
| 
 | |
| #if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__) && !defined(_WIN64) && !defined(_M_ARM) && !defined(UNDER_CE)
 | |
| #define BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
 | |
| #endif
 | |
| 
 | |
| template <typename T>
 | |
| struct is_unary_function_impl
 | |
| {  static const bool value = false; };
 | |
| 
 | |
| // avoid duplicate definitions of is_unary_function_impl
 | |
| #ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
 | |
| 
 | |
| template <typename R>
 | |
| struct is_unary_function_impl<R (*)()>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| template <typename R>
 | |
| struct is_unary_function_impl<R (*)(...)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
 | |
| 
 | |
| template <typename R>
 | |
| struct is_unary_function_impl<R (__stdcall*)()>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #ifndef _MANAGED
 | |
| 
 | |
| template <typename R>
 | |
| struct is_unary_function_impl<R (__fastcall*)()>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| template <typename R>
 | |
| struct is_unary_function_impl<R (__cdecl*)()>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| template <typename R>
 | |
| struct is_unary_function_impl<R (__cdecl*)(...)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| // avoid duplicate definitions of is_unary_function_impl
 | |
| #ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
 | |
| 
 | |
| template <typename R, class T0>
 | |
| struct is_unary_function_impl<R (*)(T0)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| template <typename R, class T0>
 | |
| struct is_unary_function_impl<R (*)(T0...)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
 | |
| 
 | |
| template <typename R, class T0>
 | |
| struct is_unary_function_impl<R (__stdcall*)(T0)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #ifndef _MANAGED
 | |
| 
 | |
| template <typename R, class T0>
 | |
| struct is_unary_function_impl<R (__fastcall*)(T0)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| template <typename R, class T0>
 | |
| struct is_unary_function_impl<R (__cdecl*)(T0)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| template <typename R, class T0>
 | |
| struct is_unary_function_impl<R (__cdecl*)(T0...)>
 | |
| {  static const bool value = true;  };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| template <typename T>
 | |
| struct is_unary_function_impl<T&>
 | |
| {  static const bool value = false; };
 | |
| 
 | |
| template<typename T>
 | |
| struct is_unary_function
 | |
| {  static const bool value = is_unary_function_impl<T>::value;   };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //       has_virtual_destructor
 | |
| //////////////////////////////////////
 | |
| #if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
 | |
|          || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
 | |
| #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
 | |
| #elif defined(BOOST_CLANG) && defined(__has_feature)
 | |
| #  if __has_feature(has_virtual_destructor)
 | |
| #     define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
 | |
| #  endif
 | |
| #elif defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
 | |
| #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
 | |
| #elif defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
 | |
| #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
 | |
| #elif defined(__CODEGEARC__)
 | |
| #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
 | |
| #endif
 | |
| 
 | |
| #ifdef BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR
 | |
|    template<class T>
 | |
|    struct has_virtual_destructor{   static const bool value = BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T);  };
 | |
| #else
 | |
|    //If no intrinsic is available you trust the programmer knows what is doing
 | |
|    template<class T>
 | |
|    struct has_virtual_destructor{   static const bool value = true;  };
 | |
| #endif
 | |
| 
 | |
| //////////////////////////////////////
 | |
| //       missing_virtual_destructor
 | |
| //////////////////////////////////////
 | |
| 
 | |
| template< class T, class U
 | |
|         , bool enable =  is_convertible< U*, T*>::value &&
 | |
|                         !is_array<T>::value &&
 | |
|                         !is_same<typename remove_cv<T>::type, void>::value &&
 | |
|                         !is_same<typename remove_cv<U>::type, typename remove_cv<T>::type>::value
 | |
|         >
 | |
| struct missing_virtual_destructor_default_delete
 | |
| {  static const bool value = !has_virtual_destructor<T>::value;  };
 | |
| 
 | |
| template<class T, class U>
 | |
| struct missing_virtual_destructor_default_delete<T, U, false>
 | |
| {  static const bool value = false;  };
 | |
| 
 | |
| template<class Deleter, class U>
 | |
| struct missing_virtual_destructor
 | |
| {  static const bool value = false;  };
 | |
| 
 | |
| template<class T, class U>
 | |
| struct missing_virtual_destructor< ::boost::movelib::default_delete<T>, U >
 | |
|    : missing_virtual_destructor_default_delete<T, U>
 | |
| {};
 | |
| 
 | |
| }  //namespace move_upmu {
 | |
| }  //namespace boost {
 | |
| 
 | |
| #endif //#ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
 | 
