transform: Stopped use of mpl::apply

it causes unintended MPL substitution
This commit is contained in:
Kohei Takahashi
2018-07-07 01:06:05 +09:00
parent 561890429b
commit c6448b9e45
5 changed files with 27 additions and 70 deletions

View File

@ -1,38 +0,0 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2007 Dan Marsden
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(BOOST_FUSION_APPLY_TRANSFORM_RESULT_02092006_1936)
#define BOOST_FUSION_APPLY_TRANSFORM_RESULT_02092006_1936
#include <boost/fusion/support/config.hpp>
#include <boost/utility/result_of.hpp>
namespace boost { namespace fusion
{
struct void_;
namespace detail
{
template <typename F>
struct apply_transform_result
{
template <typename T0, typename T1 = void_>
struct apply
: boost::result_of<F(T0, T1)>
{};
template <typename T0>
struct apply<T0, void_>
: boost::result_of<F(T0)>
{};
};
}
}}
#endif

View File

@ -1,6 +1,7 @@
/*============================================================================= /*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden Copyright (c) 2005-2006 Dan Marsden
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)
@ -9,9 +10,8 @@
#define BOOST_FUSION_AT_IMPL_20061029_1946 #define BOOST_FUSION_AT_IMPL_20061029_1946
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/fusion/view/transform_view/detail/apply_transform_result.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp> #include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/utility/result_of.hpp>
namespace boost { namespace fusion { namespace boost { namespace fusion {
struct transform_view_tag; struct transform_view_tag;
@ -29,9 +29,8 @@ namespace boost { namespace fusion {
struct apply struct apply
{ {
typedef typename Seq::transform_type F; typedef typename Seq::transform_type F;
typedef detail::apply_transform_result<F> transform_type; typedef typename result_of::at<typename Seq::sequence_type, N>::type value_type;
typedef typename boost::fusion::result_of::at<typename Seq::sequence_type, N>::type value_type; typedef typename boost::result_of<F(value_type)>::type type;
typedef typename mpl::apply<transform_type, value_type>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type call(Seq& seq) static type call(Seq& seq)
@ -48,10 +47,9 @@ namespace boost { namespace fusion {
struct apply struct apply
{ {
typedef typename Seq::transform_type F; typedef typename Seq::transform_type F;
typedef detail::apply_transform_result<F> transform_type; typedef typename result_of::at<typename Seq::sequence1_type, N>::type value1_type;
typedef typename boost::fusion::result_of::at<typename Seq::sequence1_type, N>::type value1_type; typedef typename result_of::at<typename Seq::sequence2_type, N>::type value2_type;
typedef typename boost::fusion::result_of::at<typename Seq::sequence2_type, N>::type value2_type; typedef typename boost::result_of<F(value1_type, value2_type)>::type type;
typedef typename mpl::apply<transform_type, value1_type, value2_type>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type call(Seq& seq) static type call(Seq& seq)

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)
@ -8,10 +9,8 @@
#define FUSION_DEREF_IMPL_07162005_1026 #define FUSION_DEREF_IMPL_07162005_1026
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/fusion/iterator/deref.hpp> #include <boost/fusion/iterator/deref.hpp>
#include <boost/fusion/iterator/value_of.hpp> #include <boost/utility/result_of.hpp>
#include <boost/fusion/view/transform_view/detail/apply_transform_result.hpp>
namespace boost { namespace fusion namespace boost { namespace fusion
{ {
@ -34,8 +33,8 @@ namespace boost { namespace fusion
result_of::deref<typename Iterator::first_type>::type result_of::deref<typename Iterator::first_type>::type
value_type; value_type;
typedef detail::apply_transform_result<typename Iterator::transform_type> transform_type; typedef typename Iterator::transform_type F;
typedef typename mpl::apply<transform_type, value_type>::type type; typedef typename boost::result_of<F(value_type)>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type static type
@ -60,8 +59,8 @@ namespace boost { namespace fusion
result_of::deref<typename Iterator::first2_type>::type result_of::deref<typename Iterator::first2_type>::type
value2_type; value2_type;
typedef detail::apply_transform_result<typename Iterator::transform_type> transform_type; typedef typename Iterator::transform_type F;
typedef typename mpl::apply<transform_type, value1_type, value2_type>::type type; typedef typename boost::result_of<F(value1_type, value2_type)>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type static type
@ -70,7 +69,7 @@ namespace boost { namespace fusion
return i.f(*i.first1, *i.first2); return i.f(*i.first1, *i.first2);
} }
}; };
}; };
} }
}} }}

View File

@ -1,6 +1,7 @@
/*============================================================================= /*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden Copyright (c) 2005-2006 Dan Marsden
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)
@ -9,9 +10,8 @@
#define BOOST_FUSION_VALUE_AT_IMPL_20061101_0745 #define BOOST_FUSION_VALUE_AT_IMPL_20061101_0745
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/fusion/view/transform_view/detail/apply_transform_result.hpp>
#include <boost/fusion/sequence/intrinsic/value_at.hpp> #include <boost/fusion/sequence/intrinsic/value_at.hpp>
#include <boost/utility/result_of.hpp>
namespace boost { namespace fusion { namespace boost { namespace fusion {
struct transform_view_tag; struct transform_view_tag;
@ -29,9 +29,8 @@ namespace boost { namespace fusion {
struct apply struct apply
{ {
typedef typename Seq::transform_type F; typedef typename Seq::transform_type F;
typedef detail::apply_transform_result<F> transform_type; typedef typename result_of::value_at<typename Seq::sequence_type, N>::type value_type;
typedef typename boost::fusion::result_of::value_at<typename Seq::sequence_type, N>::type value_type; typedef typename boost::result_of<F(value_type)>::type type;
typedef typename mpl::apply<transform_type, value_type>::type type;
}; };
}; };
@ -42,10 +41,9 @@ namespace boost { namespace fusion {
struct apply struct apply
{ {
typedef typename Seq::transform_type F; typedef typename Seq::transform_type F;
typedef detail::apply_transform_result<F> transform_type; typedef typename result_of::value_at<typename Seq::sequence1_type, N>::type value1_type;
typedef typename boost::fusion::result_of::value_at<typename Seq::sequence1_type, N>::type value1_type; typedef typename result_of::value_at<typename Seq::sequence2_type, N>::type value2_type;
typedef typename boost::fusion::result_of::value_at<typename Seq::sequence2_type, N>::type value2_type; typedef typename boost::result_of<F(value1_type, value2_type)>::type type;
typedef typename mpl::apply<transform_type, value1_type, value2_type>::type type;
}; };
}; };
} }

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)
@ -8,9 +9,8 @@
#define FUSION_VALUE_OF_IMPL_07162005_1030 #define FUSION_VALUE_OF_IMPL_07162005_1030
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/fusion/iterator/value_of.hpp> #include <boost/fusion/iterator/value_of.hpp>
#include <boost/fusion/view/transform_view/detail/apply_transform_result.hpp> #include <boost/utility/result_of.hpp>
namespace boost { namespace fusion namespace boost { namespace fusion
{ {
@ -33,8 +33,8 @@ namespace boost { namespace fusion
result_of::value_of<typename Iterator::first_type>::type result_of::value_of<typename Iterator::first_type>::type
value_type; value_type;
typedef detail::apply_transform_result<typename Iterator::transform_type> transform_type; typedef typename Iterator::transform_type F;
typedef typename mpl::apply<transform_type, value_type>::type type; typedef typename boost::result_of<F(value_type)>::type type;
}; };
}; };
@ -52,8 +52,8 @@ namespace boost { namespace fusion
result_of::value_of<typename Iterator::first2_type>::type result_of::value_of<typename Iterator::first2_type>::type
value2_type; value2_type;
typedef detail::apply_transform_result<typename Iterator::transform_type> transform_type; typedef typename Iterator::transform_type F;
typedef typename mpl::apply<transform_type, value1_type, value2_type>::type type; typedef typename boost::result_of<F(value1_type, value2_type)>::type type;
}; };
}; };
} }