|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r70214 - in trunk/boost/spirit/home: qi/detail support
From: hartmut.kaiser_at_[hidden]
Date: 2011-03-19 22:06:27
Author: hkaiser
Date: 2011-03-19 22:06:25 EDT (Sat, 19 Mar 2011)
New Revision: 70214
URL: http://svn.boost.org/trac/boost/changeset/70214
Log:
Spirit: adding a workaround for strange behavior of fusion::vector, which is default constructible from any single type as long as that is convertible to the first type in the vector.
Text files modified:
trunk/boost/spirit/home/qi/detail/pass_container.hpp | 9 +++++----
trunk/boost/spirit/home/support/attributes.hpp | 19 +++++++++++++++----
2 files changed, 20 insertions(+), 8 deletions(-)
Modified: trunk/boost/spirit/home/qi/detail/pass_container.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/detail/pass_container.hpp (original)
+++ trunk/boost/spirit/home/qi/detail/pass_container.hpp 2011-03-19 22:06:25 EDT (Sat, 19 Mar 2011)
@@ -30,8 +30,9 @@
template <typename Sequence, typename Attribute, typename ValueType>
struct negate_weak_substitute_if_not
: mpl::if_<
- Sequence, traits::is_weak_substitute<Attribute, ValueType>
- , mpl::not_<traits::is_weak_substitute<Attribute, ValueType> > >
+ Sequence
+ , typename traits::is_weak_substitute<Attribute, ValueType>::type
+ , typename mpl::not_<traits::is_weak_substitute<Attribute, ValueType> >::type>
{};
// pass_through_container: utility to check decide whether a provided
@@ -134,8 +135,8 @@
Container, ValueType, Attribute, Sequence
, typename enable_if<traits::is_container<Attribute> >::type>
: detail::pass_through_container_container<
- Container, ValueType, Attribute, Sequence
- , typename traits::container_value<Attribute>::type>
+ Container, ValueType, Attribute, Sequence
+ , typename traits::container_value<Attribute>::type>
{};
// Specialization for exposed optional attributes
Modified: trunk/boost/spirit/home/support/attributes.hpp
==============================================================================
--- trunk/boost/spirit/home/support/attributes.hpp (original)
+++ trunk/boost/spirit/home/support/attributes.hpp 2011-03-19 22:06:25 EDT (Sat, 19 Mar 2011)
@@ -114,11 +114,23 @@
mpl::and_<
fusion::traits::is_sequence<T>,
fusion::traits::is_sequence<Expected>,
- mpl::equal<T, Expected, is_weak_substitute<mpl::_1, mpl::_2> >
- >
+ mpl::equal<T, Expected, is_weak_substitute<mpl::_1, mpl::_2> > >
>::type>
: mpl::true_ {};
+ // If this is not defined, the main template definition above will return
+ // true if T is convertible to the first type in a fusion::vector. We
+ // globally declare any non-Fusion sequence T as not compatible with any
+ // Fusion sequence Expected.
+ template <typename T, typename Expected>
+ struct is_weak_substitute<T, Expected,
+ typename enable_if<
+ mpl::and_<
+ mpl::not_<fusion::traits::is_sequence<T> >
+ , fusion::traits::is_sequence<Expected> >
+ >::type>
+ : mpl::false_ {};
+
namespace detail
{
template <typename T, typename Expected>
@@ -135,8 +147,7 @@
mpl::and_<
is_container<T>,
is_container<Expected>,
- detail::value_type_is_weak_substitute<T, Expected>
- >
+ detail::value_type_is_weak_substitute<T, Expected> >
>::type>
: mpl::true_ {};
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk