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) 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;
}; };
}; };
} }

View File

@ -66,6 +66,7 @@ project
[ run algorithm/zip2.cpp ] [ run algorithm/zip2.cpp ]
[ run algorithm/zip_ignore.cpp ] [ run algorithm/zip_ignore.cpp ]
[ run algorithm/flatten.cpp ] [ run algorithm/flatten.cpp ]
[ compile algorithm/ticket-5490.cpp ]
[ run sequence/as_deque.cpp ] [ run sequence/as_deque.cpp ]
[ run sequence/as_list.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);
}