Merge pull request #179 from boostorg/support

Reorganize support facility to simplify
This commit is contained in:
Kohei Takahashi
2018-04-28 00:21:06 +09:00
committed by GitHub
13 changed files with 161 additions and 101 deletions

View File

@ -8,7 +8,6 @@
#define FUSION_CATEGORY_OF_07202005_0308 #define FUSION_CATEGORY_OF_07202005_0308
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/detail/category_of.hpp>
#include <boost/fusion/support/tag_of.hpp> #include <boost/fusion/support/tag_of.hpp>
#include <boost/type_traits/is_base_of.hpp> #include <boost/type_traits/is_base_of.hpp>
@ -44,7 +43,10 @@ namespace boost { namespace fusion
struct category_of_impl struct category_of_impl
{ {
template<typename T> template<typename T>
struct apply : detail::fusion_category_of<T> {}; struct apply
{
typedef typename T::category type;
};
}; };
template <> template <>

View File

@ -1,6 +1,6 @@
/*============================================================================= /*=============================================================================
Copyright (c) 2014 Eric Niebler Copyright (c) 2014 Eric Niebler
Copyright (c) 2014,2018 Kohei Takahashi Copyright (c) 2014,2015,2018 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying 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) file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@ -108,4 +108,12 @@ namespace std
decltype parenthesized_expr ::type decltype parenthesized_expr ::type
#endif #endif
// Workaround for GCC 4.6 that rejects defaulted function with noexcept.
#if BOOST_WORKAROUND(BOOST_GCC, / 100 == 406)
# define BOOST_FUSION_NOEXCEPT_ON_DEFAULTED
#else
# define BOOST_FUSION_NOEXCEPT_ON_DEFAULTED BOOST_NOEXCEPT
#endif
#endif #endif

View File

@ -1,5 +1,6 @@
/*============================================================================= /*=============================================================================
Copyright (c) 2016 Lee Clagett Copyright (c) 2016 Lee Clagett
Copyright (c) 2018 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying 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) file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@ -8,6 +9,7 @@
#define FUSION_AND_07152016_1625 #define FUSION_AND_07152016_1625
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/config/workaround.hpp>
#include <boost/type_traits/integral_constant.hpp> #include <boost/type_traits/integral_constant.hpp>
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
@ -15,6 +17,8 @@
#endif #endif
namespace boost { namespace fusion { namespace detail { namespace boost { namespace fusion { namespace detail {
#if defined(BOOST_NO_CXX17_FOLD_EXPRESSIONS) \
|| BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1913))
template<typename ...Cond> template<typename ...Cond>
struct and_impl : false_type {}; struct and_impl : false_type {};
@ -34,6 +38,10 @@ namespace boost { namespace fusion { namespace detail {
recursive. */ recursive. */
template<typename ...Cond> template<typename ...Cond>
struct and_ : and_impl1<Cond::value...> {}; struct and_ : and_impl1<Cond::value...> {};
#else
template <typename ...Cond>
struct and_ : integral_constant<bool, ((bool)Cond::value && ...)> {};
#endif
}}} }}}
#endif // FUSION_AND_07152016_1625 #endif // FUSION_AND_07152016_1625

View File

@ -1,19 +0,0 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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)
==============================================================================*/
#if !defined(FUSION_CATEGORY_OF_07212005_1025)
#define FUSION_CATEGORY_OF_07212005_1025
namespace boost { namespace fusion { namespace detail
{
template <typename T>
struct fusion_category_of
{
typedef typename T::category type;
};
}}}
#endif

View File

@ -9,19 +9,17 @@
#define FUSION_DETAIL_IS_MPL_SEQUENCE_29122006_1105 #define FUSION_DETAIL_IS_MPL_SEQUENCE_29122006_1105
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/support/detail/is_native_fusion_sequence.hpp>
#include <boost/mpl/is_sequence.hpp> #include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/and.hpp> #include <boost/mpl/and.hpp>
#include <boost/mpl/not.hpp> #include <boost/mpl/not.hpp>
#include <boost/type_traits/is_complete.hpp>
#include <boost/type_traits/is_convertible.hpp>
namespace boost { namespace fusion { namespace detail namespace boost { namespace fusion { namespace detail
{ {
template <typename T> template <typename T>
struct is_mpl_sequence struct is_mpl_sequence
: mpl::and_< : mpl::and_<
mpl::not_<mpl::and_<is_complete<T>, is_convertible<T, from_sequence_convertible_type> > > mpl::not_<is_native_fusion_sequence<T> >
, mpl::is_sequence<T> > , mpl::is_sequence<T> >
{}; {};
}}} }}}

