libpqxx  4.0.1
compiler-public.hxx
1 /*-------------------------------------------------------------------------
2  *
3  * FILE
4  * pqxx/compiler-public.hxx
5  *
6  * DESCRIPTION
7  * Compiler deficiency workarounds for libpqxx clients
8  *
9  * Copyright (c) 2002-2011, Jeroen T. Vermeulen <jtv@xs4all.nl>
10  *
11  * See COPYING for copyright license. If you did not receive a file called
12  * COPYING with this source code, please notify the distributor of this mistake,
13  * or contact the author.
14  *
15  *-------------------------------------------------------------------------
16  */
17 #ifndef PQXX_H_COMPILER_PUBLIC
18 #define PQXX_H_COMPILER_PUBLIC
19 
20 #ifdef PQXX_HAVE_BOOST_SMART_PTR
21 #include <boost/smart_ptr.hpp>
22 #endif
23 
24 #ifdef PQXX_HAVE_MOVE
25 #include <utility>
26 #define PQXX_MOVE(value) (PGSTD::move(value))
27 #else
28 #define PQXX_MOVE(value) (value)
29 #endif
30 
31 #ifdef _MSC_VER
32 
33 /* Work around a particularly pernicious and deliberate bug in Visual C++:
34  * min() and max() are defined as macros, which can have some very nasty
35  * consequences. This compiler bug can be switched off by defining NOMINMAX.
36  *
37  * We don't like making choices for the user and defining environmental macros
38  * of our own accord, but in this case it's the only way to compile without
39  * incurring a significant risk of bugs--and there doesn't appear to be any
40  * downside. One wonders why this compiler wart is being maintained at all,
41  * since the introduction of inline functions back in the 20th century.
42  */
43 #if defined(min) || defined(max)
44 #error "Oops: min() and/or max() are defined as preprocessor macros.\
45  Define NOMINMAX macro before including any system headers!"
46 #endif
47 
48 #ifndef NOMINMAX
49 #define NOMINMAX
50 #endif
51 
52 // Suppress vtables on abstract classes.
53 #define PQXX_NOVTABLE __declspec(novtable)
54 
55 #endif // _MSC_VER
56 
57 
58 // Workarounds & definitions that need to be included even in library's headers
59 #include "pqxx/config-public-compiler.h"
60 
61 
62 #ifdef PQXX_BROKEN_ITERATOR
63 #include <cstddef>
64 #include <cstdlib>
66 
74 namespace PGSTD
75 {
77 template<typename Cat,
78  typename T,
79  typename Dist,
80  typename Ptr=T*,
81  typename Ref=T&> struct iterator
82 {
83  typedef Cat iterator_category;
84  typedef T value_type;
85  typedef Dist difference_type;
86  typedef Ptr pointer;
87  typedef Ref reference;
88 };
89 }
90 #else
91 #include <iterator>
92 #endif // PQXX_BROKEN_ITERATOR
93 
94 #ifndef PQXX_HAVE_CHAR_TRAITS
95 #include <cstddef>
96 namespace PGSTD
97 {
99 template<typename CHAR> struct char_traits {};
101 template<> struct char_traits<char>
102 {
103  typedef int int_type;
104  typedef size_t pos_type;
105  typedef long off_type;
106  typedef char char_type;
107 
108  static int_type eof() { return -1; }
109 };
111 template<> struct char_traits<unsigned char>
112 {
113  typedef int int_type;
114  typedef size_t pos_type;
115  typedef long off_type;
116  typedef unsigned char char_type;
117 
118  static int_type eof() { return -1; }
119 };
120 }
121 #endif
122 
123 // Workarounds for SUN Workshop 6
124 #if defined(__SUNPRO_CC)
125 #if __SUNPRO_CC_COMPAT < 5
126 #error "This compiler version is not capable of building libpqxx."
127 #endif // __SUNPRO_CC_COMPAT < 5
128 #define PQXX_PRIVATE __hidden
129 #endif // __SUNPRO_CC
130 
131 
132 // Workarounds for Compaq C++ for Alpha
133 #if defined(__DECCXX_VER)
134 #define __USE_STD_IOSTREAM
135 #endif // __DECCXX_VER
136 
137 #if defined(__GNUC__) && defined(PQXX_HAVE_GCC_CONST)
138 #define PQXX_CONST __attribute__ ((const))
139 #else
140 #define PQXX_CONST
141 #endif
142 
143 #if defined(__GNUC__) && defined(PQXX_HAVE_GCC_DEPRECATED)
144 #define PQXX_DEPRECATED __attribute__ ((deprecated))
145 #else
146 #define PQXX_DEPRECATED
147 #endif
148 
149 #if defined(__GNUC__) && defined(PQXX_HAVE_GCC_NORETURN)
150 #define PQXX_NORETURN __attribute__ ((noreturn))
151 #else
152 #define PQXX_NORETURN
153 #endif
154 
155 #if defined(__GNUC__) && defined(PQXX_HAVE_GCC_PURE)
156 #define PQXX_PURE __attribute__ ((pure))
157 #else
158 #define PQXX_PURE
159 #endif
160 
161 
162 // Workarounds for Windows
163 #ifdef _WIN32
164 
165 
166 /* For now, export DLL symbols if _DLL is defined. This is done automatically
167  * by the compiler when linking to the dynamic version of the runtime library,
168  * according to "gzh"
169  */
170 // TODO: Define custom macro to govern how libpqxx will be linked to client
171 #if !defined(PQXX_LIBEXPORT) && defined(PQXX_SHARED)
172 #define PQXX_LIBEXPORT __declspec(dllimport)
173 #endif // !PQXX_LIBEXPORT && PQXX_SHARED
174 
175 
176 // Workarounds for Microsoft Visual C++
177 #ifdef _MSC_VER
178 
179 #if _MSC_VER < 1300
180 #error If you're using Visual C++, you'll need at least version 7 (.NET)
181 #elif _MSC_VER < 1310
182 // Workarounds for pre-2003 Visual C++.NET
183 #undef PQXX_HAVE_REVERSE_ITERATOR
184 #define PQXX_NO_PARTIAL_CLASS_TEMPLATE_SPECIALISATION
185 #define PQXX_TYPENAME
186 #endif // _MSC_VER < 1310
187 
188 // Automatically link with the appropriate libpq (static or dynamic, debug or
189 // release). The default is to use the release DLL. Define PQXX_PQ_STATIC to
190 // link to a static version of libpq, and _DEBUG to link to a debug version.
191 // The two may be combined.
192 #if defined(PQXX_AUTOLINK)
193 #if defined(PQXX_PQ_STATIC)
194 #ifdef _DEBUG
195 #pragma comment(lib, "libpqd")
196 #else
197 #pragma comment(lib, "libpq")
198 #endif
199 #else
200 #ifdef _DEBUG
201 #pragma comment(lib, "libpqddll")
202 #else
203 #pragma comment(lib, "libpqdll")
204 #endif
205 #endif
206 #endif
207 
208 // If we're not compiling libpqxx itself, automatically link with the correct
209 // libpqxx library. To link with the libpqxx DLL, define PQXX_SHARED; the
210 // default is to link with the static library. This is also the recommended
211 // practice.
212 // Note that the preprocessor macro PQXX_INTERNAL is used to detect whether we
213 // are compiling the libpqxx library itself. When you compile the library
214 // yourself using your own project file, make sure to include this define.
215 #if defined(PQXX_AUTOLINK) && !defined(PQXX_INTERNAL)
216  #ifdef PQXX_SHARED
217  #ifdef _DEBUG
218  #pragma comment(lib, "libpqxxD")
219  #else
220  #pragma comment(lib, "libpqxx")
221  #endif
222  #else // !PQXX_SHARED
223  #ifdef _DEBUG
224  #pragma comment(lib, "libpqxx_staticD")
225  #else
226  #pragma comment(lib, "libpqxx_static")
227  #endif
228  #endif
229 #endif
230 
232 
244 #define PQXX_QUIET_DESTRUCTORS
245 
246 #endif // _MSC_VER
247 #endif // _WIN32
248 
249 #ifndef PQXX_LIBEXPORT
250 #define PQXX_LIBEXPORT
251 #endif
252 
253 #ifndef PQXX_PRIVATE
254 #define PQXX_PRIVATE
255 #endif
256 
257 // Some compilers (well, VC) stumble over some required cases of "typename"
258 #ifndef PQXX_TYPENAME
259 #define PQXX_TYPENAME typename
260 #endif
261 
262 #ifndef PQXX_NOVTABLE
263 #define PQXX_NOVTABLE
264 #endif
265 
266 #endif
267