Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-11-15 09:58:38

0001 /*
0002     Copyright (c) 2005-2020 Intel Corporation
0003 
0004     Licensed under the Apache License, Version 2.0 (the "License");
0005     you may not use this file except in compliance with the License.
0006     You may obtain a copy of the License at
0007 
0008         http://www.apache.org/licenses/LICENSE-2.0
0009 
0010     Unless required by applicable law or agreed to in writing, software
0011     distributed under the License is distributed on an "AS IS" BASIS,
0012     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0013     See the License for the specific language governing permissions and
0014     limitations under the License.
0015 */
0016 
0017 #ifndef __TBB_tbb_stddef_H
0018 #define __TBB_tbb_stddef_H
0019 
0020 // Marketing-driven product version
0021 #define TBB_VERSION_MAJOR 2020
0022 #define TBB_VERSION_MINOR 3
0023 
0024 // Engineering-focused interface version
0025 #define TBB_INTERFACE_VERSION 11103
0026 #define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000
0027 
0028 // The oldest major interface version still supported
0029 // To be used in SONAME, manifests, etc.
0030 #define TBB_COMPATIBLE_INTERFACE_VERSION 2
0031 
0032 #define __TBB_STRING_AUX(x) #x
0033 #define __TBB_STRING(x) __TBB_STRING_AUX(x)
0034 
0035 // We do not need defines below for resource processing on windows
0036 #if !defined RC_INVOKED
0037 
0038 // Define groups for Doxygen documentation
0039 /**
0040  * @defgroup algorithms         Algorithms
0041  * @defgroup containers         Containers
0042  * @defgroup memory_allocation  Memory Allocation
0043  * @defgroup synchronization    Synchronization
0044  * @defgroup timing             Timing
0045  * @defgroup task_scheduling    Task Scheduling
0046  */
0047 
0048 // Simple text that is displayed on the main page of Doxygen documentation.
0049 /**
0050  * \mainpage Main Page
0051  *
0052  * Click the tabs above for information about the
0053  * - <a href="./modules.html">Modules</a> (groups of functionality) implemented by the library
0054  * - <a href="./annotated.html">Classes</a> provided by the library
0055  * - <a href="./files.html">Files</a> constituting the library.
0056  * .
0057  * Please note that significant part of TBB functionality is implemented in the form of
0058  * template functions, descriptions of which are not accessible on the <a href="./annotated.html">Classes</a>
0059  * tab. Use <a href="./modules.html">Modules</a> or <a href="./namespacemembers.html">Namespace/Namespace Members</a>
0060  * tabs to find them.
0061  *
0062  * Additional pieces of information can be found here
0063  * - \subpage concepts
0064  * .
0065  */
0066 
0067 /** \page concepts TBB concepts
0068 
0069     A concept is a set of requirements to a type, which are necessary and sufficient
0070     for the type to model a particular behavior or a set of behaviors. Some concepts
0071     are specific to a particular algorithm (e.g. algorithm body), while other ones
0072     are common to several algorithms (e.g. range concept).
0073 
0074     All TBB algorithms make use of different classes implementing various concepts.
0075     Implementation classes are supplied by the user as type arguments of template
0076     parameters and/or as objects passed as function call arguments. The library
0077     provides predefined  implementations of some concepts (e.g. several kinds of
0078     \ref range_req "ranges"), while other ones must always be implemented by the user.
0079 
0080     TBB defines a set of minimal requirements each concept must conform to. Here is
0081     the list of different concepts hyperlinked to the corresponding requirements specifications:
0082     - \subpage range_req
0083     - \subpage parallel_do_body_req
0084     - \subpage parallel_for_body_req
0085     - \subpage parallel_reduce_body_req
0086     - \subpage parallel_scan_body_req
0087     - \subpage parallel_sort_iter_req
0088 **/
0089 
0090 // tbb_config.h should be included the first since it contains macro definitions used in other headers
0091 #include "tbb_config.h"
0092 
0093 #if _MSC_VER >=1400
0094     #define __TBB_EXPORTED_FUNC   __cdecl
0095     #define __TBB_EXPORTED_METHOD __thiscall
0096 #else
0097     #define __TBB_EXPORTED_FUNC
0098     #define __TBB_EXPORTED_METHOD
0099 #endif
0100 
0101 #if __INTEL_COMPILER || _MSC_VER
0102 #define __TBB_NOINLINE(decl) __declspec(noinline) decl
0103 #elif __GNUC__
0104 #define __TBB_NOINLINE(decl) decl __attribute__ ((noinline))
0105 #else
0106 #define __TBB_NOINLINE(decl) decl
0107 #endif
0108 
0109 #if __TBB_NOEXCEPT_PRESENT
0110 #define __TBB_NOEXCEPT(expression) noexcept(expression)
0111 #else
0112 #define __TBB_NOEXCEPT(expression)
0113 #endif
0114 
0115 #include <cstddef>      /* Need size_t and ptrdiff_t */
0116 
0117 #if _MSC_VER
0118     #define __TBB_tbb_windef_H
0119     #include "internal/_tbb_windef.h"
0120     #undef __TBB_tbb_windef_H
0121 #endif
0122 #if !defined(_MSC_VER) || _MSC_VER>=1600
0123     #include <stdint.h>
0124 #endif
0125 
0126 //! Type for an assertion handler
0127 typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment );
0128 
0129 #if __TBBMALLOC_BUILD
0130 namespace rml { namespace internal {
0131  #define __TBB_ASSERT_RELEASE(predicate,message) ((predicate)?((void)0) : rml::internal::assertion_failure(__FILE__,__LINE__,#predicate,message))
0132 #else
0133 namespace tbb {
0134  #define __TBB_ASSERT_RELEASE(predicate,message) ((predicate)?((void)0) : tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))
0135 #endif
0136 
0137     //! Set assertion handler and return previous value of it.
0138     assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler );
0139 
0140     //! Process an assertion failure.
0141     /** Normally called from __TBB_ASSERT macro.
0142         If assertion handler is null, print message for assertion failure and abort.
0143         Otherwise call the assertion handler. */
0144     void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment );
0145 
0146 #if __TBBMALLOC_BUILD
0147 }}  // namespace rml::internal
0148 #else
0149 } // namespace tbb
0150 #endif
0151 
0152 #if TBB_USE_ASSERT
0153 
0154     //! Assert that predicate is true.
0155     /** If predicate is false, print assertion failure message.
0156         If the comment argument is not NULL, it is printed as part of the failure message.
0157         The comment argument has no other effect. */
0158     #define __TBB_ASSERT(predicate,message) __TBB_ASSERT_RELEASE(predicate,message)
0159 
0160     #define __TBB_ASSERT_EX __TBB_ASSERT
0161 
0162 #else /* !TBB_USE_ASSERT */
0163 
0164     //! No-op version of __TBB_ASSERT.
0165     #define __TBB_ASSERT(predicate,comment) ((void)0)
0166     //! "Extended" version is useful to suppress warnings if a variable is only used with an assert
0167     #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))
0168 
0169 #endif /* !TBB_USE_ASSERT */
0170 
0171 //! The namespace tbb contains all components of the library.
0172 namespace tbb {
0173 
0174     namespace internal {
0175 #if _MSC_VER && _MSC_VER<1600
0176         typedef __int8 int8_t;
0177         typedef __int16 int16_t;
0178         typedef __int32 int32_t;
0179         typedef __int64 int64_t;
0180         typedef unsigned __int8 uint8_t;
0181         typedef unsigned __int16 uint16_t;
0182         typedef unsigned __int32 uint32_t;
0183         typedef unsigned __int64 uint64_t;
0184 #else /* Posix */
0185         using ::int8_t;
0186         using ::int16_t;
0187         using ::int32_t;
0188         using ::int64_t;
0189         using ::uint8_t;
0190         using ::uint16_t;
0191         using ::uint32_t;
0192         using ::uint64_t;
0193 #endif /* Posix */
0194     } // namespace internal
0195 
0196     using std::size_t;
0197     using std::ptrdiff_t;
0198 
0199 //! The function returns the interface version of the TBB shared library being used.
0200 /**
0201  * The version it returns is determined at runtime, not at compile/link time.
0202  * So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time.
0203  */
0204 extern "C" int __TBB_EXPORTED_FUNC TBB_runtime_interface_version();
0205 
0206 /**
0207  * @cond INTERNAL
0208  * @brief Identifiers declared inside namespace internal should never be used directly by client code.
0209  */
0210 namespace internal {
0211 
0212 //! Compile-time constant that is upper bound on cache line/sector size.
0213 /** It should be used only in situations where having a compile-time upper
0214     bound is more useful than a run-time exact answer.
0215     @ingroup memory_allocation */
0216 const size_t NFS_MaxLineSize = 128;
0217 
0218 /** Label for data that may be accessed from different threads, and that may eventually become wrapped
0219     in a formal atomic type.
0220 
0221     Note that no problems have yet been observed relating to the definition currently being empty,
0222     even if at least "volatile" would seem to be in order to avoid data sometimes temporarily hiding
0223     in a register (although "volatile" as a "poor man's atomic" lacks several other features of a proper
0224     atomic, some of which are now provided instead through specialized functions).
0225 
0226     Note that usage is intentionally compatible with a definition as qualifier "volatile",
0227     both as a way to have the compiler help enforce use of the label and to quickly rule out
0228     one potential issue.
0229 
0230     Note however that, with some architecture/compiler combinations, e.g. on IA-64 architecture, "volatile"
0231     also has non-portable memory semantics that are needlessly expensive for "relaxed" operations.
0232 
0233     Note that this must only be applied to data that will not change bit patterns when cast to/from
0234     an integral type of the same length; tbb::atomic must be used instead for, e.g., floating-point types.
0235 
0236     TODO: apply wherever relevant **/
0237 #define __TBB_atomic // intentionally empty, see above
0238 
0239 #if __TBB_OVERRIDE_PRESENT
0240 #define __TBB_override override
0241 #else
0242 #define __TBB_override // formal comment only
0243 #endif
0244 
0245 #if __TBB_CPP17_FALLTHROUGH_PRESENT
0246 #define __TBB_fallthrough [[fallthrough]]
0247 #elif __TBB_FALLTHROUGH_PRESENT
0248 #define __TBB_fallthrough __attribute__ ((fallthrough))
0249 #else
0250 #define __TBB_fallthrough
0251 #endif
0252 
0253 template<class T, size_t S, size_t R>
0254 struct padded_base : T {
0255     char pad[S - R];
0256 };
0257 template<class T, size_t S> struct padded_base<T, S, 0> : T {};
0258 
0259 //! Pads type T to fill out to a multiple of cache line size.
0260 template<class T, size_t S = NFS_MaxLineSize>
0261 struct padded : padded_base<T, S, sizeof(T) % S> {};
0262 
0263 //! Extended variant of the standard offsetof macro
0264 /** The standard offsetof macro is not sufficient for TBB as it can be used for
0265     POD-types only. The constant 0x1000 (not NULL) is necessary to appease GCC. **/
0266 #define __TBB_offsetof(class_name, member_name) \
0267     ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
0268 
0269 //! Returns address of the object containing a member with the given name and address
0270 #define __TBB_get_object_ref(class_name, member_name, member_addr) \
0271     (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))
0272 
0273 //! Throws std::runtime_error with what() returning error_code description prefixed with aux_info
0274 void __TBB_EXPORTED_FUNC handle_perror( int error_code, const char* aux_info );
0275 
0276 #if TBB_USE_EXCEPTIONS
0277     #define __TBB_TRY try
0278     #define __TBB_CATCH(e) catch(e)
0279     #define __TBB_THROW(e) throw e
0280     #define __TBB_RETHROW() throw
0281 #else /* !TBB_USE_EXCEPTIONS */
0282     inline bool __TBB_false() { return false; }
0283     #define __TBB_TRY
0284     #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )
0285     #define __TBB_THROW(e) tbb::internal::suppress_unused_warning(e)
0286     #define __TBB_RETHROW() ((void)0)
0287 #endif /* !TBB_USE_EXCEPTIONS */
0288 
0289 //! Report a runtime warning.
0290 void __TBB_EXPORTED_FUNC runtime_warning( const char* format, ... );
0291 
0292 #if TBB_USE_ASSERT
0293 static void* const poisoned_ptr = reinterpret_cast<void*>(-1);
0294 
0295 //! Set p to invalid pointer value.
0296 //  Also works for regular (non-__TBB_atomic) pointers.
0297 template<typename T>
0298 inline void poison_pointer( T* __TBB_atomic & p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
0299 
0300 /** Expected to be used in assertions only, thus no empty form is defined. **/
0301 template<typename T>
0302 inline bool is_poisoned( T* p ) { return p == reinterpret_cast<T*>(poisoned_ptr); }
0303 #else
0304 template<typename T>
0305 inline void poison_pointer( T* __TBB_atomic & ) {/*do nothing*/}
0306 #endif /* !TBB_USE_ASSERT */
0307 
0308 //! Cast between unrelated pointer types.
0309 /** This method should be used sparingly as a last resort for dealing with
0310     situations that inherently break strict ISO C++ aliasing rules. */
0311 // T is a pointer type because it will be explicitly provided by the programmer as a template argument;
0312 // U is a referent type to enable the compiler to check that "ptr" is a pointer, deducing U in the process.
0313 template<typename T, typename U>
0314 inline T punned_cast( U* ptr ) {
0315     uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
0316     return reinterpret_cast<T>(x);
0317 }
0318 
0319 #if __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT
0320 
0321 //! Base class for types that should not be assigned.
0322 class no_assign {
0323 public:
0324     void operator=( const no_assign& ) = delete;
0325     no_assign( const no_assign& ) = default;
0326     no_assign() = default;
0327 };
0328 
0329 //! Base class for types that should not be copied or assigned.
0330 class no_copy: no_assign {
0331 public:
0332     no_copy( const no_copy& ) = delete;
0333     no_copy() = default;
0334 };
0335 
0336 #else /*__TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT*/
0337 
0338 //! Base class for types that should not be assigned.
0339 class no_assign {
0340     // Deny assignment
0341     void operator=( const no_assign& );
0342 public:
0343 #if __GNUC__
0344     //! Explicitly define default construction, because otherwise gcc issues gratuitous warning.
0345     no_assign() {}
0346 #endif /* __GNUC__ */
0347 };
0348 
0349 //! Base class for types that should not be copied or assigned.
0350 class no_copy: no_assign {
0351     //! Deny copy construction
0352     no_copy( const no_copy& );
0353 public:
0354     //! Allow default construction
0355     no_copy() {}
0356 };
0357 
0358 #endif /*__TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT*/
0359 
0360 #if TBB_DEPRECATED_MUTEX_COPYING
0361 class mutex_copy_deprecated_and_disabled {};
0362 #else
0363 // By default various implementations of mutexes are not copy constructible
0364 // and not copy assignable.
0365 class mutex_copy_deprecated_and_disabled : no_copy {};
0366 #endif
0367 
0368 //! A function to check if passed in pointer is aligned on a specific border
0369 template<typename T>
0370 inline bool is_aligned(T* pointer, uintptr_t alignment) {
0371     return 0==((uintptr_t)pointer & (alignment-1));
0372 }
0373 
0374 //! A function to check if passed integer is a power of 2
0375 template<typename integer_type>
0376 inline bool is_power_of_two(integer_type arg) {
0377     return arg && (0 == (arg & (arg - 1)));
0378 }
0379 
0380 //! A function to compute arg modulo divisor where divisor is a power of 2.
0381 template<typename argument_integer_type, typename divisor_integer_type>
0382 inline argument_integer_type modulo_power_of_two(argument_integer_type arg, divisor_integer_type divisor) {
0383     __TBB_ASSERT( is_power_of_two(divisor), "Divisor should be a power of two" );
0384     return (arg & (divisor - 1));
0385 }
0386 
0387 
0388 //! A function to determine if arg is a power of 2 at least as big as another power of 2.
0389 // i.e. for strictly positive i and j, with j being a power of 2,
0390 // determines whether i==j<<k for some nonnegative k (so i==j yields true).
0391 template<typename argument_integer_type, typename power2_integer_type>
0392 inline bool is_power_of_two_at_least(argument_integer_type arg, power2_integer_type power2) {
0393     __TBB_ASSERT( is_power_of_two(power2), "Divisor should be a power of two" );
0394     return 0 == (arg & (arg - power2));
0395 }
0396 
0397 //! Utility template function to prevent "unused" warnings by various compilers.
0398 template<typename T1> void suppress_unused_warning( const T1& ) {}
0399 template<typename T1, typename T2> void suppress_unused_warning( const T1&, const T2& ) {}
0400 template<typename T1, typename T2, typename T3> void suppress_unused_warning( const T1&, const T2&, const T3& ) {}
0401 
0402 // Struct to be used as a version tag for inline functions.
0403 /** Version tag can be necessary to prevent loader on Linux from using the wrong
0404     symbol in debug builds (when inline functions are compiled as out-of-line). **/
0405 struct version_tag_v3 {};
0406 
0407 typedef version_tag_v3 version_tag;
0408 
0409 } // internal
0410 
0411 //! Dummy type that distinguishes splitting constructor from copy constructor.
0412 /**
0413  * See description of parallel_for and parallel_reduce for example usages.
0414  * @ingroup algorithms
0415  */
0416 class split {
0417 };
0418 
0419 //! Type enables transmission of splitting proportion from partitioners to range objects
0420 /**
0421  * In order to make use of such facility Range objects must implement
0422  * splitting constructor with this type passed and initialize static
0423  * constant boolean field 'is_splittable_in_proportion' with the value
0424  * of 'true'
0425  */
0426 class proportional_split: internal::no_assign {
0427 public:
0428     proportional_split(size_t _left = 1, size_t _right = 1) : my_left(_left), my_right(_right) { }
0429 
0430     size_t left() const { return my_left; }
0431     size_t right() const { return my_right; }
0432 
0433     // used when range does not support proportional split
0434     operator split() const { return split(); }
0435 
0436 #if __TBB_ENABLE_RANGE_FEEDBACK
0437     void set_proportion(size_t _left, size_t _right) {
0438         my_left = _left;
0439         my_right = _right;
0440     }
0441 #endif
0442 private:
0443     size_t my_left, my_right;
0444 };
0445 
0446 } // tbb
0447 
0448 // Following is a set of classes and functions typically used in compile-time "metaprogramming".
0449 // TODO: move all that to a separate header
0450 
0451 #if __TBB_CPP11_SMART_POINTERS_PRESENT
0452 #include <memory> // for unique_ptr
0453 #endif
0454 
0455 #if __TBB_CPP11_RVALUE_REF_PRESENT || __TBB_CPP11_DECLTYPE_PRESENT || _LIBCPP_VERSION
0456 #include <utility> // for std::move, std::forward, std::declval
0457 #endif
0458 
0459 namespace tbb {
0460 namespace internal {
0461 
0462 #if __TBB_CPP11_SMART_POINTERS_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT
0463     template<typename T, typename... Args>
0464     std::unique_ptr<T> make_unique(Args&&... args) {
0465         return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
0466     }
0467 #endif
0468 
0469 //! Class for determining type of std::allocator<T>::value_type.
0470 template<typename T>
0471 struct allocator_type {
0472     typedef T value_type;
0473 };
0474 
0475 #if _MSC_VER
0476 //! Microsoft std::allocator has non-standard extension that strips const from a type.
0477 template<typename T>
0478 struct allocator_type<const T> {
0479     typedef T value_type;
0480 };
0481 #endif
0482 
0483 // Ad-hoc implementation of true_type & false_type
0484 // Intended strictly for internal use! For public APIs (traits etc), use C++11 analogues.
0485 template <bool v>
0486 struct bool_constant {
0487     static /*constexpr*/ const bool value = v;
0488 };
0489 typedef bool_constant<true> true_type;
0490 typedef bool_constant<false> false_type;
0491 
0492 //! A template to select either 32-bit or 64-bit constant as compile time, depending on machine word size.
0493 template <unsigned u, unsigned long long ull >
0494 struct select_size_t_constant {
0495     //Explicit cast is needed to avoid compiler warnings about possible truncation.
0496     //The value of the right size,   which is selected by ?:, is anyway not truncated or promoted.
0497     static const size_t value = (size_t)((sizeof(size_t)==sizeof(u)) ? u : ull);
0498 };
0499 
0500 #if __TBB_CPP11_RVALUE_REF_PRESENT
0501 using std::move;
0502 using std::forward;
0503 #elif defined(_LIBCPP_NAMESPACE)
0504 // libc++ defines "pre-C++11 move and forward" similarly to ours; use it to avoid name conflicts in some cases.
0505 using std::_LIBCPP_NAMESPACE::move;
0506 using std::_LIBCPP_NAMESPACE::forward;
0507 #else
0508 // It is assumed that cv qualifiers, if any, are part of the deduced type.
0509 template <typename T>
0510 T& move( T& x ) { return x; }
0511 template <typename T>
0512 T& forward( T& x ) { return x; }
0513 #endif /* __TBB_CPP11_RVALUE_REF_PRESENT */
0514 
0515 // Helper macros to simplify writing templates working with both C++03 and C++11.
0516 #if __TBB_CPP11_RVALUE_REF_PRESENT
0517 #define  __TBB_FORWARDING_REF(A) A&&
0518 #else
0519 // It is assumed that cv qualifiers, if any, are part of a deduced type.
0520 // Thus this macro should not be used in public interfaces.
0521 #define  __TBB_FORWARDING_REF(A) A&
0522 #endif
0523 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT
0524 #define __TBB_PARAMETER_PACK ...
0525 #define __TBB_PACK_EXPANSION(A) A...
0526 #else
0527 #define __TBB_PARAMETER_PACK
0528 #define __TBB_PACK_EXPANSION(A) A
0529 #endif /* __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */
0530 
0531 #if __TBB_CPP11_DECLTYPE_PRESENT
0532 #if __TBB_CPP11_DECLVAL_BROKEN
0533 // Ad-hoc implementation of std::declval
0534 template <class T> __TBB_FORWARDING_REF(T) declval() /*noexcept*/;
0535 #else
0536 using std::declval;
0537 #endif
0538 #endif
0539 
0540 template <bool condition>
0541 struct STATIC_ASSERTION_FAILED;
0542 
0543 template <>
0544 struct STATIC_ASSERTION_FAILED<false> { enum {value=1};};
0545 
0546 template<>
0547 struct STATIC_ASSERTION_FAILED<true>; //intentionally left undefined to cause compile time error
0548 
0549 //! @endcond
0550 }} // namespace tbb::internal
0551 
0552 #if __TBB_STATIC_ASSERT_PRESENT
0553 #define __TBB_STATIC_ASSERT(condition,msg) static_assert(condition,msg)
0554 #else
0555 //please note condition is intentionally inverted to get a bit more understandable error msg
0556 #define __TBB_STATIC_ASSERT_IMPL1(condition,msg,line)       \
0557     enum {static_assert_on_line_##line = tbb::internal::STATIC_ASSERTION_FAILED<!(condition)>::value}
0558 
0559 #define __TBB_STATIC_ASSERT_IMPL(condition,msg,line) __TBB_STATIC_ASSERT_IMPL1(condition,msg,line)
0560 //! Verify condition, at compile time
0561 #define __TBB_STATIC_ASSERT(condition,msg) __TBB_STATIC_ASSERT_IMPL(condition,msg,__LINE__)
0562 #endif
0563 
0564 #endif /* RC_INVOKED */
0565 #endif /* __TBB_tbb_stddef_H */