View File

@ -0,0 +1,27 @@
/*=============================================================================
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_IS_NATIVE_FUSION_SEQUENCE
#define BOOST_FUSION_IS_NATIVE_FUSION_SEQUENCE
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/sequence_base.hpp>
#include <boost/mpl/and.hpp>
#include <boost/type_traits/is_complete.hpp>
#include <boost/type_traits/is_convertible.hpp>
namespace boost { namespace fusion { namespace detail
{
template <typename Sequence>
struct is_native_fusion_sequence
: mpl::and_<
is_complete<Sequence>
, is_convertible<Sequence, detail::from_sequence_convertible_type>
>
{};
}}}
#endif

View File

@ -1,19 +0,0 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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)
==============================================================================*/
#if !defined(FUSION_IS_VIEW_03202006_0018)
#define FUSION_IS_VIEW_03202006_0018
namespace boost { namespace fusion { namespace detail
{
template <typename T>
struct fusion_is_view
{
typedef typename T::is_view type;
};
}}}
#endif

View File

@ -1,16 +0,0 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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)
==============================================================================*/
#if !defined(FUSION_UNKNOWN_KEY_09242005_1219)
#define FUSION_UNKNOWN_KEY_09242005_1219
namespace boost { namespace fusion { namespace detail
{
template <int index>
struct unknown_key {};
}}}
#endif

View File

@ -10,13 +10,10 @@
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/support/tag_of.hpp> #include <boost/fusion/support/tag_of.hpp>
#include <boost/mpl/and.hpp> #include <boost/fusion/support/detail/is_native_fusion_sequence.hpp>
#include <boost/mpl/bool.hpp> #include <boost/mpl/bool.hpp>
#include <boost/mpl/is_sequence.hpp> #include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/or.hpp>
#include <boost/type_traits/is_complete.hpp>
#include <boost/type_traits/is_convertible.hpp> #include <boost/type_traits/is_convertible.hpp>
#include <boost/type_traits/is_same.hpp>
namespace boost { namespace fusion namespace boost { namespace fusion
{ {
@ -69,13 +66,7 @@ namespace boost { namespace fusion
> >
{}; {};
template <typename Sequence, typename Enable = void> using detail::is_native_fusion_sequence;
struct is_native_fusion_sequence
: mpl::and_<
is_complete<Sequence>,
is_convertible<Sequence, fusion::detail::from_sequence_convertible_type>
>
{};
} }
}} }}

View File

