BBAGlobalTools.h 3.42 KB
//
//  BBAGlobalTools.h
//  BaiduBoxApp
//
//  Created by canyingwushang on 12-9-23.
//  Copyright (c) 2012年 Baidu. All rights reserved.
//

/******************************************************************************/
// 描述:简单工具集中营,主要使用宏定义封装一些常用的简单代码,达到简化代码的目的
// 场景:各代码块使用的地方
// 用法:所有宏定义用法类似方法的调用
/******************************************************************************/

#ifndef BBAGlobalTools_h
#define BBAGlobalTools_h

// GCD get queue
#define GCD_BACKGROUND_QUEUE (dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0))
#define GCD_HIGH_QUEUE (dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0))
#define GCD_GLOBAL_QUEUE (dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
#define GCD_MAIN_QUEUE (dispatch_get_main_queue())

#define GCD_SECONDS_FROM_NOW(interval) dispatch_time(DISPATCH_TIME_NOW, (int64_t)(interval * NSEC_PER_SEC))

#define BBA_GCD_SYNC_MAIN(block)                        \
if (block) {                                            \
    if ([[NSThread currentThread] isMainThread]) {      \
        block();                                        \
    } else {                                            \
        dispatch_sync(dispatch_get_main_queue(), ^{     \
            block();                                    \
        });                                             \
    }                                                   \
}

#define BBA_GCD_ASYNC_MAIN(block)                       \
if (block) {                                            \
    dispatch_async(dispatch_get_main_queue(), ^{        \
        block();                                        \
    });                                                 \
}

#define BBARunBlock(block) \
if (block != nil) block();

#define BBARunBlock1(block, arg) \
if (block != nil) block((arg));

#define BBARunBlock2(block, arg1, arg2) \
if (block != nil) block((arg1), (arg2));

#define BBARunBlock3(block, arg1, arg2, arg3) \
if (block != nil) block((arg1), (arg2), (arg3));

#define BBARunBlock4(block, arg1, arg2, arg3, arg4) \
if (block != nil) block((arg1), (arg2), (arg3), (arg4));

#import "metamacros.h"

// keypath
#define keypath(...) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-repeated-use-of-weak\"") \
metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__))(keypath1(__VA_ARGS__))(keypath2(__VA_ARGS__)) \
_Pragma("clang diagnostic pop") \

#define keypath1(PATH) \
(((void)(NO && ((void)PATH, NO)), strchr(# PATH, '.') + 1))

#define keypath2(OBJ, PATH) \
(((void)(NO && ((void)OBJ.PATH, NO)), # PATH))

// weakify & unsafeify & strongify
#define weakify(...) \
ext_keywordify \
metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)

#define unsafeify(...) \
ext_keywordify \
metamacro_foreach_cxt(ext_weakify_,, __unsafe_unretained, __VA_ARGS__)

#define strongify(...) \
ext_keywordify \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
metamacro_foreach(ext_strongify_,, __VA_ARGS__) \
_Pragma("clang diagnostic pop")

#define ext_weakify_(INDEX, CONTEXT, VAR) \
CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR);

#define ext_strongify_(INDEX, VAR) \
__strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_);

#if DEBUG
#define ext_keywordify autoreleasepool {}
#else
#define ext_keywordify try {} @catch (...) {}
#endif

#endif