]>
Commit | Line | Data |
---|---|---|
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_GET_ENCODING_JANUARY_13_2009_1255PM) | |
8 | #define BOOST_SPIRIT_GET_ENCODING_JANUARY_13_2009_1255PM | |
9 | ||
10 | #if defined(_MSC_VER) | |
11 | #pragma once | |
12 | #endif | |
13 | ||
14 | #include <boost/mpl/identity.hpp> | |
15 | #include <boost/type_traits/is_same.hpp> | |
16 | ||
17 | namespace boost { namespace spirit { namespace detail | |
18 | { | |
19 | template <typename Modifiers, typename Encoding> | |
20 | struct get_implicit_encoding | |
21 | { | |
22 | // Extract the implicit encoding from the Modifiers | |
23 | // If one is not found, Encoding is used. The explicit | |
24 | // encoding is the first viable encoding that can be | |
25 | // extracted from the Modifiers (there can be more than one). | |
26 | ||
27 | typedef typename | |
28 | mpl::find_if< | |
29 | char_encodings, | |
30 | has_modifier<Modifiers, tag::char_encoding_base<mpl::_1> > | |
31 | >::type | |
32 | iter; | |
33 | ||
34 | typedef typename | |
35 | mpl::eval_if< | |
36 | is_same<iter, typename mpl::end<char_encodings>::type>, | |
37 | mpl::identity<Encoding>, | |
38 | mpl::deref<iter> | |
39 | >::type | |
40 | type; | |
41 | }; | |
42 | ||
43 | template <typename Modifiers, typename Encoding> | |
44 | struct get_encoding | |
45 | { | |
46 | // Extract the explicit encoding from the Modifiers | |
47 | // If one is not found, get implicit encoding (see above). | |
48 | // Explicit encoding is the encoding explicitly declared | |
49 | // using the encoding[c] directive. | |
50 | ||
51 | typedef typename | |
52 | mpl::find_if< | |
53 | char_encodings, | |
54 | has_modifier<Modifiers, tag::char_code<tag::encoding, mpl::_1> > | |
55 | >::type | |
56 | iter; | |
57 | ||
58 | typedef typename | |
59 | mpl::eval_if< | |
60 | is_same<iter, typename mpl::end<char_encodings>::type>, | |
61 | get_implicit_encoding<Modifiers, Encoding>, | |
62 | mpl::deref<iter> | |
63 | >::type | |
64 | type; | |
65 | }; | |
66 | ||
67 | template <typename Modifiers, typename Encoding, bool case_modifier = false> | |
68 | struct get_encoding_with_case : mpl::identity<Encoding> {}; | |
69 | ||
70 | template <typename Modifiers, typename Encoding> | |
71 | struct get_encoding_with_case<Modifiers, Encoding, true> | |
72 | : get_encoding<Modifiers, Encoding> {}; | |
73 | }}} | |
74 | ||
75 | #endif |