@ -9,7 +9,6 @@
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/mpl/bool.hpp> #include <boost/mpl/bool.hpp>
#include <boost/fusion/support/detail/is_view.hpp>
#include <boost/fusion/support/tag_of.hpp> #include <boost/fusion/support/tag_of.hpp>
namespace boost { namespace fusion namespace boost { namespace fusion
@ -28,8 +27,9 @@ namespace boost { namespace fusion
{ {
template <typename T> template <typename T>
struct apply struct apply
: detail::fusion_is_view<T> {
{}; typedef typename T::is_view type;
};
}; };
template <> template <>

View File

@ -1,5 +1,6 @@
/*============================================================================= /*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2018 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying 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) file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@ -10,7 +11,6 @@
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <iosfwd> #include <iosfwd>
#include <boost/config.hpp>
#if defined(BOOST_MSVC) #if defined(BOOST_MSVC)
# pragma warning(push) # pragma warning(push)
# pragma warning(disable: 4522) // multiple assignment operators specified warning # pragma warning(disable: 4522) // multiple assignment operators specified warning
@ -23,9 +23,16 @@ namespace boost { namespace fusion
struct unused_type struct unused_type
{ {
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
unused_type() BOOST_NOEXCEPT BOOST_DEFAULTED_FUNCTION(
unused_type() BOOST_FUSION_NOEXCEPT_ON_DEFAULTED,
{ {
} })
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
BOOST_DEFAULTED_FUNCTION(
unused_type(unused_type const&) BOOST_FUSION_NOEXCEPT_ON_DEFAULTED,
{
})
template <typename T> template <typename T>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
@ -33,35 +40,12 @@ namespace boost { namespace fusion
{ {
} }
template <typename T>
BOOST_FUSION_CONSTEXPR_THIS BOOST_FUSION_GPU_ENABLED
unused_type const&
operator=(T const&) const BOOST_NOEXCEPT
{
return *this;
}
template <typename T>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
unused_type&
operator=(T const&) BOOST_NOEXCEPT
{
return *this;
}
BOOST_FUSION_CONSTEXPR_THIS BOOST_FUSION_GPU_ENABLED BOOST_FUSION_CONSTEXPR_THIS BOOST_FUSION_GPU_ENABLED
unused_type const& unused_type const&
operator=(unused_type const&) const BOOST_NOEXCEPT operator=(unused_type const&) const BOOST_NOEXCEPT
{ {
return *this; return *this;
} }
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
unused_type&
operator=(unused_type const&) BOOST_NOEXCEPT
{
return *this;
}
}; };
BOOST_CONSTEXPR_OR_CONST unused_type unused = unused_type(); BOOST_CONSTEXPR_OR_CONST unused_type unused = unused_type();

View File

@ -267,6 +267,7 @@ project
[ compile support/and.cpp [ compile support/and.cpp
: [ requires cxx11_variadic_templates ] ] : [ requires cxx11_variadic_templates ] ]
[ compile support/tag_of.cpp ] [ compile support/tag_of.cpp ]
[ compile support/unused.cpp ]
# [ compile-fail xxx.cpp ] # [ compile-fail xxx.cpp ]

95
test/support/unused.cpp Normal file
View File

@ -0,0 +1,95 @@
/*=============================================================================
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 <boost/config.hpp>
#include <boost/fusion/support/unused.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/static_assert.hpp>
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
#include <utility>
#endif
struct T { };
void unused_construction()
{
boost::fusion::unused_type dephault;
boost::fusion::unused_type BOOST_ATTRIBUTE_UNUSED parenthesis();
#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
boost::fusion::unused_type BOOST_ATTRIBUTE_UNUSED brace{};
boost::fusion::unused_type BOOST_ATTRIBUTE_UNUSED list_copy = {};
#endif
boost::fusion::unused_type copy_copy BOOST_ATTRIBUTE_UNUSED = dephault;
boost::fusion::unused_type copy_direct BOOST_ATTRIBUTE_UNUSED (dephault);
#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
boost::fusion::unused_type copy_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {dephault};
boost::fusion::unused_type copy_direct_brace BOOST_ATTRIBUTE_UNUSED {dephault};
#endif
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
boost::fusion::unused_type move_copy BOOST_ATTRIBUTE_UNUSED = std::move(dephault);
boost::fusion::unused_type move_direct BOOST_ATTRIBUTE_UNUSED (std::move(dephault));
#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
boost::fusion::unused_type move_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {std::move(dephault)};
boost::fusion::unused_type move_direct_brace BOOST_ATTRIBUTE_UNUSED {std::move(dephault)};
#endif
#endif
T value;
boost::fusion::unused_type T_copy_copy BOOST_ATTRIBUTE_UNUSED = value;
boost::fusion::unused_type T_copy_direct BOOST_ATTRIBUTE_UNUSED (value);
#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
boost::fusion::unused_type T_copy_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {value};
boost::fusion::unused_type T_copy_direct_brace BOOST_ATTRIBUTE_UNUSED {value};
#endif
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
boost::fusion::unused_type T_move_copy BOOST_ATTRIBUTE_UNUSED = std::move(value);
boost::fusion::unused_type T_move_direct BOOST_ATTRIBUTE_UNUSED (std::move(value));
#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
boost::fusion::unused_type T_move_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {std::move(value)};
boost::fusion::unused_type T_move_direct_brace BOOST_ATTRIBUTE_UNUSED {std::move(value)};
#endif
#endif
}
void unused_assignment()
{
boost::fusion::unused_type val1, val2;
val1 = val2;
#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
val1 = {};
#endif
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
val1 = std::move(val2);
#endif
T value;
val1 = value;
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
val1 = std::move(value);
#endif
}
boost::type_traits::yes_type test_unused(boost::fusion::detail::unused_only const&);
boost::type_traits::no_type test_unused(...);
void only_unused()
{
BOOST_STATIC_ASSERT((sizeof(test_unused(boost::fusion::unused)) == sizeof(boost::type_traits::yes_type)));
BOOST_STATIC_ASSERT((sizeof(test_unused(0)) == sizeof(boost::type_traits::no_type)));
boost::fusion::unused_type my_unused;
BOOST_STATIC_ASSERT((sizeof(test_unused(my_unused)) == sizeof(boost::type_traits::yes_type)));
}