Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef _SAL_TYPES_H_
30 : : #define _SAL_TYPES_H_
31 : :
32 : : #include <sal/config.h>
33 : : #include <sal/macros.h>
34 : :
35 : : /* Grab __SIZEOFxxx constants from typesconfig tool on Unix */
36 : : #if defined UNX
37 : : #include <sal/typesizes.h>
38 : : #elif defined(WNT)
39 : : /* FIXME: autogeneration of type sizes on Win32/Win64? */
40 : : #define SAL_TYPES_ALIGNMENT2 1
41 : : #define SAL_TYPES_ALIGNMENT4 1
42 : : #define SAL_TYPES_ALIGNMENT8 1
43 : : #define SAL_TYPES_SIZEOFSHORT 2
44 : : #define SAL_TYPES_SIZEOFINT 4
45 : : #define SAL_TYPES_SIZEOFLONG 4
46 : : #define SAL_TYPES_SIZEOFLONGLONG 8
47 : : #ifdef _WIN64
48 : : #define SAL_TYPES_SIZEOFPOINTER 8
49 : : #else
50 : : #define SAL_TYPES_SIZEOFPOINTER 4
51 : : #endif
52 : : #endif
53 : :
54 : : #ifdef __cplusplus
55 : : extern "C" {
56 : : #endif
57 : :
58 : : /********************************************************************************/
59 : : /* Data types
60 : : */
61 : :
62 : : /* Boolean */
63 : : typedef unsigned char sal_Bool;
64 : : # define sal_False ((sal_Bool)0)
65 : : # define sal_True ((sal_Bool)1)
66 : :
67 : : /* char is assumed to always be 1 byte long */
68 : : typedef signed char sal_Int8;
69 : : typedef unsigned char sal_uInt8;
70 : :
71 : : #if SAL_TYPES_SIZEOFSHORT == 2
72 : : typedef signed short sal_Int16;
73 : : typedef unsigned short sal_uInt16;
74 : : #else
75 : : #error "Could not find 16-bit type, add support for your architecture"
76 : : #endif
77 : :
78 : : #if SAL_TYPES_SIZEOFLONG == 4
79 : : typedef signed long sal_Int32;
80 : : typedef unsigned long sal_uInt32;
81 : : #define SAL_PRIdINT32 "ld"
82 : : #define SAL_PRIuUINT32 "lu"
83 : : #define SAL_PRIxUINT32 "lx"
84 : : #define SAL_PRIXUINT32 "lX"
85 : : #elif SAL_TYPES_SIZEOFINT == 4
86 : : typedef signed int sal_Int32;
87 : : typedef unsigned int sal_uInt32;
88 : : #define SAL_PRIdINT32 "d"
89 : : #define SAL_PRIuUINT32 "u"
90 : : #define SAL_PRIxUINT32 "x"
91 : : #define SAL_PRIXUINT32 "X"
92 : : #else
93 : : #error "Could not find 32-bit type, add support for your architecture"
94 : : #endif
95 : :
96 : : #if defined _MSC_VER && _MSC_VER >= 1000
97 : : typedef __int64 sal_Int64;
98 : : typedef unsigned __int64 sal_uInt64;
99 : :
100 : : /* The following are macros that will add the 64 bit constant suffix. */
101 : : #define SAL_CONST_INT64(x) x##i64
102 : : #define SAL_CONST_UINT64(x) x##ui64
103 : :
104 : : #define SAL_PRIdINT64 "I64d"
105 : : #define SAL_PRIuUINT64 "I64u"
106 : : #define SAL_PRIxUINT64 "I64x"
107 : : #define SAL_PRIXUINT64 "I64X"
108 : : #elif defined(__SUNPRO_CC) || defined(__SUNPRO_C) || defined (__GNUC__) || defined (sgi)
109 : : #if SAL_TYPES_SIZEOFLONG == 8
110 : : typedef signed long int sal_Int64;
111 : : typedef unsigned long int sal_uInt64;
112 : :
113 : :
114 : : /* The following are macros that will add the 64 bit constant suffix. */
115 : : #define SAL_CONST_INT64(x) x##l
116 : : #define SAL_CONST_UINT64(x) x##ul
117 : :
118 : : #define SAL_PRIdINT64 "ld"
119 : : #define SAL_PRIuUINT64 "lu"
120 : : #define SAL_PRIxUINT64 "lx"
121 : : #define SAL_PRIXUINT64 "lX"
122 : : #elif SAL_TYPES_SIZEOFLONGLONG == 8
123 : : typedef signed long long sal_Int64;
124 : : typedef unsigned long long sal_uInt64;
125 : :
126 : : /* The following are macros that will add the 64 bit constant suffix. */
127 : : #define SAL_CONST_INT64(x) x##ll
128 : : #define SAL_CONST_UINT64(x) x##ull
129 : :
130 : : #ifdef __MINGW32__
131 : : #define SAL_PRIdINT64 "I64d"
132 : : #define SAL_PRIuUINT64 "I64u"
133 : : #define SAL_PRIxUINT64 "I64x"
134 : : #define SAL_PRIXUINT64 "I64X"
135 : : #else
136 : : #define SAL_PRIdINT64 "lld"
137 : : #define SAL_PRIuUINT64 "llu"
138 : : #define SAL_PRIxUINT64 "llx"
139 : : #define SAL_PRIXUINT64 "llX"
140 : : #endif
141 : : #else
142 : : #error "Could not find 64-bit type, add support for your architecture"
143 : : #endif
144 : : #else
145 : : #error "Please define the 64-bit types for your architecture/compiler in sal/inc/sal/types.h"
146 : : #endif
147 : :
148 : : typedef char sal_Char;
149 : : typedef signed char sal_sChar;
150 : : typedef unsigned char sal_uChar;
151 : :
152 : : #if ( defined(SAL_W32) && !defined(__MINGW32__) )
153 : : // http://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.80%29.aspx
154 : : // "By default wchar_t is a typedef for unsigned short."
155 : : // But MinGW has a native wchar_t, and on many places, we cannot deal with
156 : : // that, so sal_Unicode has to be explicitly typedef'd as sal_uInt16 there.
157 : : typedef wchar_t sal_Unicode;
158 : : #else
159 : : #define SAL_UNICODE_NOTEQUAL_WCHAR_T
160 : : typedef sal_uInt16 sal_Unicode;
161 : : #endif
162 : :
163 : : typedef void * sal_Handle;
164 : :
165 : : /* sal_Size should currently be the native width of the platform */
166 : : #if SAL_TYPES_SIZEOFPOINTER == 4
167 : : typedef sal_uInt32 sal_Size;
168 : : typedef sal_Int32 sal_sSize;
169 : : #elif SAL_TYPES_SIZEOFPOINTER == 8
170 : : typedef sal_uInt64 sal_Size;
171 : : typedef sal_Int64 sal_sSize;
172 : : #else
173 : : #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler"
174 : : #endif
175 : :
176 : : /* sal_PtrDiff holds the result of a pointer subtraction */
177 : : #if SAL_TYPES_SIZEOFPOINTER == 4
178 : : typedef sal_Int32 sal_PtrDiff;
179 : : #elif SAL_TYPES_SIZEOFPOINTER == 8
180 : : typedef sal_Int64 sal_PtrDiff;
181 : : #else
182 : : #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler"
183 : : #endif
184 : :
185 : : /* printf-style conversion specification length modifiers for size_t and
186 : : ptrdiff_t (most platforms support C99, MSC has its own extension) */
187 : : #if defined(_MSC_VER) || defined(__MINGW32__)
188 : : #define SAL_PRI_SIZET "I"
189 : : #define SAL_PRI_PTRDIFFT "I"
190 : : #else
191 : : #define SAL_PRI_SIZET "z"
192 : : #define SAL_PRI_PTRDIFFT "t"
193 : : #endif
194 : :
195 : : /* sal_IntPtr, sal_uIntPtr are integer types designed to hold pointers so that any valid
196 : : * pointer to void can be converted to this type and back to a pointer to void and the
197 : : * result will compare to the original pointer */
198 : : #if SAL_TYPES_SIZEOFPOINTER == 4
199 : : typedef sal_Int32 sal_IntPtr;
200 : : typedef sal_uInt32 sal_uIntPtr;
201 : : #define SAL_PRIdINTPTR SAL_PRIdINT32
202 : : #define SAL_PRIuUINTPTR SAL_PRIuUINT32
203 : : #define SAL_PRIxUINTPTR SAL_PRIxUINT32
204 : : #define SAL_PRIXUINTPTR SAL_PRIXUINT32
205 : : #elif SAL_TYPES_SIZEOFPOINTER == 8
206 : : typedef sal_Int64 sal_IntPtr;
207 : : typedef sal_uInt64 sal_uIntPtr;
208 : : #define SAL_PRIdINTPTR SAL_PRIdINT64
209 : : #define SAL_PRIuUINTPTR SAL_PRIuUINT64
210 : : #define SAL_PRIxUINTPTR SAL_PRIxUINT64
211 : : #define SAL_PRIXUINTPTR SAL_PRIXUINT64
212 : : #else
213 : : #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler"
214 : : #endif
215 : :
216 : : /********************************************************************************/
217 : : /* Useful defines
218 : : */
219 : :
220 : : /* The following SAL_MIN_INTn defines codify the assumption that the signed
221 : : * sal_Int types use two's complement representation. Defining them as
222 : : * "-0x7F... - 1" instead of as "-0x80..." prevents warnings about applying the
223 : : * unary minus operator to unsigned quantities.
224 : : */
225 : : #define SAL_MIN_INT8 ((sal_Int8) (-0x7F - 1))
226 : : #define SAL_MAX_INT8 ((sal_Int8) 0x7F)
227 : : #define SAL_MAX_UINT8 ((sal_uInt8) 0xFF)
228 : : #define SAL_MIN_INT16 ((sal_Int16) (-0x7FFF - 1))
229 : : #define SAL_MAX_INT16 ((sal_Int16) 0x7FFF)
230 : : #define SAL_MAX_UINT16 ((sal_uInt16) 0xFFFF)
231 : : #define SAL_MIN_INT32 ((sal_Int32) (-0x7FFFFFFF - 1))
232 : : #define SAL_MAX_INT32 ((sal_Int32) 0x7FFFFFFF)
233 : : #define SAL_MAX_UINT32 ((sal_uInt32) 0xFFFFFFFF)
234 : : #define SAL_MIN_INT64 ((sal_Int64) (SAL_CONST_INT64(-0x7FFFFFFFFFFFFFFF) - 1))
235 : : #define SAL_MAX_INT64 ((sal_Int64) SAL_CONST_INT64(0x7FFFFFFFFFFFFFFF))
236 : : #define SAL_MAX_UINT64 ((sal_uInt64) SAL_CONST_UINT64(0xFFFFFFFFFFFFFFFF))
237 : :
238 : : #if SAL_TYPES_SIZEOFLONG == 4
239 : : #define SAL_MAX_SSIZE SAL_MAX_INT32
240 : : #define SAL_MAX_SIZE SAL_MAX_UINT32
241 : : #elif SAL_TYPES_SIZEOFLONG == 8
242 : : #define SAL_MAX_SSIZE SAL_MAX_INT64
243 : : #define SAL_MAX_SIZE SAL_MAX_UINT64
244 : : #endif
245 : :
246 : : #if defined(SAL_W32) || defined(SAL_UNX)
247 : : # define SAL_MAX_ENUM 0x7fffffff
248 : : #endif
249 : :
250 : : #if defined(_MSC_VER) || defined(__MINGW32__)
251 : : # define SAL_DLLPUBLIC_EXPORT __declspec(dllexport)
252 : : #if defined(_MSC_VER)
253 : : # define SAL_DLLPUBLIC_IMPORT __declspec(dllimport)
254 : : #else
255 : : # define SAL_DLLPUBLIC_IMPORT
256 : : #endif // defined(_MSC_VER)
257 : : # define SAL_DLLPRIVATE
258 : : # define SAL_DLLPUBLIC_TEMPLATE
259 : : # define SAL_CALL __cdecl
260 : : # define SAL_CALL_ELLIPSE __cdecl
261 : : #elif defined SAL_UNX
262 : : # if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x550)
263 : : # define SAL_DLLPUBLIC_EXPORT __global
264 : : # define SAL_DLLPUBLIC_IMPORT
265 : : # define SAL_DLLPRIVATE __hidden
266 : : # define SAL_DLLPUBLIC_TEMPLATE
267 : : # elif defined(__SUNPRO_C ) && (__SUNPRO_C >= 0x550)
268 : : # define SAL_DLLPUBLIC_EXPORT __global
269 : : # define SAL_DLLPUBLIC_IMPORT
270 : : # define SAL_DLLPRIVATE __hidden
271 : : # define SAL_DLLPUBLIC_TEMPLATE
272 : : # elif defined(__GNUC__) && defined(HAVE_GCC_VISIBILITY_FEATURE)
273 : : # define SAL_DLLPUBLIC_EXPORT __attribute__ ((visibility("default")))
274 : : # define SAL_DLLPUBLIC_IMPORT __attribute__ ((visibility("default")))
275 : : # define SAL_DLLPRIVATE __attribute__ ((visibility("hidden")))
276 : : # define SAL_DLLPUBLIC_TEMPLATE __attribute__ ((visibility("default")))
277 : : # else
278 : : # define SAL_DLLPUBLIC_EXPORT
279 : : # define SAL_DLLPUBLIC_IMPORT
280 : : # define SAL_DLLPRIVATE
281 : : # define SAL_DLLPUBLIC_TEMPLATE
282 : : # endif
283 : : # define SAL_CALL
284 : : # define SAL_CALL_ELLIPSE
285 : : #else
286 : : # error("unknown platform")
287 : : #endif
288 : :
289 : : /**
290 : : Exporting the symbols necessary for exception handling on GCC.
291 : :
292 : : These macros are used for inline declarations of exception classes, as in
293 : : rtl/malformeduriexception.hxx.
294 : : */
295 : : #if defined(__GNUC__) && ! defined(__MINGW32__)
296 : : #define SAL_EXCEPTION_DLLPUBLIC_EXPORT SAL_DLLPUBLIC_EXPORT
297 : : #define SAL_EXCEPTION_DLLPRIVATE SAL_DLLPRIVATE
298 : : #else
299 : : #define SAL_EXCEPTION_DLLPUBLIC_EXPORT
300 : : #define SAL_EXCEPTION_DLLPRIVATE
301 : : #endif
302 : :
303 : : #include <sal/saldllapi.h>
304 : :
305 : : /** Use this as markup for functions and methods whose return value must be
306 : : checked.
307 : :
308 : : Compilers that support a construct of this nature will emit a compile
309 : : time warning on unchecked return value.
310 : : */
311 : : #if defined(__GNUC__)
312 : : # define SAL_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
313 : : #else
314 : : # define SAL_WARN_UNUSED_RESULT
315 : : #endif
316 : :
317 : : /** Use this for pure virtual classes, e.g. class SAL_NO_VTABLE Foo { ...
318 : : This hinders the compiler from setting a generic vtable stating that
319 : : a pure virtual function was called and thus slightly reduces code size.
320 : : */
321 : : #ifdef _MSC_VER
322 : : # define SAL_NO_VTABLE __declspec(novtable)
323 : : #else
324 : : # define SAL_NO_VTABLE
325 : : #endif
326 : :
327 : : #ifdef SAL_W32
328 : : # pragma pack(push, 8)
329 : : #endif
330 : :
331 : : /** This is the binary specification of a SAL sequence.
332 : : <br>
333 : : */
334 : : typedef struct _sal_Sequence
335 : : {
336 : : /** reference count of sequence<br>
337 : : */
338 : : sal_Int32 nRefCount;
339 : : /** element count<br>
340 : : */
341 : : sal_Int32 nElements;
342 : : /** elements array<br>
343 : : */
344 : : char elements[1];
345 : : } sal_Sequence;
346 : :
347 : : #define SAL_SEQUENCE_HEADER_SIZE ((sal_Size)&((sal_Sequence *)0)->elements)
348 : :
349 : : #if defined( SAL_W32)
350 : : #pragma pack(pop)
351 : : #endif
352 : :
353 : : /** Definition of function throw clause macros. These have been introduced
354 : : to reduce code size by balancing out compiler bugs.
355 : :
356 : : These macros are ONLY for function declarations,
357 : : use common C++ throw statement for throwing exceptions, e.g.
358 : : throw RuntimeException();
359 : :
360 : : SAL_THROW() should be used for all C++ functions, e.g. SAL_THROW(())
361 : : SAL_THROW_EXTERN_C() should be used for all C functions
362 : : */
363 : : #ifdef __cplusplus
364 : : #if defined(__GNUC__) || defined(__SUNPRO_CC) || defined(__sgi)
365 : : #define SAL_THROW( exc )
366 : : #else /* MSVC, all other */
367 : : #define SAL_THROW( exc ) throw exc
368 : : #endif /* __GNUC__, __SUNPRO_CC */
369 : : #define SAL_THROW_EXTERN_C() throw ()
370 : : #else /* ! __cplusplus */
371 : : /* SAL_THROW() must not be used in C headers, only SAL_THROW_EXTERN_C() is defined */
372 : : #define SAL_THROW_EXTERN_C()
373 : : #endif
374 : :
375 : :
376 : :
377 : : #ifdef __cplusplus
378 : : enum __sal_NoAcquire
379 : : {
380 : : /** definition of a no acquire enum for ctors
381 : : */
382 : : SAL_NO_ACQUIRE
383 : : };
384 : : #endif /* __cplusplus */
385 : :
386 : :
387 : : #ifdef __cplusplus
388 : : }
389 : : #endif /* __cplusplus */
390 : :
391 : : #ifdef __cplusplus
392 : :
393 : : namespace sal {
394 : :
395 : : /**
396 : : A static_cast between integral types, to avoid C++ compiler warnings.
397 : :
398 : : In C++ source code, use sal::static_int_cast<T>(n) instead of
399 : : static_cast<T>(n) whenever a compiler warning about integral type problems
400 : : shall be silenced. That way, source code that needs to be modified when the
401 : : type of any of the expressions involved in the compiler warning is changed
402 : : can be found more easily.
403 : :
404 : : Both template arguments T1 and T2 must be integral types.
405 : : */
406 : 385887491 : template< typename T1, typename T2 > inline T1 static_int_cast(T2 n) {
407 : 385887491 : return static_cast< T1 >(n);
408 : : }
409 : :
410 : : }
411 : :
412 : : #else /* __cplusplus */
413 : :
414 : : /**
415 : : A cast between integer types, to avoid C compiler warnings.
416 : :
417 : : In C source code, use SAL_INT_CAST(type, expr) instead of ((type) (expr))
418 : : whenever a compiler warning about integer type problems shall be silenced.
419 : : That way, source code that needs to be modified when the type of any of the
420 : : expressions involved in the compiler warning is changed can be found more
421 : : easily.
422 : :
423 : : The argument 'type' must be an integer type and the argument 'expr' must be
424 : : an integer expression. Both arguments are evaluated exactly once.
425 : : */
426 : : #define SAL_INT_CAST(type, expr) ((type) (expr))
427 : :
428 : : #endif /* __cplusplus */
429 : :
430 : : /**
431 : : Use as follows:
432 : : SAL_DEPRECATED("Dont use, its evil.") void doit(int nPara);
433 : : */
434 : :
435 : : #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
436 : : # define SAL_DEPRECATED(message) __attribute__((deprecated(message)))
437 : : #elif (__GNUC__)
438 : : # define SAL_DEPRECATED(message) __attribute__((deprecated))
439 : : #elif defined(_MSC_VER)
440 : : # define SAL_DEPRECATED(message) __declspec(deprecated(message))
441 : : #else
442 : : # define SAL_DEPRECATED(message)
443 : : #endif
444 : :
445 : : /**
446 : : Use as follows:
447 : : SAL_WNODEPRECATED_DECLARATIONS_PUSH
448 : : \::std::auto_ptr<X> ...
449 : : SAL_WNODEPRECATED_DECLARATIONS_POP
450 : : */
451 : :
452 : : #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
453 : : #define SAL_WNODEPRECATED_DECLARATIONS_PUSH \
454 : : _Pragma(SAL_STRINGIFY_ARG(GCC diagnostic push)) \
455 : : _Pragma(SAL_STRINGIFY_ARG(GCC diagnostic ignored "-Wdeprecated-declarations"))
456 : : #define SAL_WNODEPRECATED_DECLARATIONS_POP \
457 : : _Pragma(SAL_STRINGIFY_ARG(GCC diagnostic pop))
458 : : #else
459 : : # define SAL_WNODEPRECATED_DECLARATIONS_PUSH
460 : : # define SAL_WNODEPRECATED_DECLARATIONS_POP
461 : : #endif
462 : :
463 : : /** Annotate unused but required C++ function parameters.
464 : :
465 : : An unused parameter is required if the function needs to adhere to a given
466 : : type (e.g., if its address is assigned to a function pointer of a specific
467 : : type, or if it is called from template code). This annotation helps static
468 : : analysis tools suppress false warnings. In the case of virtual functions
469 : : (where unused required parameters are common, too), the annotation is not
470 : : required (as static analysis tools can themselves derive the information
471 : : whether a function is virtual).
472 : :
473 : : Use the annotation in function definitions like
474 : :
475 : : void f(SAL_UNUSED_PARAMETER int) {}
476 : :
477 : : C does not allow unnamed parameters, anyway, so a function definition like
478 : : the above needs to be written there as
479 : :
480 : : void f(int dummy) { (void) dummy; / * avoid warnings * / }
481 : :
482 : : without a SAL_UNUSED_PARAMETER annotation.
483 : :
484 : : @since LibreOffice 3.6
485 : : */
486 : : #if defined __cplusplus
487 : : #if defined __GNUC__
488 : : #define SAL_UNUSED_PARAMETER __attribute__ ((unused))
489 : : #else
490 : : #define SAL_UNUSED_PARAMETER
491 : : #endif
492 : : #endif
493 : :
494 : : #endif /*_SAL_TYPES_H_ */
495 : :
496 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|