| 1 | /* |
| 2 | Copyright 2005-2013 Intel Corporation. All Rights Reserved. |
| 3 | |
| 4 | This file is part of Threading Building Blocks. |
| 5 | |
| 6 | Threading Building Blocks is free software; you can redistribute it |
| 7 | and/or modify it under the terms of the GNU General Public License |
| 8 | version 2 as published by the Free Software Foundation. |
| 9 | |
| 10 | Threading Building Blocks is distributed in the hope that it will be |
| 11 | useful, but WITHOUT ANY WARRANTY; without even the implied warranty |
| 12 | of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | GNU General Public License for more details. |
| 14 | |
| 15 | You should have received a copy of the GNU General Public License |
| 16 | along with Threading Building Blocks; if not, write to the Free Software |
| 17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 18 | |
| 19 | As a special exception, you may use this file as part of a free software |
| 20 | library without restriction. Specifically, if other files instantiate |
| 21 | templates or use macros or inline functions from this file, or you compile |
| 22 | this file and link it with other files to produce an executable, this |
| 23 | file does not by itself cause the resulting executable to be covered by |
| 24 | the GNU General Public License. This exception does not however |
| 25 | invalidate any other reasons why the executable file might be covered by |
| 26 | the GNU General Public License. |
| 27 | */ |
| 28 | |
| 29 | #ifndef __TBB_tbb_stddef_H |
| 30 | #define __TBB_tbb_stddef_H |
| 31 | |
| 32 | // Marketing-driven product version |
| 33 | #define TBB_VERSION_MAJOR 4 |
| 34 | #define TBB_VERSION_MINOR 2 |
| 35 | |
| 36 | // Engineering-focused interface version |
| 37 | #define TBB_INTERFACE_VERSION 7000 |
| 38 | #define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000 |
| 39 | |
| 40 | // The oldest major interface version still supported |
| 41 | // To be used in SONAME, manifests, etc. |
| 42 | #define TBB_COMPATIBLE_INTERFACE_VERSION 2 |
| 43 | |
| 44 | #define __TBB_STRING_AUX(x) #x |
| 45 | #define __TBB_STRING(x) __TBB_STRING_AUX(x) |
| 46 | |
| 47 | // We do not need defines below for resource processing on windows |
| 48 | #if !defined RC_INVOKED |
| 49 | |
| 50 | // Define groups for Doxygen documentation |
| 51 | /** |
| 52 | * @defgroup algorithms Algorithms |
| 53 | * @defgroup containers Containers |
| 54 | * @defgroup memory_allocation Memory Allocation |
| 55 | * @defgroup synchronization Synchronization |
| 56 | * @defgroup timing Timing |
| 57 | * @defgroup task_scheduling Task Scheduling |
| 58 | */ |
| 59 | |
| 60 | // Simple text that is displayed on the main page of Doxygen documentation. |
| 61 | /** |
| 62 | * \mainpage Main Page |
| 63 | * |
| 64 | * Click the tabs above for information about the |
| 65 | * - <a href="./modules.html">Modules</a> (groups of functionality) implemented by the library |
| 66 | * - <a href="./annotated.html">Classes</a> provided by the library |
| 67 | * - <a href="./files.html">Files</a> constituting the library. |
| 68 | * . |
| 69 | * Please note that significant part of TBB functionality is implemented in the form of |
| 70 | * template functions, descriptions of which are not accessible on the <a href="./annotated.html">Classes</a> |
| 71 | * tab. Use <a href="./modules.html">Modules</a> or <a href="./namespacemembers.html">Namespace/Namespace Members</a> |
| 72 | * tabs to find them. |
| 73 | * |
| 74 | * Additional pieces of information can be found here |
| 75 | * - \subpage concepts |
| 76 | * . |
| 77 | */ |
| 78 | |
| 79 | /** \page concepts TBB concepts |
| 80 | |
| 81 | A concept is a set of requirements to a type, which are necessary and sufficient |
| 82 | for the type to model a particular behavior or a set of behaviors. Some concepts |
| 83 | are specific to a particular algorithm (e.g. algorithm body), while other ones |
| 84 | are common to several algorithms (e.g. range concept). |
| 85 | |
| 86 | All TBB algorithms make use of different classes implementing various concepts. |
| 87 | Implementation classes are supplied by the user as type arguments of template |
| 88 | parameters and/or as objects passed as function call arguments. The library |
| 89 | provides predefined implementations of some concepts (e.g. several kinds of |
| 90 | \ref range_req "ranges"), while other ones must always be implemented by the user. |
| 91 | |
| 92 | TBB defines a set of minimal requirements each concept must conform to. Here is |
| 93 | the list of different concepts hyperlinked to the corresponding requirements specifications: |
| 94 | - \subpage range_req |
| 95 | - \subpage parallel_do_body_req |
| 96 | - \subpage parallel_for_body_req |
| 97 | - \subpage parallel_reduce_body_req |
| 98 | - \subpage parallel_scan_body_req |
| 99 | - \subpage parallel_sort_iter_req |
| 100 | **/ |
| 101 | |
| 102 | // tbb_config.h should be included the first since it contains macro definitions used in other headers |
| 103 | #include "tbb_config.h" |
| 104 | |
| 105 | #if _MSC_VER >=1400 |
| 106 | #define __TBB_EXPORTED_FUNC __cdecl |
| 107 | #define __TBB_EXPORTED_METHOD __thiscall |
| 108 | #else |
| 109 | #define __TBB_EXPORTED_FUNC |
| 110 | #define __TBB_EXPORTED_METHOD |
| 111 | #endif |
| 112 | |
| 113 | #if __INTEL_COMPILER || _MSC_VER |
| 114 | #define __TBB_NOINLINE(decl) __declspec(noinline) decl |
| 115 | #elif __GNUC__ |
| 116 | #define __TBB_NOINLINE(decl) decl __attribute__ ((noinline)) |
| 117 | #else |
| 118 | #define __TBB_NOINLINE(decl) decl |
| 119 | #endif |
| 120 | |
| 121 | #include <cstddef> /* Need size_t and ptrdiff_t */ |
| 122 | |
| 123 | #if _MSC_VER |
| 124 | #define __TBB_tbb_windef_H |
| 125 | #include "internal/_tbb_windef.h" |
| 126 | #undef __TBB_tbb_windef_H |
| 127 | #endif |
| 128 | #if !defined(_MSC_VER) || _MSC_VER>=1600 |
| 129 | #include <stdint.h> |
| 130 | #endif |
| 131 | |
| 132 | //! Type for an assertion handler |
| 133 | typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * ); |
| 134 | |
| 135 | #if TBB_USE_ASSERT |
| 136 | |
| 137 | #define __TBB_ASSERT_NS(predicate,message,ns) ((predicate)?((void)0) : ns::assertion_failure(__FILE__,__LINE__,#predicate,message)) |
| 138 | //! Assert that x is true. |
| 139 | /** If x is false, print assertion failure message. |
| 140 | If the comment argument is not NULL, it is printed as part of the failure message. |
| 141 | The comment argument has no other effect. */ |
| 142 | #if __TBBMALLOC_BUILD |
| 143 | namespace rml { namespace internal { |
| 144 | #define __TBB_ASSERT(predicate,message) __TBB_ASSERT_NS(predicate,message,rml::internal) |
| 145 | #else |
| 146 | namespace tbb { |
| 147 | #define __TBB_ASSERT(predicate,message) __TBB_ASSERT_NS(predicate,message,tbb) |
| 148 | #endif |
| 149 | |
| 150 | #define __TBB_ASSERT_EX __TBB_ASSERT |
| 151 | |
| 152 | //! Set assertion handler and return previous value of it. |
| 153 | assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler ); |
| 154 | |
| 155 | //! Process an assertion failure. |
| 156 | /** Normally called from __TBB_ASSERT macro. |
| 157 | If assertion handler is null, print message for assertion failure and abort. |
| 158 | Otherwise call the assertion handler. */ |
| 159 | void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment ); |
| 160 | |
| 161 | #if __TBBMALLOC_BUILD |
| 162 | }} // namespace rml::internal |
| 163 | #else |
| 164 | } // namespace tbb |
| 165 | #endif |
| 166 | #else /* !TBB_USE_ASSERT */ |
| 167 | |
| 168 | //! No-op version of __TBB_ASSERT. |
| 169 | #define __TBB_ASSERT(predicate,comment) ((void)0) |
| 170 | //! "Extended" version is useful to suppress warnings if a variable is only used with an assert |
| 171 | #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate))) |
| 172 | |
| 173 | #endif /* !TBB_USE_ASSERT */ |
| 174 | |
| 175 | //! The namespace tbb contains all components of the library. |
| 176 | namespace tbb { |
| 177 | |
| 178 | #if _MSC_VER && _MSC_VER<1600 |
| 179 | namespace internal { |
| 180 | typedef __int8 int8_t; |
| 181 | typedef __int16 int16_t; |
| 182 | typedef __int32 int32_t; |
| 183 | typedef __int64 int64_t; |
| 184 | typedef unsigned __int8 uint8_t; |
| 185 | typedef unsigned __int16 uint16_t; |
| 186 | typedef unsigned __int32 uint32_t; |
| 187 | typedef unsigned __int64 uint64_t; |
| 188 | } // namespace internal |
| 189 | #else /* Posix */ |
| 190 | namespace internal { |
| 191 | using ::int8_t; |
| 192 | using ::int16_t; |
| 193 | using ::int32_t; |
| 194 | using ::int64_t; |
| 195 | using ::uint8_t; |
| 196 | using ::uint16_t; |
| 197 | using ::uint32_t; |
| 198 | using ::uint64_t; |
| 199 | } // namespace internal |
| 200 | #endif /* Posix */ |
| 201 | |
| 202 | using std::size_t; |
| 203 | using std::ptrdiff_t; |
| 204 | |
| 205 | //! The function returns the interface version of the TBB shared library being used. |
| 206 | /** |
| 207 | * The version it returns is determined at runtime, not at compile/link time. |
| 208 | * So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time. |
| 209 | */ |
| 210 | extern "C" int __TBB_EXPORTED_FUNC TBB_runtime_interface_version(); |
| 211 | |
| 212 | //! Dummy type that distinguishes splitting constructor from copy constructor. |
| 213 | /** |
| 214 | * See description of parallel_for and parallel_reduce for example usages. |
| 215 | * @ingroup algorithms |
| 216 | */ |
| 217 | class split { |
| 218 | }; |
| 219 | |
| 220 | /** |
| 221 | * @cond INTERNAL |
| 222 | * @brief Identifiers declared inside namespace internal should never be used directly by client code. |
| 223 | */ |
| 224 | namespace internal { |
| 225 | |
| 226 | //! Compile-time constant that is upper bound on cache line/sector size. |
| 227 | /** It should be used only in situations where having a compile-time upper |
| 228 | bound is more useful than a run-time exact answer. |
| 229 | @ingroup memory_allocation */ |
| 230 | const size_t NFS_MaxLineSize = 128; |
| 231 | |
| 232 | /** Label for data that may be accessed from different threads, and that may eventually become wrapped |
| 233 | in a formal atomic type. |
| 234 | |
| 235 | Note that no problems have yet been observed relating to the definition currently being empty, |
| 236 | even if at least "volatile" would seem to be in order to avoid data sometimes temporarily hiding |
| 237 | in a register (although "volatile" as a "poor man's atomic" lacks several other features of a proper |
| 238 | atomic, some of which are now provided instead through specialized functions). |
| 239 | |
| 240 | Note that usage is intentionally compatible with a definition as qualifier "volatile", |
| 241 | both as a way to have the compiler help enforce use of the label and to quickly rule out |
| 242 | one potential issue. |
| 243 | |
| 244 | Note however that, with some architecture/compiler combinations, e.g. on IA-64 architecture, "volatile" |
| 245 | also has non-portable memory semantics that are needlessly expensive for "relaxed" operations. |
| 246 | |
| 247 | Note that this must only be applied to data that will not change bit patterns when cast to/from |
| 248 | an integral type of the same length; tbb::atomic must be used instead for, e.g., floating-point types. |
| 249 | |
| 250 | TODO: apply wherever relevant **/ |
| 251 | #define __TBB_atomic // intentionally empty, see above |
| 252 | |
| 253 | template<class T, int S> |
| 254 | struct padded_base : T { |
| 255 | char pad[NFS_MaxLineSize - sizeof(T) % NFS_MaxLineSize]; |
| 256 | }; |
| 257 | template<class T> struct padded_base<T, 0> : T {}; |
| 258 | |
| 259 | //! Pads type T to fill out to a multiple of cache line size. |
| 260 | template<class T> |
| 261 | struct padded : padded_base<T, sizeof(T)> {}; |
| 262 | |
| 263 | //! Extended variant of the standard offsetof macro |
| 264 | /** The standard offsetof macro is not sufficient for TBB as it can be used for |
| 265 | POD-types only. The constant 0x1000 (not NULL) is necessary to appease GCC. **/ |
| 266 | #define __TBB_offsetof(class_name, member_name) \ |
| 267 | ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000) |
| 268 | |
| 269 | //! Returns address of the object containing a member with the given name and address |
| 270 | #define __TBB_get_object_ref(class_name, member_name, member_addr) \ |
| 271 | (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name))) |
| 272 | |
| 273 | //! Throws std::runtime_error with what() returning error_code description prefixed with aux_info |
| 274 | void __TBB_EXPORTED_FUNC handle_perror( int error_code, const char* aux_info ); |
| 275 | |
| 276 | #if TBB_USE_EXCEPTIONS |
| 277 | #define __TBB_TRY try |
| 278 | #define __TBB_CATCH(e) catch(e) |
| 279 | #define __TBB_THROW(e) throw e |
| 280 | #define __TBB_RETHROW() throw |
| 281 | #else /* !TBB_USE_EXCEPTIONS */ |
| 282 | inline bool __TBB_false() { return false; } |
| 283 | #define __TBB_TRY |
| 284 | #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() ) |
| 285 | #define __TBB_THROW(e) ((void)0) |
| 286 | #define __TBB_RETHROW() ((void)0) |
| 287 | #endif /* !TBB_USE_EXCEPTIONS */ |
| 288 | |
| 289 | //! Report a runtime warning. |
| 290 | void __TBB_EXPORTED_FUNC runtime_warning( const char* format, ... ); |
| 291 | |
| 292 | #if TBB_USE_ASSERT |
| 293 | static void* const poisoned_ptr = reinterpret_cast<void*>(-1); |
| 294 | |
| 295 | //! Set p to invalid pointer value. |
| 296 | template<typename T> |
| 297 | inline void poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); } |
| 298 | |
| 299 | /** Expected to be used in assertions only, thus no empty form is defined. **/ |
| 300 | template<typename T> |
| 301 | inline bool is_poisoned( T* p ) { return p == reinterpret_cast<T*>(poisoned_ptr); } |
| 302 | #else |
| 303 | template<typename T> |
| 304 | inline void poison_pointer( T* ) {/*do nothing*/} |
| 305 | #endif /* !TBB_USE_ASSERT */ |
| 306 | |
| 307 | //! Cast between unrelated pointer types. |
| 308 | /** This method should be used sparingly as a last resort for dealing with |
| 309 | situations that inherently break strict ISO C++ aliasing rules. */ |
| 310 | // T is a pointer type because it will be explicitly provided by the programmer as a template argument; |
| 311 | // U is a referent type to enable the compiler to check that "ptr" is a pointer, deducing U in the process. |
| 312 | template<typename T, typename U> |
| 313 | inline T punned_cast( U* ptr ) { |
| 314 | uintptr_t x = reinterpret_cast<uintptr_t>(ptr); |
| 315 | return reinterpret_cast<T>(x); |
| 316 | } |
| 317 | |
| 318 | //! Base class for types that should not be assigned. |
| 319 | class no_assign { |
| 320 | // Deny assignment |
| 321 | void operator=( const no_assign& ); |
| 322 | public: |
| 323 | #if __GNUC__ |
| 324 | //! Explicitly define default construction, because otherwise gcc issues gratuitous warning. |
| 325 | no_assign() {} |
| 326 | #endif /* __GNUC__ */ |
| 327 | }; |
| 328 | |
| 329 | //! Base class for types that should not be copied or assigned. |
| 330 | class no_copy: no_assign { |
| 331 | //! Deny copy construction |
| 332 | no_copy( const no_copy& ); |
| 333 | public: |
| 334 | //! Allow default construction |
| 335 | no_copy() {} |
| 336 | }; |
| 337 | |
| 338 | //! Class for determining type of std::allocator<T>::value_type. |
| 339 | template<typename T> |
| 340 | struct allocator_type { |
| 341 | typedef T value_type; |
| 342 | }; |
| 343 | |
| 344 | #if _MSC_VER |
| 345 | //! Microsoft std::allocator has non-standard extension that strips const from a type. |
| 346 | template<typename T> |
| 347 | struct allocator_type<const T> { |
| 348 | typedef T value_type; |
| 349 | }; |
| 350 | #endif |
| 351 | |
| 352 | //! A template to select either 32-bit or 64-bit constant as compile time, depending on machine word size. |
| 353 | template <unsigned u, unsigned long long ull > |
| 354 | struct select_size_t_constant { |
| 355 | //Explicit cast is needed to avoid compiler warnings about possible truncation. |
| 356 | //The value of the right size, which is selected by ?:, is anyway not truncated or promoted. |
| 357 | static const size_t value = (size_t)((sizeof(size_t)==sizeof(u)) ? u : ull); |
| 358 | }; |
| 359 | |
| 360 | //! A function to check if passed in pointer is aligned on a specific border |
| 361 | template<typename T> |
| 362 | inline bool is_aligned(T* pointer, uintptr_t alignment) { |
| 363 | return 0==((uintptr_t)pointer & (alignment-1)); |
| 364 | } |
| 365 | |
| 366 | //! A function to check if passed integer is a power of 2 |
| 367 | template<typename integer_type> |
| 368 | inline bool is_power_of_two(integer_type arg) { |
| 369 | return arg && (0 == (arg & (arg - 1))); |
| 370 | } |
| 371 | |
| 372 | //! A function to compute arg modulo divisor where divisor is a power of 2. |
| 373 | template<typename argument_integer_type, typename divisor_integer_type> |
| 374 | inline argument_integer_type modulo_power_of_two(argument_integer_type arg, divisor_integer_type divisor) { |
| 375 | // Divisor is assumed to be a power of two (which is valid for current uses). |
| 376 | __TBB_ASSERT( is_power_of_two(divisor), "Divisor should be a power of two" ); |
| 377 | return (arg & (divisor - 1)); |
| 378 | } |
| 379 | |
| 380 | |
| 381 | //! A function to determine if "arg is a multiplication of a number and a power of 2". |
| 382 | // i.e. for strictly positive i and j, with j a power of 2, |
| 383 | // determines whether i==j<<k for some nonnegative k (so i==j yields true). |
| 384 | template<typename argument_integer_type, typename divisor_integer_type> |
| 385 | inline bool is_power_of_two_factor(argument_integer_type arg, divisor_integer_type divisor) { |
| 386 | // Divisor is assumed to be a power of two (which is valid for current uses). |
| 387 | __TBB_ASSERT( is_power_of_two(divisor), "Divisor should be a power of two" ); |
| 388 | return 0 == (arg & (arg - divisor)); |
| 389 | } |
| 390 | |
| 391 | //! Utility template function to prevent "unused" warnings by various compilers. |
| 392 | template<typename T> |
| 393 | void suppress_unused_warning( const T& ) {} |
| 394 | |
| 395 | // Struct to be used as a version tag for inline functions. |
| 396 | /** Version tag can be necessary to prevent loader on Linux from using the wrong |
| 397 | symbol in debug builds (when inline functions are compiled as out-of-line). **/ |
| 398 | struct version_tag_v3 {}; |
| 399 | |
| 400 | typedef version_tag_v3 version_tag; |
| 401 | |
| 402 | } // internal |
| 403 | //! @endcond |
| 404 | |
| 405 | } // tbb |
| 406 | |
| 407 | namespace tbb { namespace internal { |
| 408 | template <bool condition> |
| 409 | struct STATIC_ASSERTION_FAILED; |
| 410 | |
| 411 | template <> |
| 412 | struct STATIC_ASSERTION_FAILED<false> { enum {value=1};}; |
| 413 | |
| 414 | template<> |
| 415 | struct STATIC_ASSERTION_FAILED<true>; //intentionally left undefined to cause compile time error |
| 416 | }} // namespace tbb { namespace internal { |
| 417 | |
| 418 | #if __TBB_STATIC_ASSERT_PRESENT |
| 419 | #define __TBB_STATIC_ASSERT(condition,msg) static_assert(condition,msg) |
| 420 | #else |
| 421 | //please note condition is intentionally inverted to get a bit more understandable error msg |
| 422 | #define __TBB_STATIC_ASSERT_IMPL1(condition,msg,line) \ |
| 423 | enum {static_assert_on_line_##line = tbb::internal::STATIC_ASSERTION_FAILED<!(condition)>::value} |
| 424 | |
| 425 | #define __TBB_STATIC_ASSERT_IMPL(condition,msg,line) __TBB_STATIC_ASSERT_IMPL1(condition,msg,line) |
| 426 | //! Verify at compile time that passed in condition is hold |
| 427 | #define __TBB_STATIC_ASSERT(condition,msg) __TBB_STATIC_ASSERT_IMPL(condition,msg,__LINE__) |
| 428 | #endif |
| 429 | |
| 430 | #endif /* RC_INVOKED */ |
| 431 | #endif /* __TBB_tbb_stddef_H */ |
| 432 | |