RCFProto
 All Classes Functions Typedefs
Config.hpp
1 
2 //******************************************************************************
3 // RCF - Remote Call Framework
4 //
5 // Copyright (c) 2005 - 2013, Delta V Software. All rights reserved.
6 // http://www.deltavsoft.com
7 //
8 // RCF is distributed under dual licenses - closed source or GPL.
9 // Consult your particular license for conditions of use.
10 //
11 // If you have not purchased a commercial license, you are using RCF
12 // under GPL terms.
13 //
14 // Version: 2.0
15 // Contact: support <at> deltavsoft.com
16 //
17 //******************************************************************************
18 
19 #ifndef INCLUDE_RCF_CONFIG_HPP
20 #define INCLUDE_RCF_CONFIG_HPP
21 
22 #include <boost/config.hpp>
23 #include <boost/mpl/int.hpp>
24 
25 #ifdef BOOST_NO_STD_WSTRING
26 #error RCF requires compiler support for std::wstring.
27 #endif
28 
29 #ifdef RCF_USE_BOOST_THREADS
30 #error RCF_USE_BOOST_THREADS is no longer supported. RCF now uses an internal threading library.
31 #endif
32 
33 #ifndef RCF_MAX_METHOD_COUNT
34 #define RCF_MAX_METHOD_COUNT 100
35 #endif
36 
37 // On Cygwin, need to compile against external Boost.Asio.
38 #if defined(__CYGWIN__) && !defined(RCF_USE_BOOST_ASIO)
39 #define RCF_USE_BOOST_ASIO
40 #endif
41 
42 // C++11 requires us to mark some destructors as throwing. Boost.Config needs to
43 // be from a fairly recent version of Boost to detect whether the compiler has
44 // noexcept() support.
45 
46 #if defined(BOOST_NO_NOEXCEPT) || defined(BOOST_NO_CXX11_NOEXCEPT)
47 #define RCF_DTOR_THROWS
48 #else
49 #define RCF_DTOR_THROWS noexcept(false)
50 #endif
51 
52 //------------------------------------------------------------------------------
53 // Determine which features to compile.
54 
55 #ifndef RCF_PRO
56 #define RCF_PRO 1
57 #endif
58 
59 // For a minimum build.
60 //#define RCF_FEATURE_ZLIB 0
61 //#define RCF_FEATURE_OPENSSL 0
62 //#define RCF_FEATURE_IPV6 0
63 //#define RCF_FEATURE_PROTOBUF 0
64 //#define RCF_FEATURE_FILETRANSFER 0
65 //#define RCF_FEATURE_JSON 0
66 //#define RCF_FEATURE_CUSTOM_ALLOCATOR 0
67 //#define RCF_FEATURE_SSPI 0
68 //#define RCF_FEATURE_SERVER 0
69 //#define RCF_FEATURE_PUBSUB 0
70 //#define RCF_FEATURE_LEGACY 0
71 //#define RCF_FEATURE_HTTP 0
72 //#define RCF_FEATURE_UDP 0
73 //#define RCF_FEATURE_NAMEDPIPE 0
74 //#define RCF_FEATURE_LOCALSOCKET 0
75 //#define RCF_FEATURE_TCP 1
76 //#define RCF_FEATURE_SF 1
77 //#define RCF_FEATURE_BOOST_SERIALIZATION 0
78 
79 // RCF_FEATURE_LOCALSOCKET not supported on Windows platforms.
80 #if defined(RCF_FEATURE_LOCALSOCKET) && defined(BOOST_WINDOWS)
81 #undef RCF_FEATURE_LOCALSOCKET
82 #define RCF_FEATURE_LOCALSOCKET 0
83 #endif
84 
85 // RCF_FEATURE_NAMEDPIPE not supported on non-Windows platforms.
86 #if defined(RCF_FEATURE_NAMEDPIPE) && !defined(BOOST_WINDOWS)
87 #undef RCF_FEATURE_NAMEDPIPE
88 #define RCF_FEATURE_NAMEDPIPE 0
89 #endif
90 
91 // RCF_FEATURE_SSPI not supported on non-Windows platforms.
92 #if defined(RCF_FEATURE_SSPI) && !defined(BOOST_WINDOWS)
93 #undef RCF_FEATURE_SSPI
94 #define RCF_FEATURE_SSPI 0
95 #endif
96 
97 
98 // For any features left undefined, define to default value.
99 
100 // Zlib feature.
101 #ifndef RCF_FEATURE_ZLIB
102 #ifdef RCF_USE_ZLIB
103 #define RCF_FEATURE_ZLIB 1
104 #else
105 #define RCF_FEATURE_ZLIB 0
106 #endif
107 #endif
108 
109 // OpenSSL feature.
110 #ifndef RCF_FEATURE_OPENSSL
111 #ifdef RCF_USE_OPENSSL
112 #define RCF_FEATURE_OPENSSL 1
113 #else
114 #define RCF_FEATURE_OPENSSL 0
115 #endif
116 #endif
117 
118 // SSPI feature.
119 #ifndef RCF_FEATURE_SSPI
120 #if defined(BOOST_WINDOWS) && RCF_PRO == 1
121 #define RCF_FEATURE_SSPI 1
122 #else
123 #define RCF_FEATURE_SSPI 0
124 #endif
125 #endif
126 
127 // File transfer feature
128 #ifndef RCF_FEATURE_FILETRANSFER
129 #ifdef RCF_USE_BOOST_FILESYSTEM
130 #define RCF_FEATURE_FILETRANSFER 1
131 #else
132 #define RCF_FEATURE_FILETRANSFER 0
133 #endif
134 #endif
135 
136 // Server feature
137 #ifndef RCF_FEATURE_SERVER
138 #define RCF_FEATURE_SERVER 1
139 #endif
140 
141 // Publish/subscribe feature.
142 #ifndef RCF_FEATURE_PUBSUB
143 #define RCF_FEATURE_PUBSUB 1
144 #endif
145 
146 // Legacy feature
147 #ifndef RCF_FEATURE_LEGACY
148 #define RCF_FEATURE_LEGACY 1
149 #endif
150 
151 // HTTP/HTTPS feature.
152 #ifndef RCF_FEATURE_HTTP
153 #define RCF_FEATURE_HTTP 1
154 #endif
155 
156 // UDP feature
157 #ifndef RCF_FEATURE_UDP
158 #define RCF_FEATURE_UDP 1
159 #endif
160 
161 // Win32 named pipes feature.
162 #ifndef RCF_FEATURE_NAMEDPIPE
163 #ifdef BOOST_WINDOWS
164 #define RCF_FEATURE_NAMEDPIPE 1
165 #else
166 #define RCF_FEATURE_NAMEDPIPE 0
167 #endif
168 #endif
169 
170 // Unix local sockets feature.
171 #ifndef RCF_FEATURE_LOCALSOCKET
172 #ifdef BOOST_WINDOWS
173 #define RCF_FEATURE_LOCALSOCKET 0
174 #else
175 #define RCF_FEATURE_LOCALSOCKET 1
176 #endif
177 #endif
178 
179 // TCP feature.
180 #ifndef RCF_FEATURE_TCP
181 #define RCF_FEATURE_TCP 1
182 #endif
183 
184 // JSON feature
185 #ifndef RCF_FEATURE_JSON
186 #ifdef RCF_USE_JSON
187 #define RCF_FEATURE_JSON 1
188 #else
189 #define RCF_FEATURE_JSON 0
190 #endif
191 #endif
192 
193 // IPv6 feature
194 #ifndef RCF_FEATURE_IPV6
195 #define RCF_FEATURE_IPV6 1
196 #endif
197 
198 // Protocol Buffers feature
199 #ifndef RCF_FEATURE_PROTOBUF
200 #ifdef RCF_USE_PROTOBUF
201 #define RCF_FEATURE_PROTOBUF 1
202 #else
203 #define RCF_FEATURE_PROTOBUF 0
204 #endif
205 #endif
206 
207 // Custom allocator feature.
208 #ifndef RCF_FEATURE_CUSTOM_ALLOCATOR
209 #ifdef RCF_USE_CUSTOM_ALLOCATOR
210 #define RCF_FEATURE_CUSTOM_ALLOCATOR 1
211 #else
212 #define RCF_FEATURE_CUSTOM_ALLOCATOR 0
213 #endif
214 #endif
215 
216 
217 // RCF_FEATURE_SF / RCF_FEATURE_BOOST_SERIALIZATION.
218 // For backward compatibility we need to interpret RCF_USE_SF_SERIALIZATION / RCF_USE_BOOST_SERIALIZATION correctly.
219 
220 #ifndef RCF_FEATURE_SF
221 #ifdef RCF_USE_SF_SERIALIZATION
222 #define RCF_FEATURE_SF 1
223 #elif !defined(RCF_USE_SF_SERIALIZATION) && defined(RCF_USE_BOOST_SERIALIZATION)
224 #define RCF_FEATURE_SF 0
225 #else
226 #define RCF_FEATURE_SF 1
227 #endif
228 #endif
229 
230 #ifndef RCF_FEATURE_BOOST_SERIALIZATION
231 #ifdef RCF_USE_BOOST_SERIALIZATION
232 #define RCF_FEATURE_BOOST_SERIALIZATION 1
233 #else
234 #define RCF_FEATURE_BOOST_SERIALIZATION 0
235 #endif
236 #endif
237 
238 //------------------------------------------------------------------------------
239 
240 // Detect TR1 availability.
241 #ifndef RCF_USE_TR1
242 
243  // MSVC
244  #if defined(_MSC_VER) && (_MSC_VER >= 1600 || (_MSC_VER == 1500 && _MSC_FULL_VER >= 150030729))
245  #define RCF_USE_TR1
246  #define RCF_TR1_HEADER(x) <x>
247  #endif
248 
249  // GCC
250  #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
251  #define RCF_USE_TR1
252  #define RCF_TR1_HEADER(x) <tr1/x>
253  #endif
254 
255 #endif // RCF_USE_TR1
256 
257 // Detect hash_map/hash_set availability.
258 #ifndef RCF_USE_HASH_MAP
259 
260  #if (defined(_MSC_VER) && _MSC_VER >= 1310) || (defined(__GNUC__) && __GNUC__ == 3)
261  #define RCF_USE_HASH_MAP
262  #if defined(_MSC_VER)
263  #define RCF_HASH_MAP_HEADER(x) <x>
264  #define RCF_HASH_MAP_NS stdext
265  #elif defined(__GNUC__)
266  #define RCF_HASH_MAP_HEADER(x) <ext/x>
267  #define RCF_HASH_MAP_NS __gnu_cxx
268  #endif
269  #endif
270 
271 #endif // RCF_USE_HASH_MAP
272 
273 namespace RCF {
274 
275  #ifndef RCF_USE_SF_SERIALIZATION
276  typedef boost::mpl::int_<0> RcfConfig_SF;
277  #else
278  typedef boost::mpl::int_<1> RcfConfig_SF;
279  #endif
280 
281  #ifndef RCF_USE_BOOST_SERIALIZATION
282  typedef boost::mpl::int_<0> RcfConfig_BSer;
283  #else
284  typedef boost::mpl::int_<1> RcfConfig_BSer;
285  #endif
286 
287  #ifndef RCF_USE_BOOST_FILESYSTEM
288  typedef boost::mpl::int_<0> RcfConfig_BFs;
289  #else
290  typedef boost::mpl::int_<1> RcfConfig_BFs;
291  #endif
292 
293  #if RCF_FEATURE_JSON==0
294  typedef boost::mpl::int_<0> RcfConfig_Json;
295  #else
296  typedef boost::mpl::int_<1> RcfConfig_Json;
297  #endif
298 
299  template<int N1, int N2, int N3, int N4>
300  struct RcfConfigurationDetectMismatches
301  {
302  };
303 
304  typedef RcfConfigurationDetectMismatches<
305  RcfConfig_SF::value,
306  RcfConfig_BSer::value,
307  RcfConfig_BFs::value,
308  RcfConfig_Json::value> RcfConfigT;
309 
310 } // namespace RCF
311 
312 #endif // ! INCLUDE_RCF_CONFIG_HPP