SpotifyiOS.xcframework/ios-arm64_x86_64-simulator/SpotifyiOS.framework/Headers/SPTMacros.h (84 lines of code) (raw):

#ifndef SPT_MACROS #define SPT_MACROS #ifdef __cplusplus #define SPT_EXPORT extern "C" __attribute__((visibility("default"))) #else #define SPT_EXPORT extern __attribute__((visibility("default"))) #endif // __cplusplus #define SPT_DEPRECATED(MESSAGE) __attribute__((deprecated(MESSAGE))) #define SPT_UNAVAILABLE __attribute__((unavailable)) #define SPT_UNUSED __attribute__((unused)) #define SPT_UNREACHABLE() __builtin_unreachable() #define SPT_INLINE __attribute__((always_inline)) inline #define SPT_CONST __attribute__((const)) #define SPT_PURE __attribute__((pure)) #define SPT_NONNULL __attribute__((nonnull)) #define SPT_RETURNS_NONNULL __attribute__((returns_nonnull)) #define SPT_EXPECT(EXPR, VAL) __builtin_expect(!!(EXPR), VAL) #define SPT_LIKELY(EXPR) SPT_EXPECT(EXPR, 1) #define SPT_UNLIKELY(EXPR) SPT_EXPECT(EXPR, 0) #define SPT_MAX_POW2(TYPE_MAX) ((TYPE_MAX >> 1) ^ TYPE_MAX) #define SPT_EXPR_OR_ZERO(EXPR) __builtin_choose_expr(SPT_TYPE_IS_VOID(EXPR), 0, (EXPR)) #define SPT_TYPE_IS_VOID(EXPR) __builtin_types_compatible_p(typeof(EXPR), void) /** Check if the receiver responds to a selector, then send the message, along with the provided parameters. The purpose of this macro, other than to make code less cluttered, is to make it impossible to accidentally check for a selector but send a different message. @param RECEIVER The object to which the message will be sent. @param RESULT[out] A pointer to which the return value will be assigned. @param ... 0-4 arguments. \code{.m} BOOL result = NO; SPT_OPTIONAL_MESSAGE_SEND(self.delegate, &result, someThingie, self, didSomethingWith, someObject); // Expands to the following: do { if ([self.delegate respondsToSelector:@selector(someThingie:didSomethingWith:)]) *(result) = [self.delegate someThingie:self didSomethingWith:someObject)]; } while (0); \endcode */ #define SPT_OPTIONAL_MESSAGE_SEND(RECEIVER, RESULT, ...) \ do { \ if ([RECEIVER respondsToSelector:@selector(SPT_CONCAT_SELECTOR(__VA_ARGS__))]) \ *(RESULT) = [RECEIVER SPT_CONCAT_METHOD(__VA_ARGS__)]; \ } while (0) /** Like SPT_OPTIONAL_MESSAGE_SEND but ignores the return value. @param RECEIVER The object to which the message will be sent. @param ... 0-4 arguments. */ #define SPT_OPTIONAL_MESSAGE_SEND_(RECEIVER, ...) \ do { \ if ([RECEIVER respondsToSelector:@selector(SPT_CONCAT_SELECTOR(__VA_ARGS__))]) \ [RECEIVER SPT_CONCAT_METHOD(__VA_ARGS__)]; \ } while (0) // Some boilerplate for SPT_OPTIONAL_MESSAGE_SEND[_] #define SPT_CONCAT_METHOD8(A, _1, B, _2, C, _3, D, _4) \ A: \ _1 B : _2 C : _3 D : _4 #define SPT_CONCAT_METHOD6(A, _1, B, _2, C, _3) \ A: \ _1 B : _2 C : _3 #define SPT_CONCAT_METHOD4(A, _1, B, _2) \ A: \ _1 B : _2 #define SPT_CONCAT_METHOD2(A, _1) \ A: \ _1 #define SPT_CONCAT_METHOD1(A) A #define SPT_CONCAT_SELECTOR8(A, _1, B, _2, C, _3, D, _4) \ A: \ B: \ C: \ D: #define SPT_CONCAT_SELECTOR6(A, _1, B, _2, C, _3) \ A: \ B: \ C: #define SPT_CONCAT_SELECTOR4(A, _1, B, _2) \ A: \ B: #define SPT_CONCAT_SELECTOR2(A, _1) \ A: #define SPT_CONCAT_SELECTOR1(A) A #define SPT_PICK_CONCAT_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, NAME, ...) NAME #define SPT_CONCAT_METHOD(...) \ SPT_PICK_CONCAT_MACRO(__VA_ARGS__, \ SPT_CONCAT_METHOD8, \ SPT_CONCAT_METHOD7, \ SPT_CONCAT_METHOD6, \ SPT_CONCAT_METHOD5, \ SPT_CONCAT_METHOD4, \ SPT_CONCAT_METHOD3, \ SPT_CONCAT_METHOD2, \ SPT_CONCAT_METHOD1) \ (__VA_ARGS__) #define SPT_CONCAT_SELECTOR(...) \ SPT_PICK_CONCAT_MACRO(__VA_ARGS__, \ SPT_CONCAT_SELECTOR8, \ SPT_CONCAT_SELECTOR7, \ SPT_CONCAT_SELECTOR6, \ SPT_CONCAT_SELECTOR5, \ SPT_CONCAT_SELECTOR4, \ SPT_CONCAT_SELECTOR3, \ SPT_CONCAT_SELECTOR2, \ SPT_CONCAT_SELECTOR1) \ (__VA_ARGS__) #endif // SPT_MACROS