BBAGlobalTools.h
3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//
// 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