]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/spirit/include/boost/spirit/home/lex/meta_compiler.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / spirit / include / boost / spirit / home / lex / meta_compiler.hpp
CommitLineData
7c673cae
FG
1// Copyright (c) 2001-2011 Hartmut Kaiser
2// Copyright (c) 2001-2011 Joel de Guzman
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7#if !defined(BOOST_SPIRIT_LEX_META_COMPILER_APR_20_2009_0756PM)
8#define BOOST_SPIRIT_LEX_META_COMPILER_APR_20_2009_0756PM
9
10#if defined(_MSC_VER)
11#pragma once
12#endif
13
14#include <boost/spirit/home/support/meta_compiler.hpp>
15#include <boost/spirit/home/lex/domain.hpp>
16#include <boost/spirit/home/lex/lexer_type.hpp>
17#include <boost/type_traits/remove_reference.hpp>
18#include <boost/utility/enable_if.hpp>
19
20namespace boost { namespace spirit
21{
22 template <typename T>
23 struct use_terminal<lex::domain, T
24 , typename enable_if<traits::is_lexer<T> >::type> // enables lexers
25 : mpl::true_ {};
26
27 namespace lex
28 {
29 template <typename T, typename Modifiers, typename Enable = void>
30 struct make_primitive // by default, return it as-is
31 {
32 typedef T result_type;
33
34 template <typename T_>
35 T_& operator()(T_& val, unused_type) const
36 {
37 return val;
38 }
39
40 template <typename T_>
41 T_ const& operator()(T_ const& val, unused_type) const
42 {
43 return val;
44 }
45 };
46
47 template <typename Tag, typename Elements
48 , typename Modifiers, typename Enable = void>
49 struct make_composite;
50 }
51
52 // Lex primitive meta-compiler
53 template <>
54 struct make_component<lex::domain, proto::tag::terminal>
55 {
56 template <typename Sig>
57 struct result;
58
59 template <typename This, typename Elements, typename Modifiers>
60 struct result<This(Elements, Modifiers)>
61 {
62 typedef typename lex::make_primitive<
63 typename remove_const<typename Elements::car_type>::type,
64 typename remove_reference<Modifiers>::type>::result_type
65 type;
66 };
67
68 template <typename Elements, typename Modifiers>
69 typename result<make_component(Elements, Modifiers)>::type
70 operator()(Elements const& elements, Modifiers const& modifiers) const
71 {
72 typedef typename remove_const<typename Elements::car_type>::type term;
73 return lex::make_primitive<term, Modifiers>()(elements.car, modifiers);
74 }
75 };
76
77 // Lex composite meta-compiler
78 template <typename Tag>
79 struct make_component<lex::domain, Tag>
80 {
81 template <typename Sig>
82 struct result;
83
84 template <typename This, typename Elements, typename Modifiers>
85 struct result<This(Elements, Modifiers)>
86 {
87 typedef typename
88 lex::make_composite<Tag, Elements
89 , typename remove_reference<Modifiers>::type>::result_type
90 type;
91 };
92
93 template <typename Elements, typename Modifiers>
94 typename result<make_component(Elements, Modifiers)>::type
95 operator()(Elements const& elements, Modifiers const& modifiers) const
96 {
97 return lex::make_composite<Tag, Elements, Modifiers>()(
98 elements, modifiers);
99 }
100 };
101
102}}
103
104#endif