From b03d1e9458ea6da0574c96c86378edaa0d101575 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Mon, 7 May 2018 23:17:25 +0900 Subject: [PATCH] Added utility for forcing to be non trivial copyable --- .../support/detail/propagate_trivialness.hpp | 37 ++++ test/Jamfile | 2 + test/support/is_trivially_copyable.cpp | 35 +--- test/support/propagate_trivialness.cpp | 179 ++++++++++++++++++ test/support/trivial.hpp | 56 ++++++ 5 files changed, 275 insertions(+), 34 deletions(-) create mode 100644 include/boost/fusion/support/detail/propagate_trivialness.hpp create mode 100644 test/support/propagate_trivialness.cpp create mode 100644 test/support/trivial.hpp diff --git a/include/boost/fusion/support/detail/propagate_trivialness.hpp b/include/boost/fusion/support/detail/propagate_trivialness.hpp new file mode 100644 index 00000000..fdb6b57a --- /dev/null +++ b/include/boost/fusion/support/detail/propagate_trivialness.hpp @@ -0,0 +1,37 @@ +/*============================================================================= + Copyright (c) 2018 Kohei Takahashi + + 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) +==============================================================================*/ +#ifndef BOOST_FUSION_SUPPORT_DETAIL_PROPAGATE_TRIVIALNESS +#define BOOST_FUSION_SUPPORT_DETAIL_PROPAGATE_TRIVIALNESS + +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace detail +{ + +struct trivial_base { }; + +struct non_trivial_base +{ + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + non_trivial_base(non_trivial_base const&) BOOST_NOEXCEPT { } +}; + +template +struct propagate_trivialness + : mpl::if_c...>::value + , trivial_base + , non_trivial_base + >::type +{ }; + +}}} // namespace boost::fusion::detail + +#endif + diff --git a/test/Jamfile b/test/Jamfile index 00e7208b..1cdb9d53 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -269,6 +269,8 @@ project [ compile support/tag_of.cpp ] [ compile support/unused.cpp ] [ compile support/is_trivially_copyable.cpp ] + [ compile support/propagate_trivialness.cpp + : [ requires cxx11_variadic_templates ] ] # [ compile-fail xxx.cpp ] diff --git a/test/support/is_trivially_copyable.cpp b/test/support/is_trivially_copyable.cpp index d4c4ce84..38f1d6e5 100644 --- a/test/support/is_trivially_copyable.cpp +++ b/test/support/is_trivially_copyable.cpp @@ -8,18 +8,7 @@ #include #include - -#ifndef BOOST_FUSION_DETAIL_VOLATILE_SCALAR_IS_NON_TRIVIALLY_COPYABLE -# define BOOST_FUSION_ASSERT_WA BOOST_MPL_ASSERT -#else -# define BOOST_FUSION_ASSERT_WA BOOST_MPL_ASSERT_NOT -#endif - -#ifdef BOOST_FUSION_DETAIL_IS_TRIVIALLY_COPYABLE_CONFORMING -# define BOOST_FUSION_ASSERT_FALLBACK BOOST_MPL_ASSERT -#else -# define BOOST_FUSION_ASSERT_FALLBACK(cond) BOOST_MPL_ASSERT((mpl::true_)) -#endif +#include "trivial.hpp" using namespace boost; using namespace boost::fusion::detail; @@ -81,9 +70,6 @@ BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); #endif -struct S; -typedef int (S::*member_type); -typedef int (S::*member_function_type)(); BOOST_MPL_ASSERT((is_trivially_copyable)); BOOST_MPL_ASSERT((is_trivially_copyable)); @@ -96,8 +82,6 @@ BOOST_FUSION_ASSERT_WA((is_trivially_copyable)); BOOST_FUSION_ASSERT_WA((is_trivially_copyable)); -struct trivial { }; - BOOST_FUSION_ASSERT_FALLBACK((is_trivially_copyable)); BOOST_FUSION_ASSERT_FALLBACK((is_trivially_copyable)); BOOST_FUSION_ASSERT_FALLBACK((is_trivially_copyable)); @@ -124,12 +108,6 @@ BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); #endif -struct user_provided_copy -{ - user_provided_copy(user_provided_copy const&); - user_provided_copy& operator=(user_provided_copy const&); -}; - BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); @@ -157,12 +135,6 @@ BOOST_MPL_ASSERT_NOT((is_trivially_copyable #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES -struct user_provided_move -{ - user_provided_move(user_provided_move const&); - user_provided_move& operator=(user_provided_move const&); -}; - BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); @@ -188,11 +160,6 @@ BOOST_MPL_ASSERT_NOT((is_trivially_copyable #endif -struct user_provided_dtor -{ - ~user_provided_dtor(); -}; - BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); diff --git a/test/support/propagate_trivialness.cpp b/test/support/propagate_trivialness.cpp new file mode 100644 index 00000000..e4d90af2 --- /dev/null +++ b/test/support/propagate_trivialness.cpp @@ -0,0 +1,179 @@ +/*============================================================================= + Copyright (c) 2018 Kohei Takahashi + + 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) +==============================================================================*/ + +#include +#include +#include +#include +#include +#include +#include "trivial.hpp" + +using namespace boost; +using namespace boost::fusion::detail; + + +BOOST_FUSION_ASSERT_FALLBACK((is_trivially_copyable)); +BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); + +BOOST_MPL_ASSERT((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +#endif + + +BOOST_FUSION_ASSERT_FALLBACK((is_base_of >)); +BOOST_FUSION_ASSERT_FALLBACK((is_base_of >)); +BOOST_FUSION_ASSERT_FALLBACK((is_base_of >)); +BOOST_FUSION_ASSERT_FALLBACK((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +#endif + + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +#endif + + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +#endif + + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); +BOOST_FUSION_ASSERT_WA((is_base_of >)); + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +#endif + + +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_FUSION_ASSERT_FALLBACK((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); +BOOST_MPL_ASSERT((is_base_of >)); + + +struct S1 : private propagate_trivialness { }; +BOOST_MPL_ASSERT((is_trivially_copyable)); + +struct S2 : private propagate_trivialness { }; +BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); + +struct S3 : private propagate_trivialness { }; +BOOST_FUSION_ASSERT_FALLBACK((is_trivially_copyable)); + +struct S4 : private propagate_trivialness { }; +BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); + +struct S5 : private propagate_trivialness { }; +BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); + +struct S6 : private propagate_trivialness { }; +BOOST_MPL_ASSERT_NOT((is_trivially_copyable)); diff --git a/test/support/trivial.hpp b/test/support/trivial.hpp new file mode 100644 index 00000000..77c14905 --- /dev/null +++ b/test/support/trivial.hpp @@ -0,0 +1,56 @@ +/*============================================================================= + Copyright (c) 2018 Kohei Takahashi + + 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) +==============================================================================*/ +#ifndef TRIVIAL_HPP +#define TRIVIAL_HPP + +#include +#include + +#ifndef BOOST_FUSION_DETAIL_VOLATILE_SCALAR_IS_NON_TRIVIALLY_COPYABLE +# define BOOST_FUSION_ASSERT_WA BOOST_MPL_ASSERT +#else +# define BOOST_FUSION_ASSERT_WA BOOST_MPL_ASSERT_NOT +#endif + +#ifdef BOOST_FUSION_DETAIL_IS_TRIVIALLY_COPYABLE_CONFORMING +# define BOOST_FUSION_ASSERT_FALLBACK BOOST_MPL_ASSERT +#else +# define BOOST_FUSION_ASSERT_FALLBACK(cond) BOOST_MPL_ASSERT((mpl::true_)) +#endif + + +struct S; +typedef int (S::*member_type); +typedef int (S::*member_function_type)(); + + +struct trivial { }; + + +struct user_provided_copy +{ + user_provided_copy(user_provided_copy const&); + user_provided_copy& operator=(user_provided_copy const&); +}; + + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +struct user_provided_move +{ + user_provided_move(user_provided_move const&); + user_provided_move& operator=(user_provided_move const&); +}; +#endif + + +struct user_provided_dtor +{ + ~user_provided_dtor(); +}; + +#endif +