Merge pull request #186 from boostorg/bugfix/apply

Fixed unintentional MPL substitution in transform_view
This commit is contained in:
Kohei Takahashi
2018-07-07 08:11:15 +09:00
committed by GitHub
7 changed files with 69 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) 2005-2006 Dan Marsden
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)
@ -9,9 +10,8 @@
#define BOOST_FUSION_AT_IMPL_20061029_1946
#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/utility/result_of.hpp>
namespace boost { namespace fusion {
struct transform_view_tag;
@ -29,9 +29,8 @@ namespace boost { namespace fusion {
struct apply
{
typedef typename Seq::transform_type F;
typedef detail::apply_transform_result<F> transform_type;
typedef typename boost::fusion::result_of::at<typename Seq::sequence_type, N>::type value_type;
typedef typename mpl::apply<transform_type, value_type>::type type;
typedef typename result_of::at<typename Seq::sequence_type, N>::type value_type;
typedef typename boost::result_of<F(value_type)>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type call(Seq& seq)
@ -48,10 +47,9 @@ namespace boost { namespace fusion {
struct apply
{
typedef typename Seq::transform_type F;
typedef detail::apply_transform_result<F> transform_type;
typedef typename boost::fusion::result_of::at<typename Seq::sequence1_type, N>::type value1_type;
typedef typename boost::fusion::result_of::at<typename Seq::sequence2_type, N>::type value2_type;
typedef typename mpl::apply<transform_type, value1_type, value2_type>::type type;
typedef typename 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::result_of<F(value1_type, value2_type)>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type call(Seq& seq)

View File

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

View File

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

View File

@ -1,5 +1,6 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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)
@ -8,9 +9,8 @@
#define FUSION_VALUE_OF_IMPL_07162005_1030
#include <boost/fusion/support/config.hpp>
#include <boost/mpl/apply.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
{
@ -33,8 +33,8 @@ namespace boost { namespace fusion
result_of::value_of<typename Iterator::first_type>::type
value_type;
typedef detail::apply_transform_result<typename Iterator::transform_type> transform_type;
typedef typename mpl::apply<transform_type, value_type>::type type;
typedef typename Iterator::transform_type F;
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
value2_type;
typedef detail::apply_transform_result<typename Iterator::transform_type> transform_type;
typedef typename mpl::apply<transform_type, value1_type, value2_type>::type type;
typedef typename Iterator::transform_type F;
typedef typename boost::result_of<F(value1_type, value2_type)>::type type;
};
};
}

View File

@ -66,6 +66,7 @@ project
[ run algorithm/zip2.cpp ]
[ run algorithm/zip_ignore.cpp ]
[ run algorithm/flatten.cpp ]
[ compile algorithm/ticket-5490.cpp ]
[ run sequence/as_deque.cpp ]
[ run sequence/as_list.cpp ]

View File

@ -0,0 +1,41 @@
/*=============================================================================
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/fusion/include/vector.hpp>
#include <boost/fusion/include/transform.hpp>
#include <boost/mpl/quote.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/core/ignore_unused.hpp>
using namespace boost::fusion;
template <typename>
struct predicate {};
struct unique {};
template <typename>
struct meta_func
{
typedef unique result_type;
template <typename T>
unique operator()(const T&) const;
};
int main()
{
vector<int> v;
typedef predicate<boost::mpl::_1> lambda_t;
typedef boost::mpl::quote1<predicate> quote_t;
vector<unique> l = transform(v, meta_func<lambda_t>());
vector<unique> q = transform(v, meta_func<quote_t>());
boost::ignore_unused(l, q);
}