]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/metaparse/example/meta_hs/bind.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / metaparse / example / meta_hs / bind.hpp
1 #ifndef META_HS_BIND_HPP
2 #define META_HS_BIND_HPP
3
4 // Copyright Abel Sinkovics (abel@sinkovics.hu) 2012.
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8
9 #include <lazy.hpp>
10 #include <ast.hpp>
11
12 #include <boost/mpl/at.hpp>
13 #include <boost/mpl/insert.hpp>
14 #include <boost/mpl/pair.hpp>
15
16 template <class AST, class TopEnv, class Env>
17 struct bind;
18
19 template <class V, class TopEnv, class Env>
20 struct bind<ast::value<V>, TopEnv, Env>
21 {
22 typedef lazy::value<V> type;
23 };
24
25 template <class Name, class TopEnv, class Env>
26 struct bind<ast::ref<Name>, TopEnv, Env> :
27 bind<typename boost::mpl::at<Env, Name>::type, TopEnv, Env>
28 {};
29
30 template <class F, class Arg, class TopEnv, class Env>
31 struct bind<ast::application<F, Arg>, TopEnv, Env>
32 {
33 typedef
34 lazy::application<
35 typename bind<F, TopEnv, Env>::type,
36 typename bind<Arg, TopEnv, Env>::type
37 >
38 type;
39 };
40
41 template <class F, class ArgName, class TopEnv, class Env>
42 struct bind<ast::lambda<F, ArgName>, TopEnv, Env>
43 {
44 typedef bind type;
45
46 template <class ArgValue>
47 struct apply :
48 bind<
49 F,
50 TopEnv,
51 typename boost::mpl::insert<
52 Env,
53 boost::mpl::pair<ArgName, ast::value<ArgValue> >
54 >::type
55 >::type
56 {};
57 };
58
59 template <class E, class TopEnv, class Env>
60 struct bind<ast::top_bound<E>, TopEnv, Env> : bind<E, TopEnv, TopEnv> {};
61
62 #endif
63