forked from boostorg/move
Add newer BOOST_MOVE_HAS_NOTHROW_MOVE_CONSTRUCT intrinsics
This commit is contained in:
@@ -65,6 +65,8 @@
|
|||||||
// BOOST_MOVE_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw
|
// BOOST_MOVE_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw
|
||||||
// BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw
|
// BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw
|
||||||
// BOOST_MOVE_IS_ENUM(T) should evaluate to true it t is a union type.
|
// BOOST_MOVE_IS_ENUM(T) should evaluate to true it t is a union type.
|
||||||
|
// BOOST_MOVE_HAS_NOTHROW_MOVE_CONSTRUCT(T) should evaluate to true if T has a non-throwing move constructor.
|
||||||
|
// BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN(T) should evaluate to true if T has a non-throwing move assignment operator.
|
||||||
//
|
//
|
||||||
// The following can also be defined: when detected our implementation is greatly simplified.
|
// The following can also be defined: when detected our implementation is greatly simplified.
|
||||||
//
|
//
|
||||||
@@ -102,6 +104,10 @@
|
|||||||
# define BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) (__has_trivial_move_constructor(T) || ::boost::move_detail::is_pod<T>::value)
|
# define BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) (__has_trivial_move_constructor(T) || ::boost::move_detail::is_pod<T>::value)
|
||||||
# define BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) (__has_trivial_move_assign(T) || ::boost::move_detail::is_pod<T>::value)
|
# define BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) (__has_trivial_move_assign(T) || ::boost::move_detail::is_pod<T>::value)
|
||||||
# endif
|
# endif
|
||||||
|
# if _MSC_FULL_VER >= 180020827
|
||||||
|
# define BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN(T) (__is_nothrow_assignable(T&, T&&))
|
||||||
|
# define BOOST_MOVE_HAS_NOTHROW_MOVE_CONSTRUCT(T) (__is_nothrow_constructible(T, T&&))
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(BOOST_CLANG) && defined(__has_feature)
|
#if defined(BOOST_CLANG) && defined(__has_feature)
|
||||||
@@ -243,13 +249,13 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR
|
#ifdef BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T)
|
#define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR
|
#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)
|
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
||||||
#endif
|
#endif
|
||||||
@@ -263,45 +269,45 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN
|
#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T) BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T)
|
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T) BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR
|
#ifdef BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T)
|
#define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR
|
#ifdef BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR
|
||||||
#define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T)
|
#define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_NOTHROW_COPY
|
#ifdef BOOST_MOVE_HAS_NOTHROW_COPY
|
||||||
#define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_NOTHROW_COPY(T)
|
#define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_NOTHROW_COPY(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T) BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T)
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE
|
|
||||||
#define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_NOTHROW_MOVE(T)
|
|
||||||
#else
|
|
||||||
#define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_NOTHROW_ASSIGN
|
#ifdef BOOST_MOVE_HAS_NOTHROW_ASSIGN
|
||||||
#define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_ASSIGN(T)
|
#define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE_CONSTRUCT
|
||||||
|
#define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_NOTHROW_MOVE_CONSTRUCT(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
|
#else
|
||||||
|
#define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T) BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN
|
#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN
|
||||||
#define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN(T)
|
#define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN(T) || ::boost::move_detail::is_pod<T>::value
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_IS_ENUM
|
#ifdef BOOST_MOVE_IS_ENUM
|
||||||
@@ -852,7 +858,6 @@ struct is_trivially_move_assignable
|
|||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
template<class T>
|
template<class T>
|
||||||
struct is_nothrow_default_constructible
|
struct is_nothrow_default_constructible
|
||||||
: is_pod<T>
|
|
||||||
{ static const bool value = BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T); };
|
{ static const bool value = BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T); };
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
Reference in New Issue
Block a user