1/*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
3 Copyright (c) 2001-2011 Hartmut Kaiser
4
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7=============================================================================*/
8#ifndef BOOST_SPIRIT_QI_OPERATOR_SEQUENCE_HPP
9#define BOOST_SPIRIT_QI_OPERATOR_SEQUENCE_HPP
10
11#if defined(_MSC_VER)
12#pragma once
13#endif
14
15#include <boost/spirit/home/qi/operator/sequence_base.hpp>
16#include <boost/spirit/home/qi/detail/fail_function.hpp>
17#include <boost/spirit/home/qi/meta_compiler.hpp>
18#include <boost/proto/operators.hpp>
19#include <boost/proto/tags.hpp>
20
21namespace boost { namespace spirit
22{
23 ///////////////////////////////////////////////////////////////////////////
24 // Enablers
25 ///////////////////////////////////////////////////////////////////////////
26 template <>
27 struct use_operator<qi::domain, proto::tag::shift_right> // enables >>
28 : mpl::true_ {};
29
30 template <>
31 struct flatten_tree<qi::domain, proto::tag::shift_right> // flattens >>
32 : mpl::true_ {};
33}}
34
35namespace boost { namespace spirit { namespace qi
36{
37 template <typename Elements>
38 struct sequence : sequence_base<sequence<Elements>, Elements>
39 {
40 friend struct sequence_base<sequence<Elements>, Elements>;
41
42 sequence(Elements const& elements)
43 : sequence_base<sequence<Elements>, Elements>(elements) {}
44
45 private:
46
47 template <typename Iterator, typename Context, typename Skipper>
48 static detail::fail_function<Iterator, Context, Skipper>
49 fail_function(
50 Iterator& first, Iterator const& last
51 , Context& context, Skipper const& skipper)
52 {
53 return detail::fail_function<Iterator, Context, Skipper>
54 (first, last, context, skipper);
55 }
56
57 std::string id() const { return "sequence"; }
58 };
59
60 ///////////////////////////////////////////////////////////////////////////
61 // Parser generators: make_xxx function (objects)
62 ///////////////////////////////////////////////////////////////////////////
63 template <typename Elements, typename Modifiers>
64 struct make_composite<proto::tag::shift_right, Elements, Modifiers>
65 : make_nary_composite<Elements, sequence>
66 {};
67
68// ///////////////////////////////////////////////////////////////////////////
69// // Define what attributes are compatible with a sequence
70// template <typename Attribute, typename Elements, typename Context, typename Iterator>
71// struct is_attribute_compatible<Attribute, sequence<Elements>, Context, Iterator>
72// : mpl::or_<
73// is_convertible<Attribute
74// , typename traits::attribute_of<sequence<Elements>, Context, Iterator>::type>
75// , traits::is_fusion_sequence_compatible<qi::domain, Attribute
76// , sequence<Elements>, Context, Iterator>
77// , traits::is_container_compatible<qi::domain, Attribute
78// , sequence<Elements>, Context, Iterator>
79// >
80// {};
81}}}
82
83namespace boost { namespace spirit { namespace traits
84{
85 ///////////////////////////////////////////////////////////////////////////
86 template <typename Elements>
87 struct has_semantic_action<qi::sequence<Elements> >
88 : nary_has_semantic_action<Elements> {};
89
90 ///////////////////////////////////////////////////////////////////////////
91 template <typename Elements, typename Attribute, typename Context
92 , typename Iterator>
93 struct handles_container<qi::sequence<Elements>, Attribute, Context
94 , Iterator>
95 : mpl::true_ {};
96}}}
97
98#endif
99

source code of boost/libs/spirit/include/boost/spirit/home/qi/operator/sequence.hpp