1 /*=============================================================================
2     Boost.Wave: A Standard compliant C++ preprocessor library
3     Definition of the various language support constants
4 
5     http://www.boost.org/
6 
7     Copyright (c) 2001-2005 Hartmut Kaiser. Distributed under the Boost
8     Software License, Version 1.0. (See accompanying file
9     LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 =============================================================================*/
11 #if !defined(LANGUAGE_SUPPORT_HPP_93EDD057_2DEF_44BC_BC9F_FDABB9F51AFA_INCLUDED)
12 #define LANGUAGE_SUPPORT_HPP_93EDD057_2DEF_44BC_BC9F_FDABB9F51AFA_INCLUDED
13 
14 #include <boost/wave/wave_config.hpp>
15 
16 ///////////////////////////////////////////////////////////////////////////////
17 namespace boost {
18 namespace wave {
19 
20 enum language_support {
21 //  support flags for C++98
22     support_normal = 0x01,
23     support_cpp = support_normal,
24 
25     support_long_long = 0x02,
26 
27 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
28 //  support flags for C99
29     support_variadics = 0x04,
30     support_c99 = support_variadics | support_long_long | 0x08,
31 #endif
32 
33     support_option_mask = 0xFF00,
34     support_option_preserve_comments = 0x0100,
35     support_option_no_character_validation = 0x0200,
36     support_option_convert_trigraphs = 0x0400,
37     support_option_single_line = 0x0800
38 };
39 
40 ///////////////////////////////////////////////////////////////////////////////
41 //
42 //  need_cpp
43 //
44 //      Extract, if the language to support is C++98
45 //
46 ///////////////////////////////////////////////////////////////////////////////
47 inline bool
need_cpp(language_support language)48 need_cpp(language_support language)
49 {
50     return (language & ~support_option_mask) == support_cpp;
51 }
52 
53 ///////////////////////////////////////////////////////////////////////////////
54 //
55 //  need_long_long
56 //
57 //      Extract, if the language to support needs long long support
58 //
59 ///////////////////////////////////////////////////////////////////////////////
60 inline bool
need_long_long(language_support language)61 need_long_long(language_support language)
62 {
63     return (language & support_long_long) ? true : false;
64 }
65 
66 ///////////////////////////////////////////////////////////////////////////////
67 //
68 //  enable_long_long
69 //
70 //      Set long long support in the language to support
71 //
72 ///////////////////////////////////////////////////////////////////////////////
73 inline language_support
enable_long_long(language_support language,bool enable=true)74 enable_long_long(language_support language, bool enable = true)
75 {
76     if (enable)
77         return static_cast<language_support>(language | support_long_long);
78     return static_cast<language_support>(language & ~support_long_long);
79 }
80 
81 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
82 
83 ///////////////////////////////////////////////////////////////////////////////
84 //
85 //  need_variadics
86 //
87 //      Extract, if the language to support needs variadics support
88 //
89 ///////////////////////////////////////////////////////////////////////////////
90 inline bool
need_variadics(language_support language)91 need_variadics(language_support language)
92 {
93     return (language & support_variadics) ? true : false;
94 }
95 
96 ///////////////////////////////////////////////////////////////////////////////
97 //
98 //  enable_variadics
99 //
100 //      Set variadics support in the language to support
101 //
102 ///////////////////////////////////////////////////////////////////////////////
103 inline language_support
enable_variadics(language_support language,bool enable=true)104 enable_variadics(language_support language, bool enable = true)
105 {
106     if (enable)
107         return static_cast<language_support>(language | support_variadics);
108     return static_cast<language_support>(language & ~support_variadics);
109 }
110 
111 ///////////////////////////////////////////////////////////////////////////////
112 //
113 //  need_c99
114 //
115 //      Extract, if the language to support is C99
116 //
117 ///////////////////////////////////////////////////////////////////////////////
118 inline bool
need_c99(language_support language)119 need_c99(language_support language)
120 {
121     return (language & ~support_option_mask) == support_c99;
122 }
123 
124 #else  // BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
125 
126 ///////////////////////////////////////////////////////////////////////////////
127 inline bool
need_variadics(language_support language)128 need_variadics(language_support language)
129 {
130     return false;
131 }
132 
133 ///////////////////////////////////////////////////////////////////////////////
134 inline language_support
enable_variadics(language_support language,bool enable=true)135 enable_variadics(language_support language, bool enable = true)
136 {
137     return language;
138 }
139 
140 //////////////////////////////////////////////////////////////////////////////
141 inline bool
need_c99(language_support language)142 need_c99(language_support language)
143 {
144     return false;
145 }
146 
147 #endif // BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
148 
149 ///////////////////////////////////////////////////////////////////////////////
150 //
151 //  need_preserve_comments
152 //
153 //      Extract, if the comments have to be preserved
154 //
155 ///////////////////////////////////////////////////////////////////////////////
156 inline bool
need_preserve_comments(language_support language)157 need_preserve_comments(language_support language)
158 {
159     return (language & support_option_preserve_comments) ? true : false;
160 }
161 
162 ///////////////////////////////////////////////////////////////////////////////
163 //
164 //  enable_preserve_comments
165 //
166 //      Set preserve comments support in the language to support
167 //
168 ///////////////////////////////////////////////////////////////////////////////
169 inline language_support
enable_preserve_comments(language_support language,bool enable=true)170 enable_preserve_comments(language_support language, bool enable = true)
171 {
172     if (enable)
173         return static_cast<language_support>(language | support_option_preserve_comments);
174     return static_cast<language_support>(language & ~support_option_preserve_comments);
175 }
176 
177 ///////////////////////////////////////////////////////////////////////////////
178 //
179 //  get_support_options
180 //
181 //      Set preserve comments support in the language to support
182 //
183 ///////////////////////////////////////////////////////////////////////////////
184 inline language_support
get_support_options(language_support language)185 get_support_options(language_support language)
186 {
187     return static_cast<language_support>(language & support_option_mask);
188 }
189 
190 ///////////////////////////////////////////////////////////////////////////////
191 //
192 //  set_support_options
193 //
194 //      Set language option (for fine tuning of lexer bahaviour)
195 //
196 ///////////////////////////////////////////////////////////////////////////////
197 inline language_support
set_support_options(language_support language,language_support option)198 set_support_options(language_support language, language_support option)
199 {
200     return static_cast<language_support>(
201         (language & ~support_option_mask) | (option & support_option_mask));
202 }
203 
204 ///////////////////////////////////////////////////////////////////////////////
205 }   // namespace wave
206 }   // namespace boost
207 
208 #endif // !defined(LANGUAGE_SUPPORT_HPP_93EDD057_2DEF_44BC_BC9F_FDABB9F51AFA_INCLUDED)
209