mirror of
https://github.com/boostorg/move.git
synced 2025-08-02 13:44:28 +02:00
Refactor trivial copy/assign traits. Assume intrinsics don't guarantee the copy constructor/assignment is callable.
This commit is contained in:
@@ -55,8 +55,10 @@
|
|||||||
// BOOST_MOVE_IS_POD(T) should evaluate to true if T is a POD type
|
// BOOST_MOVE_IS_POD(T) should evaluate to true if T is a POD type
|
||||||
// BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if "T x;" has no effect
|
// BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if "T x;" has no effect
|
||||||
// BOOST_MOVE_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy
|
// BOOST_MOVE_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy
|
||||||
|
// (Note: this trait does not guarantee T is copy constructible, the copy constructor could be deleted but still be trivial)
|
||||||
// BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) should evaluate to true if T(boost::move(t)) <==> memcpy
|
// BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) should evaluate to true if T(boost::move(t)) <==> memcpy
|
||||||
// BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy
|
// BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy
|
||||||
|
// (Note: this trait does not guarantee T is assignable , the copy assignmen could be deleted but still be trivial)
|
||||||
// BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) should evaluate to true if t = boost::move(u) <==> memcpy
|
// BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) should evaluate to true if t = boost::move(u) <==> memcpy
|
||||||
// BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect
|
// BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect
|
||||||
// BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if "T x;" can not throw
|
// BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if "T x;" can not throw
|
||||||
@@ -117,9 +119,7 @@
|
|||||||
# define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
|
# define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
|
||||||
# endif
|
# endif
|
||||||
# if __has_feature(has_trivial_copy)
|
# if __has_feature(has_trivial_copy)
|
||||||
# //There are problems with deleted copy constructors detected as trivially copyable.
|
# define BOOST_MOVE_HAS_TRIVIAL_COPY(T) __has_trivial_copy(T)
|
||||||
# //http://stackoverflow.com/questions/12754886/has-trivial-copy-behaves-differently-in-clang-and-gcc-whos-right
|
|
||||||
# define BOOST_MOVE_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && ::boost::move_detail::is_copy_constructible<T>::value)
|
|
||||||
# endif
|
# endif
|
||||||
# if __has_feature(has_trivial_assign)
|
# if __has_feature(has_trivial_assign)
|
||||||
# define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) )
|
# define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) )
|
||||||
@@ -235,7 +235,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_TRIVIAL_COPY
|
#ifdef BOOST_MOVE_HAS_TRIVIAL_COPY
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_COPY(T)
|
#define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value ||\
|
||||||
|
(::boost::move_detail::is_copy_constructible<T>::value &&\
|
||||||
|
BOOST_MOVE_HAS_TRIVIAL_COPY(T))
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
||||||
#endif
|
#endif
|
||||||
@@ -246,12 +248,6 @@
|
|||||||
#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_COPY
|
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) BOOST_MOVE_HAS_TRIVIAL_COPY(T)
|
|
||||||
#else
|
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) ::boost::move_detail::is_pod<T>::value
|
|
||||||
#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)
|
||||||
#else
|
#else
|
||||||
@@ -259,7 +255,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MOVE_HAS_TRIVIAL_ASSIGN
|
#ifdef BOOST_MOVE_HAS_TRIVIAL_ASSIGN
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T)
|
#define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value ||\
|
||||||
|
( ::boost::move_detail::is_copy_assignable<T>::value &&\
|
||||||
|
BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T))
|
||||||
#else
|
#else
|
||||||
#define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
|
#define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
|
||||||
#endif
|
#endif
|
||||||
@@ -821,9 +819,7 @@ struct is_trivially_copy_constructible
|
|||||||
{
|
{
|
||||||
//In several compilers BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE return true even with
|
//In several compilers BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE return true even with
|
||||||
//deleted copy constructors so make sure the type is copy constructible.
|
//deleted copy constructors so make sure the type is copy constructible.
|
||||||
static const bool value = ::boost::move_detail::is_pod<T>::value ||
|
static const bool value = BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T);
|
||||||
( ::boost::move_detail::is_copy_constructible<T>::value &&
|
|
||||||
BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
@@ -831,7 +827,7 @@ struct is_trivially_copy_constructible
|
|||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
template<class T>
|
template<class T>
|
||||||
struct is_trivially_move_constructible
|
struct is_trivially_move_constructible
|
||||||
{ static const bool value = BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T); };
|
{ static const bool value = BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T); };
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
// is_trivially_copy_assignable
|
// is_trivially_copy_assignable
|
||||||
@@ -841,9 +837,7 @@ struct is_trivially_copy_assignable
|
|||||||
{
|
{
|
||||||
//In several compilers BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE return true even with
|
//In several compilers BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE return true even with
|
||||||
//deleted copy constructors so make sure the type is copy constructible.
|
//deleted copy constructors so make sure the type is copy constructible.
|
||||||
static const bool value = ::boost::move_detail::is_pod<T>::value ||
|
static const bool value = BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T);
|
||||||
( ::boost::move_detail::is_copy_assignable<T>::value &&
|
|
||||||
BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
Reference in New Issue
Block a user