1 | /* |
2 | * Copyright Andrey Semashev 2007 - 2015. |
3 | * Distributed under the Boost Software License, Version 1.0. |
4 | * (See accompanying file LICENSE_1_0.txt or copy at |
5 | * http://www.boost.org/LICENSE_1_0.txt) |
6 | */ |
7 | /*! |
8 | * \file spirit_encoding.hpp |
9 | * \author Andrey Semashev |
10 | * \date 20.07.2012 |
11 | * |
12 | * \brief This header is the Boost.Log library implementation, see the library documentation |
13 | * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html. |
14 | */ |
15 | |
16 | #ifndef BOOST_LOG_SPIRIT_ENCODING_HPP_INCLUDED_ |
17 | #define BOOST_LOG_SPIRIT_ENCODING_HPP_INCLUDED_ |
18 | |
19 | #include <boost/log/detail/config.hpp> |
20 | #include <boost/preprocessor/tuple/elem.hpp> |
21 | #include <boost/preprocessor/seq/for_each.hpp> |
22 | #include <boost/spirit/include/support_standard.hpp> |
23 | #include <boost/spirit/include/support_standard_wide.hpp> |
24 | #include <boost/spirit/home/support/common_terminals.hpp> |
25 | #include <boost/log/detail/header.hpp> |
26 | |
27 | #ifdef BOOST_HAS_PRAGMA_ONCE |
28 | #pragma once |
29 | #endif |
30 | |
31 | namespace boost { |
32 | |
33 | BOOST_LOG_OPEN_NAMESPACE |
34 | |
35 | namespace aux { |
36 | |
37 | template< typename > |
38 | struct encoding; |
39 | |
40 | template< > |
41 | struct encoding< char > |
42 | { |
43 | typedef spirit::char_encoding::standard type; |
44 | }; |
45 | template< > |
46 | struct encoding< wchar_t > |
47 | { |
48 | typedef spirit::char_encoding::standard_wide type; |
49 | }; |
50 | |
51 | //! A simple trait that allows to use charset-specific Qi parsers in a generic way |
52 | template< typename EncodingT > |
53 | struct encoding_specific; |
54 | |
55 | #define BOOST_LOG_CHARSET_PARSERS\ |
56 | ((char_type, char_))\ |
57 | ((string_type, string))\ |
58 | ((alnum_type, alnum))\ |
59 | ((alpha_type, alpha))\ |
60 | ((blank_type, blank))\ |
61 | ((cntrl_type, cntrl))\ |
62 | ((digit_type, digit))\ |
63 | ((graph_type, graph))\ |
64 | ((print_type, print))\ |
65 | ((punct_type, punct))\ |
66 | ((space_type, space))\ |
67 | ((xdigit_type, xdigit))\ |
68 | ((no_case_type, no_case))\ |
69 | ((lower_type, lower))\ |
70 | ((upper_type, upper))\ |
71 | ((lowernum_type, lowernum))\ |
72 | ((uppernum_type, uppernum)) |
73 | |
74 | #define BOOST_LOG_DECLARE_CHARSET_PARSER(r, charset, parser)\ |
75 | typedef spirit::charset::BOOST_PP_TUPLE_ELEM(2, 0, parser) BOOST_PP_TUPLE_ELEM(2, 0, parser);\ |
76 | BOOST_LOG_API static BOOST_PP_TUPLE_ELEM(2, 0, parser) const& BOOST_PP_TUPLE_ELEM(2, 1, parser); |
77 | |
78 | #define BOOST_LOG_DECLARE_CHARSET_PARSERS(charset)\ |
79 | BOOST_PP_SEQ_FOR_EACH(BOOST_LOG_DECLARE_CHARSET_PARSER, charset, BOOST_LOG_CHARSET_PARSERS) |
80 | |
81 | template< > |
82 | struct encoding_specific< spirit::char_encoding::standard > |
83 | { |
84 | BOOST_LOG_DECLARE_CHARSET_PARSERS(standard) |
85 | }; |
86 | |
87 | template< > |
88 | struct encoding_specific< spirit::char_encoding::standard_wide > |
89 | { |
90 | BOOST_LOG_DECLARE_CHARSET_PARSERS(standard_wide) |
91 | }; |
92 | |
93 | #undef BOOST_LOG_DECLARE_CHARSET_PARSERS |
94 | #undef BOOST_LOG_DECLARE_CHARSET_PARSER |
95 | |
96 | } // namespace aux |
97 | |
98 | BOOST_LOG_CLOSE_NAMESPACE // namespace log |
99 | |
100 | } // namespace boost |
101 | |
102 | #include <boost/log/detail/footer.hpp> |
103 | |
104 | #endif // BOOST_LOG_SPIRIT_ENCODING_HPP_INCLUDED_ |
105 | |