You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
73 lines
2.4 KiB
73 lines
2.4 KiB
// (C) Copyright Thorsten Ottosen 2005 |
|
// (C) Copyright Howard Hinnant 2004 |
|
// (C) Copyright Jonathan Turkanis 2004 |
|
// 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.) |
|
|
|
// |
|
// Contains type traits machinery for incomplete arrays. MPL compatibility |
|
// is included for completeness, but is not necessary for the current |
|
// application. |
|
// |
|
|
|
#ifndef BOOST_MOVE_PTR_ARRAYS_HPP_INCLUDED |
|
#define BOOST_MOVE_PTR_ARRAYS_HPP_INCLUDED |
|
|
|
#include <boost/config.hpp> // BOOST_STATIC_CONSTANT. |
|
#include <boost/mpl/aux_/lambda_support.hpp> |
|
#include <boost/mpl/and.hpp> |
|
#include <boost/mpl/bool.hpp> |
|
#include <boost/mpl/identity.hpp> |
|
#include <boost/mpl/if.hpp> |
|
#include <boost/type_traits/is_array.hpp> |
|
#include <boost/type_traits/is_convertible.hpp> |
|
#include <boost/type_traits/is_same.hpp> |
|
#include <boost/type_traits/remove_bounds.hpp> |
|
#include <boost/type_traits/remove_cv.hpp> |
|
#include <boost/utility/enable_if.hpp> |
|
|
|
namespace boost { namespace ptr_container_detail { namespace move_ptrs { |
|
|
|
// From Howard Hinnant. |
|
template<typename T, typename U> |
|
struct is_array_convertible { |
|
typedef typename remove_bounds<T>::type t_element; |
|
typedef typename remove_bounds<U>::type u_element; |
|
typedef typename remove_cv<t_element>::type t_base; |
|
typedef typename remove_cv<u_element>::type u_base; |
|
typedef typename |
|
mpl::and_< |
|
is_array<T>, |
|
is_array<U>, |
|
is_same<t_base, u_base>, |
|
is_convertible<t_element*, u_element*> |
|
>::type type; |
|
BOOST_STATIC_CONSTANT(bool, value = type::value); |
|
BOOST_MPL_AUX_LAMBDA_SUPPORT(2, is_array_convertible, (T, U)) |
|
}; |
|
|
|
template<typename T, typename U> |
|
struct is_smart_ptr_convertible |
|
: mpl::if_< |
|
is_array<T>, |
|
is_array_convertible<T, U>, |
|
is_convertible<T*, U*> |
|
>::type |
|
{ }; |
|
|
|
#ifndef BOOST_NO_SFINAE |
|
template<typename Src, typename Tgt, typename T = void> |
|
struct enable_if_convertible |
|
: enable_if< |
|
is_smart_ptr_convertible<Src, Tgt>, |
|
T |
|
> |
|
{ }; |
|
#else |
|
template<typename Src, typename Tgt, class T > |
|
struct enable_if_convertible : mpl::identity<T> { }; |
|
#endif |
|
|
|
} } } // End namespaces ptr_container_detail, move_ptrs, boost. |
|
|
|
#endif // #ifndef BOOST_MOVE_PTR_ARRAYS_HPP_INCLUDED
|
|
|