summaryrefslogtreecommitdiff
path: root/boost/spirit/home/x3/operator/detail/sequence.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/spirit/home/x3/operator/detail/sequence.hpp')
-rw-r--r--boost/spirit/home/x3/operator/detail/sequence.hpp97
1 files changed, 12 insertions, 85 deletions
diff --git a/boost/spirit/home/x3/operator/detail/sequence.hpp b/boost/spirit/home/x3/operator/detail/sequence.hpp
index cd071f8c90..9d3fe5c992 100644
--- a/boost/spirit/home/x3/operator/detail/sequence.hpp
+++ b/boost/spirit/home/x3/operator/detail/sequence.hpp
@@ -9,7 +9,6 @@
#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
-#include <boost/spirit/home/x3/support/traits/make_attribute.hpp>
#include <boost/spirit/home/x3/support/traits/has_attribute.hpp>
#include <boost/spirit/home/x3/support/traits/is_substitute.hpp>
#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
@@ -37,6 +36,8 @@
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_same.hpp>
+#include <iterator> // for std::make_move_iterator
+
namespace boost { namespace spirit { namespace x3
{
template <typename Left, typename Right>
@@ -106,20 +107,13 @@ namespace boost { namespace spirit { namespace x3 { namespace detail
}
};
- template <typename Parser, typename Attribute>
- struct pass_sequence_attribute_used :
+ template <typename Parser, typename Attribute, typename Enable = void>
+ struct pass_sequence_attribute :
mpl::if_<
traits::is_size_one_view<Attribute>
, pass_sequence_attribute_size_one_view<Attribute>
, pass_through_sequence_attribute<Attribute>>::type {};
- template <typename Parser, typename Attribute, typename Enable = void>
- struct pass_sequence_attribute :
- mpl::if_<
- fusion::result_of::empty<Attribute>
- , pass_sequence_attribute_unused
- , pass_sequence_attribute_used<Parser, Attribute>>::type {};
-
template <typename L, typename R, typename Attribute>
struct pass_sequence_attribute<sequence<L, R>, Attribute>
: pass_through_sequence_attribute<Attribute> {};
@@ -137,6 +131,10 @@ namespace boost { namespace spirit { namespace x3 { namespace detail
, typename Enable = void>
struct partition_attribute
{
+ using attr_category = typename traits::attribute_category<Attribute>::type;
+ static_assert(is_same<traits::tuple_attribute, attr_category>::value,
+ "The parser expects tuple-like attribute type");
+
static int const l_size = sequence_size<L, Context>::value;
static int const r_size = sequence_size<R, Context>::value;
@@ -300,11 +298,11 @@ namespace boost { namespace spirit { namespace x3 { namespace detail
};
template <typename Parser, typename Iterator, typename Context
- , typename RContext, typename Attribute>
+ , typename RContext, typename Attribute, typename AttributeCategory>
bool parse_sequence(
Parser const& parser, Iterator& first, Iterator const& last
, Context const& context, RContext& rcontext, Attribute& attr
- , traits::tuple_attribute)
+ , AttributeCategory)
{
typedef typename Parser::left_type Left;
typedef typename Parser::right_type Right;
@@ -325,78 +323,6 @@ namespace boost { namespace spirit { namespace x3 { namespace detail
return false;
}
- template <typename Parser, typename Iterator, typename Context
- , typename RContext, typename Attribute>
- bool parse_sequence_plain(
- Parser const& parser, Iterator& first, Iterator const& last
- , Context const& context, RContext& rcontext, Attribute& attr)
- {
- typedef typename Parser::left_type Left;
- typedef typename Parser::right_type Right;
- typedef typename traits::attribute_of<Left, Context>::type l_attr_type;
- typedef typename traits::attribute_of<Right, Context>::type r_attr_type;
- typedef traits::make_attribute<l_attr_type, Attribute> l_make_attribute;
- typedef traits::make_attribute<r_attr_type, Attribute> r_make_attribute;
-
- typename l_make_attribute::type l_attr = l_make_attribute::call(attr);
- typename r_make_attribute::type r_attr = r_make_attribute::call(attr);
-
- Iterator save = first;
- if (parser.left.parse(first, last, context, rcontext, l_attr)
- && parser.right.parse(first, last, context, rcontext, r_attr))
- return true;
- first = save;
- return false;
- }
-
- template <typename Parser, typename Iterator, typename Context
- , typename RContext, typename Attribute>
- bool parse_sequence(
- Parser const& parser, Iterator& first, Iterator const& last
- , Context const& context, RContext& rcontext, Attribute& attr
- , traits::plain_attribute)
- {
- return parse_sequence_plain(parser, first, last, context, rcontext, attr);
- }
-
- template <typename Parser, typename Iterator, typename Context
- , typename RContext, typename Attribute>
- bool parse_sequence(
- Parser const& parser, Iterator& first, Iterator const& last
- , Context const& context, RContext& rcontext, Attribute& attr
- , traits::variant_attribute)
- {
- return parse_sequence_plain(parser, first, last, context, rcontext, attr);
- }
-
- template <typename Parser, typename Iterator, typename Context
- , typename RContext, typename Attribute>
- bool parse_sequence(
- Parser const& parser, Iterator& first, Iterator const& last
- , Context const& context, RContext& rcontext, Attribute& attr
- , traits::optional_attribute)
- {
- return parse_sequence_plain(parser, first, last, context, rcontext, attr);
- }
-
- template <typename Parser, typename Iterator, typename Context
- , typename RContext, typename Attribute>
- bool parse_sequence(
- Parser const& parser, Iterator& first, Iterator const& last
- , Context const& context, RContext& rcontext, Attribute& attr
- , traits::range_attribute)
- {
- return parse_sequence_plain(parser, first, last, context, rcontext, attr);
- }
-
- template <typename Left, typename Right, typename Iterator
- , typename Context, typename RContext, typename Attribute>
- bool parse_sequence(
- Left const& left, Right const& right
- , Iterator& first, Iterator const& last
- , Context const& context, RContext& rcontext, Attribute& attr
- , traits::container_attribute);
-
template <typename Parser, typename Context>
constexpr bool pass_sequence_container_attribute
= sequence_size<Parser, Context>::value > 1;
@@ -521,7 +447,8 @@ namespace boost { namespace spirit { namespace x3 { namespace detail
{
return false;
}
- traits::append(attr, traits::begin(attr_), traits::end(attr_));
+ traits::append(attr, std::make_move_iterator(traits::begin(attr_)),
+ std::make_move_iterator(traits::end(attr_)));
return true;
}