1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | /* |
3 | * This file is part of the LibreOffice project. |
4 | * |
5 | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | * |
9 | * This file incorporates work covered by the following license notice: |
10 | * |
11 | * Licensed to the Apache Software Foundation (ASF) under one or more |
12 | * contributor license agreements. See the NOTICE file distributed |
13 | * with this work for additional information regarding copyright |
14 | * ownership. The ASF licenses this file to you under the Apache |
15 | * License, Version 2.0 (the "License"); you may not use this file |
16 | * except in compliance with the License. You may obtain a copy of |
17 | * the License at http://www.apache.org/licenses/LICENSE-2.0 . |
18 | */ |
19 | |
20 | #ifndef INCLUDED_SAL_MACROS_H |
21 | #define INCLUDED_SAL_MACROS_H |
22 | |
23 | #include <stddef.h> |
24 | |
25 | #ifndef SAL_N_ELEMENTS |
26 | # if defined(__cplusplus) && ( defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L ) |
27 | /* |
28 | * Magic template to calculate at compile time the number of elements |
29 | * in an array. Enforcing that the argument must be a array and not |
30 | * a pointer, e.g. |
31 | * char *pFoo="foo"; |
32 | * SAL_N_ELEMENTS(pFoo); |
33 | * fails while |
34 | * SAL_N_ELEMENTS("foo"); |
35 | * or |
36 | * char aFoo[]="foo"; |
37 | * SAL_N_ELEMENTS(aFoo); |
38 | * pass |
39 | * |
40 | * Unfortunately if arr is an array of an anonymous class then we need |
41 | * C++0x, i.e. see |
42 | * http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#757 |
43 | */ |
44 | template <typename T, size_t S> char (&sal_n_array_size( T(&)[S] ))[S]; |
45 | # define SAL_N_ELEMENTS(arr) (sizeof(sal_n_array_size(arr))) |
46 | # else |
47 | # define SAL_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) |
48 | # endif |
49 | #endif |
50 | |
51 | #ifndef SAL_BOUND |
52 | # define SAL_BOUND(x,l,h) ((x) <= (l) ? (l) : ((x) >= (h) ? (h) : (x))) |
53 | #endif |
54 | |
55 | #ifndef SAL_ABS |
56 | # define SAL_ABS(a) (((a) < 0) ? (-(a)) : (a)) |
57 | #endif |
58 | |
59 | #ifndef SAL_STRINGIFY |
60 | # define SAL_STRINGIFY_ARG(x) #x |
61 | # define SAL_STRINGIFY(x) SAL_STRINGIFY_ARG(x) |
62 | #endif |
63 | |
64 | #endif |
65 | |
66 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |
67 | |