Warning, /frameworks/kdelibs4support/src/kdemacros.h.cmake is written in an unsupported language. File is not indexed.
0001 /* This file is part of the KDE libraries
0002 Copyright (c) 2002-2003 KDE Team
0003
0004 This library is free software; you can redistribute it and/or
0005 modify it under the terms of the GNU Library General Public
0006 License as published by the Free Software Foundation; either
0007 version 2 of the License, or (at your option) any later version.
0008
0009 This library is distributed in the hope that it will be useful,
0010 but WITHOUT ANY WARRANTY; without even the implied warranty of
0011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0012 Library General Public License for more details.
0013
0014 You should have received a copy of the GNU Library General Public License
0015 along with this library; see the file COPYING.LIB. If not, write to
0016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017 Boston, MA 02110-1301, USA.
0018 */
0019
0020 /**
0021 * @file kdemacros.h
0022 *
0023 * This header defines several compiler-independent macros which are used
0024 * throughout KDE. Most of these macros make use of GCC extensions; on other
0025 * compilers, they don't have any effect.
0026 */
0027
0028 #ifndef _KDE_MACROS_H_
0029 #define _KDE_MACROS_H_
0030
0031 #cmakedefine __KDE_HAVE_GCC_VISIBILITY
0032
0033 /**
0034 * @def KDE_NO_EXPORT
0035 * @ingroup KDEMacros
0036 *
0037 * The KDE_NO_EXPORT macro marks the symbol of the given variable
0038 * to be hidden. A hidden symbol is stripped during the linking step,
0039 * so it can't be used from outside the resulting library, which is similar
0040 * to static. However, static limits the visibility to the current
0041 * compilation unit. Hidden symbols can still be used in multiple compilation
0042 * units.
0043 *
0044 * \code
0045 * int KDE_NO_EXPORT foo;
0046 * int KDE_EXPORT bar;
0047 * \endcode
0048 *
0049 * @sa KDE_EXPORT
0050 */
0051
0052 /**
0053 * @def KDE_EXPORT
0054 * @ingroup KDEMacros
0055 *
0056 * The KDE_EXPORT macro marks the symbol of the given variable
0057 * to be visible, so it can be used from outside the resulting library.
0058 *
0059 * \code
0060 * int KDE_NO_EXPORT foo;
0061 * int KDE_EXPORT bar;
0062 * \endcode
0063 *
0064 * @sa KDE_NO_EXPORT
0065 */
0066
0067 /**
0068 * @def KDE_IMPORT
0069 * @ingroup KDEMacros
0070 */
0071
0072 #ifdef __KDE_HAVE_GCC_VISIBILITY
0073 #define KDE_NO_EXPORT __attribute__ ((visibility("hidden")))
0074 #define KDE_EXPORT __attribute__ ((visibility("default")))
0075 #define KDE_IMPORT __attribute__ ((visibility("default")))
0076 #elif defined(_WIN32) || defined(_WIN64)
0077 #define KDE_NO_EXPORT
0078 #define KDE_EXPORT __declspec(dllexport)
0079 #define KDE_IMPORT __declspec(dllimport)
0080 #else
0081 #define KDE_NO_EXPORT
0082 #define KDE_EXPORT
0083 #define KDE_IMPORT
0084 #endif
0085
0086 /**
0087 * @def KDE_PACKED
0088 * @ingroup KDEMacros
0089 *
0090 * The KDE_PACKED macro can be used to hint the compiler that a particular
0091 * structure or class should not contain unnecessary paddings.
0092 */
0093
0094 #ifdef __GNUC__
0095 #define KDE_PACKED __attribute__((__packed__))
0096 #else
0097 #define KDE_PACKED
0098 #endif
0099
0100 /**
0101 * @def KDE_DEPRECATED
0102 * @ingroup KDEMacros
0103 *
0104 * The KDE_DEPRECATED macro can be used to trigger compile-time warnings
0105 * with newer compilers when deprecated functions are used.
0106 *
0107 * For non-inline functions, the macro gets inserted at front of the
0108 * function declaration, right before the return type:
0109 *
0110 * \code
0111 * KDE_DEPRECATED void deprecatedFunctionA();
0112 * KDE_DEPRECATED int deprecatedFunctionB() const;
0113 * \endcode
0114 *
0115 * For functions which are implemented inline,
0116 * the KDE_DEPRECATED macro is inserted at the front, right before the return
0117 * type, but after "static", "inline" or "virtual":
0118 *
0119 * \code
0120 * KDE_DEPRECATED void deprecatedInlineFunctionA() { .. }
0121 * virtual KDE_DEPRECATED int deprecatedInlineFunctionB() { .. }
0122 * static KDE_DEPRECATED bool deprecatedInlineFunctionC() { .. }
0123 * inline KDE_DEPRECATED bool deprecatedInlineFunctionD() { .. }
0124 * \endcode
0125 *
0126 * You can also mark whole structs or classes as deprecated, by inserting the
0127 * KDE_DEPRECATED macro after the struct/class keyword, but before the
0128 * name of the struct/class:
0129 *
0130 * \code
0131 * class KDE_DEPRECATED DeprecatedClass { };
0132 * struct KDE_DEPRECATED DeprecatedStruct { };
0133 * \endcode
0134 *
0135 * \note
0136 * It does not make much sense to use the KDE_DEPRECATED keyword for a Qt signal;
0137 * this is because usually get called by the class which they belong to,
0138 * and one would assume that a class author does not use deprecated methods of
0139 * his own class. The only exception to this are signals which are connected to
0140 * other signals; they get invoked from moc-generated code. In any case,
0141 * printing a warning message in either case is not useful.
0142 * For slots, it can make sense (since slots can be invoked directly) but be
0143 * aware that if the slots get triggered by a signal, the will get called from
0144 * moc code as well and thus the warnings are useless.
0145 *
0146 * \par
0147 * Also note that it is not possible to use KDE_DEPRECATED for classes which
0148 * use the k_dcop keyword (to indicate a DCOP interface declaration); this is
0149 * because the dcopidl program would choke on the unexpected declaration
0150 * syntax.
0151 *
0152 * \note
0153 * KDE_DEPRECATED cannot be used at the end of the declaration anymore,
0154 * unlike what is done for KDE3.
0155 *
0156 * \note
0157 * KDE_DEPRECATED cannot be used for constructors,
0158 * use KDE_CONSTRUCTOR_DEPRECATED instead.
0159 */
0160
0161 #ifdef __cplusplus
0162 # include <QtCore/qglobal.h>
0163 # ifndef KDE_DEPRECATED
0164 # ifdef KDE_DEPRECATED_WARNINGS
0165 # define KDE_DEPRECATED Q_DECL_DEPRECATED
0166 # else
0167 # define KDE_DEPRECATED
0168 # endif
0169 # endif
0170 #endif
0171
0172 /**
0173 * @def KDE_CONSTRUCTOR_DEPRECATED
0174 * @ingroup KDEMacros
0175 *
0176 * The KDE_CONSTRUCTOR_DEPRECATED macro can be used to trigger compile-time
0177 * warnings with newer compilers when deprecated constructors are used.
0178 *
0179 * For non-inline constructors, the macro gets inserted at front of the
0180 * constructor declaration, right before the return type:
0181 *
0182 * \code
0183 * KDE_CONSTRUCTOR_DEPRECATED classA();
0184 * \endcode
0185 *
0186 * For constructors which are implemented inline,
0187 * the KDE_CONSTRUCTOR_DEPRECATED macro is inserted at the front,
0188 * but after the "inline" keyword:
0189 *
0190 * \code
0191 * KDE_CONSTRUCTOR_DEPRECATED classA() { .. }
0192 * \endcode
0193 *
0194 * \note Do not forget that inlined constructors are not allowed in public
0195 * headers for KDE.
0196 */
0197
0198 // QT5 KF5 TODO: Mark this macro deprecated or remove it entirely.
0199 #ifndef KDE_CONSTRUCTOR_DEPRECATED
0200 # ifdef __GNUC__
0201 # if __GNUC__ == 3 && __GNUC_MINOR__ <= 3
0202 /* GCC 3.3.x cannot handle Qt 4.1.2's definition of Q_DECL_CONSTRUCTOR_DEPRECATED */
0203 # define KDE_CONSTRUCTOR_DEPRECATED
0204 # else
0205 # define KDE_CONSTRUCTOR_DEPRECATED Q_DECL_DEPRECATED
0206 # endif
0207 # else
0208 # define KDE_CONSTRUCTOR_DEPRECATED Q_DECL_DEPRECATED
0209 # endif
0210 #endif
0211
0212 /**
0213 * @def KDELIBS4SUPPORT_NO_DEPRECATED
0214 * @ingroup KDEMacros
0215 *
0216 * The KDELIBS4SUPPORT_NO_DEPRECATED indicates if the deprecated symbols of the platform
0217 * have been compiled out.
0218 */
0219 #cmakedefine KDELIBS4SUPPORT_NO_DEPRECATED
0220
0221 /**
0222 * @def KDE_ISLIKELY
0223 * @ingroup KDEMacros
0224 *
0225 * The KDE_ISLIKELY macro tags a boolean expression as likely to evaluate to
0226 * @c true. When used in an <tt>if ( )</tt> statement, it gives a hint to the compiler
0227 * that the following codeblock is likely to get executed. Providing this
0228 * information helps the compiler to optimize the code for better performance.
0229 * Using the macro has an insignificant code size or runtime memory footprint impact.
0230 * The code semantics is not affected.
0231 *
0232 * Example:
0233 *
0234 * \code
0235 * if ( KDE_ISLIKELY( testsomething() ) )
0236 * abort(); // assume its likely that the application aborts
0237 * \endcode
0238 *
0239 * \note
0240 * Providing wrong information ( like marking a condition that almost never
0241 * passes as 'likely' ) will cause a significant runtime slowdown. Therefore only
0242 * use it for cases where you can be sure about the odds of the expression to pass
0243 * in all cases ( independent from e.g. user configuration ).
0244 *
0245 * \note
0246 * Do NOT use ( !KDE_ISLIKELY(foo) ) as an replacement for KDE_ISUNLIKELY() !
0247 *
0248 * @sa KDE_ISUNLIKELY
0249 */
0250
0251 /**
0252 * @def KDE_ISUNLIKELY
0253 * @ingroup KDEMacros
0254 *
0255 * The KDE_ISUNLIKELY macro tags a boolean expression as likely to evaluate to
0256 * @c false. When used in an <tt>if ( )</tt> statement, it gives a hint to the compiler
0257 * that the following codeblock is unlikely to get executed. Providing this
0258 * information helps the compiler to optimize the code for better performance.
0259 * Using the macro has an insignificant code size or runtime memory footprint impact.
0260 * The code semantics is not affected.
0261 *
0262 * Example:
0263 *
0264 * \code
0265 * if ( KDE_ISUNLIKELY( testsomething() ) )
0266 * abort(); // assume its unlikely that the application aborts
0267 * \endcode
0268 *
0269 * \note
0270 * Providing wrong information ( like marking a condition that almost never
0271 * passes as 'unlikely' ) will cause a significant runtime slowdown. Therefore only
0272 * use it for cases where you can be sure about the odds of the expression to pass
0273 * in all cases ( independent from e.g. user configuration ).
0274 *
0275 * \note
0276 * Do NOT use ( !KDE_ISUNLIKELY(foo) ) as an replacement for KDE_ISLIKELY() !
0277 *
0278 * @sa KDE_ISLIKELY
0279 */
0280
0281 #if defined(__GNUC__) && __GNUC__ - 0 >= 3
0282 # define KDE_ISLIKELY( x ) __builtin_expect(!!(x),1)
0283 # define KDE_ISUNLIKELY( x ) __builtin_expect(!!(x),0)
0284 #else
0285 # define KDE_ISLIKELY( x ) ( x )
0286 # define KDE_ISUNLIKELY( x ) ( x )
0287 #endif
0288
0289
0290 /**
0291 * @ingroup KDEMacros
0292 * This macro, and it's friends going up to 10 reserve a fixed number of virtual
0293 * functions in a class. Because adding virtual functions to a class changes the
0294 * size of the vtable, adding virtual functions to a class breaks binary
0295 * compatibility. However, by using this macro, and decrementing it as new
0296 * virtual methods are added, binary compatibility can still be preserved.
0297 *
0298 * \note The added functions must be added to the header at the same location
0299 * as the macro; changing the order of virtual functions in a header is also
0300 * binary incompatible as it breaks the layout of the vtable.
0301 */
0302 #define RESERVE_VIRTUAL_1 \
0303 virtual void reservedVirtual1() {}
0304 /**
0305 * @ingroup KDEMacros
0306 */
0307 #define RESERVE_VIRTUAL_2 \
0308 virtual void reservedVirtual2() {} \
0309 RESERVE_VIRTUAL_1
0310 /**
0311 * @ingroup KDEMacros
0312 */
0313 #define RESERVE_VIRTUAL_3 \
0314 virtual void reservedVirtual3() {} \
0315 RESERVE_VIRTUAL_2
0316 /**
0317 * @ingroup KDEMacros
0318 */
0319 #define RESERVE_VIRTUAL_4 \
0320 virtual void reservedVirtual4() {} \
0321 RESERVE_VIRTUAL_3
0322 /**
0323 * @ingroup KDEMacros
0324 */
0325 #define RESERVE_VIRTUAL_5 \
0326 virtual void reservedVirtual5() {} \
0327 RESERVE_VIRTUAL_4
0328 /**
0329 * @ingroup KDEMacros
0330 */
0331 #define RESERVE_VIRTUAL_6 \
0332 virtual void reservedVirtual6() {} \
0333 RESERVE_VIRTUAL_5
0334 /**
0335 * @ingroup KDEMacros
0336 */
0337 #define RESERVE_VIRTUAL_7 \
0338 virtual void reservedVirtual7() {} \
0339 RESERVE_VIRTUAL_6
0340 /**
0341 * @ingroup KDEMacros
0342 */
0343 #define RESERVE_VIRTUAL_8 \
0344 virtual void reservedVirtual8() {} \
0345 RESERVE_VIRTUAL_7
0346 /**
0347 * @ingroup KDEMacros
0348 */
0349 #define RESERVE_VIRTUAL_9 \
0350 virtual void reservedVirtual9() {} \
0351 RESERVE_VIRTUAL_8
0352 #define RESERVE_VIRTUAL_10 \
0353 virtual void reservedVirtual10() {} \
0354 RESERVE_VIRTUAL_9
0355
0356 /**
0357 * @def KDE_FULL_TEMPLATE_EXPORT_INSTANTIATION
0358 * @ingroup KDEMacros
0359 *
0360 * From Qt's global.h:
0361 * Compilers which follow outdated template instantiation rules
0362 * require a class to have a comparison operator to exist when
0363 * a QList of this type is instantiated. It's not actually
0364 * used in the list, though. Hence the dummy implementation.
0365 * Just in case other code relies on it we better trigger a warning
0366 * mandating a real implementation.
0367 *
0368 * In KDE we need this for classes which are exported in a shared
0369 * lib because some compilers need a full instantiated class then.
0370 *
0371 * @sa KDE_DUMMY_COMPARISON_OPERATOR
0372 * @sa KDE_DUMMY_QHASH_FUNCTION
0373 */
0374
0375 /**
0376 * @def KDE_DUMMY_COMPARISON_OPERATOR
0377 * @ingroup KDEMacros
0378 *
0379 * The KDE_DUMMY_COMPARISON_OPERATOR defines a simple
0380 * compare operator for classes.
0381 *
0382 * @sa KDE_FULL_TEMPLATE_EXPORT_INSTANTIATION
0383 * @sa KDE_DUMMY_QHASH_FUNCTION
0384 */
0385
0386 /**
0387 * @def KDE_DUMMY_QHASH_FUNCTION
0388 * @ingroup KDEMacros
0389 *
0390 * The KDE_DUMMY_QHASH_FUNCTION defines a simple
0391 * hash-function for classes.
0392 *
0393 * @sa KDE_FULL_TEMPLATE_EXPORT_INSTANTIATION
0394 * @sa KDE_DUMMY_COMPARISON_OPERATOR
0395 */
0396
0397 #ifdef _MSC_VER
0398 # ifndef KDE_FULL_TEMPLATE_EXPORT_INSTANTIATION
0399 # define KDE_FULL_TEMPLATE_EXPORT_INSTANTIATION
0400 # endif
0401 #endif
0402
0403 #ifdef KDE_FULL_TEMPLATE_EXPORT_INSTANTIATION
0404 # define KDE_DUMMY_COMPARISON_OPERATOR(C) \
0405 bool operator==(const C&) const { \
0406 qWarning(#C"::operator==(const "#C"&) was called"); \
0407 return false; \
0408 }
0409 # define KDE_DUMMY_QHASH_FUNCTION(C) \
0410 inline uint qHash(const C) { \
0411 qWarning("inline uint qHash(const "#C") was called"); \
0412 return 0; \
0413 }
0414 #else
0415 # define KDE_DUMMY_COMPARISON_OPERATOR(C)
0416 # define KDE_DUMMY_QHASH_FUNCTION(C)
0417 #endif
0418
0419 /**
0420 * @def KDE_BF_ENUM
0421 * @ingroup KDEMacros
0422 *
0423 * The KDE_BF_ENUM is used when storing an enum
0424 * in a bitfield, to ensure correct conversion
0425 * by all compilers.
0426 *
0427 * @sa KDE_CAST_BF_ENUM
0428 */
0429
0430 /**
0431 * @def KDE_CAST_BF_ENUM
0432 * @ingroup KDEMacros
0433 *
0434 * The KDE_CAST_BF_ENUM is used when retrieving an
0435 * enum from a bitfield, to ensure correct conversion
0436 * by all compilers.
0437 *
0438 * @sa KDE_BF_ENUM
0439 */
0440
0441 #ifdef Q_CC_MSVC
0442 # define KDE_BF_ENUM(a) unsigned int
0443 # define KDE_CAST_BF_ENUM(a,b) static_cast<a>(b)
0444 #else
0445 # define KDE_BF_ENUM(a) a
0446 # define KDE_CAST_BF_ENUM(a,b) b
0447 #endif
0448
0449 /**
0450 * @def KDE_WEAK_SYMBOL
0451 * @ingroup KDEMacros
0452 *
0453 * The KDE_WEAK_SYMBOL macro can be used to tell the compiler that
0454 * a particular function should be a weak symbol (that e.g. may be overridden
0455 * in another library, -Bdirect will not bind this symbol directly)
0456 */
0457
0458 #ifdef __GNUC__
0459 #define KDE_WEAK_SYMBOL __attribute__((__weak__))
0460 #else
0461 #define KDE_WEAK_SYMBOL
0462 #endif
0463
0464
0465 /**
0466 * @def KDE_MUST_USE_RESULT
0467 * @ingroup KDEMacros
0468 *
0469 * The KDE_MUST_USE_RESULT macro can be used to tell the compiler that
0470 * a particular functions return value must be checked.
0471 */
0472
0473 #ifdef __GNUC__
0474 #define KDE_MUST_USE_RESULT __attribute__((__warn_unused_result__))
0475 #else
0476 #define KDE_MUST_USE_RESULT
0477 #endif
0478
0479
0480
0481 #endif /* _KDE_MACROS_H_ */