Created
December 9, 2012 22:48
-
-
Save drodriguez/4247342 to your computer and use it in GitHub Desktop.
Creating enums and its companion NSStringFrom... function.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <Foundation/Foundation.h> | |
#define DRT_NARGS(...) DRT_NARGS_(__VA_ARGS__, 63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) | |
#define DRT_NARGS_(...) DRT_ARGS_N(__VA_ARGS__) | |
#define DRT_ARGS_N(_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,N,...) N | |
#define DRT_CONCAT(a, ...) a ## __VA_ARGS__ | |
#define DRT_IIF(c) DRT_CONCAT(DRT_IIF_, c) | |
#define DRT_IIF_0(t, ...) __VA_ARGS__ | |
#define DRT_IIF_1(t, ...) t | |
#define DRT_COMPL(b) DRT_CONCAT(DRT_COMPL_, b) | |
#define DRT_COMPL_0 1 | |
#define DRT_COMPL_1 0 | |
#define DRT_CHECK_N(x, n, ...) n | |
#define DRT_CHECK(...) DRT_CHECK_N(__VA_ARGS__, 0,) | |
#define DRT_PROBE(x) x, 1, | |
#define DRT_NOT(x) DRT_CHECK(DRT_CONCAT(DRT_NOT_, x)) | |
#define DRT_NOT_0 DRT_PROBE(~) | |
#define DRT_BOOL(x) DRT_COMPL(DRT_NOT(x)) | |
#define DRT_IF(c) DRT_IIF(DRT_BOOL(c)) | |
#define DRT_IS_PAREN(x) DRT_CHECK(DRT_IS_PAREN_PROBE x) | |
#define DRT_IS_PAREN_PROBE(...) DRT_PROBE(~) | |
#define DRT_STRING(x) #x | |
#define DRT_STRING2(x) DRT_STRING(x) | |
#define DRT_ENUM_DBG_ITEM_VALUE(i, ...) i | |
#define DRT_ENUM_DBG_ITEMS_1(first) \ | |
case DRT_IF(DRT_IS_PAREN(first))(DRT_ENUM_DBG_ITEM_VALUE first, first): \ | |
return @"" DRT_IF(DRT_IS_PAREN(first))(DRT_STRING2(DRT_ENUM_DBG_ITEM_VALUE first), #first); \ | |
break; | |
#define DRT_ENUM_DBG_ITEMS_2(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_1(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_3(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_2(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_4(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_3(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_5(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_4(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_6(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_5(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_7(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_6(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_8(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_7(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_9(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_8(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_10(first, ...) DRT_ENUM_DBG_ITEMS_1(first) DRT_ENUM_DBG_ITEMS_9(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_NN(n, ...) DRT_ENUM_DBG_ITEMS_##n(__VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS_N(n, ...) DRT_ENUM_DBG_ITEMS_NN(n, __VA_ARGS__) | |
#define DRT_ENUM_DBG_ITEMS(...) DRT_ENUM_DBG_ITEMS_N(DRT_NARGS(__VA_ARGS__), __VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEM_VALUE(i, ...) i = __VA_ARGS__ | |
#define DRT_ENUM_DEF_ITEMS_1(first) DRT_IF(DRT_IS_PAREN(first))(DRT_ENUM_DEF_ITEM_VALUE first, first) | |
#define DRT_ENUM_DEF_ITEMS_2(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_1(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_3(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_2(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_4(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_3(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_5(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_4(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_6(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_5(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_7(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_6(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_8(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_7(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_9(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_8(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_10(first, ...) DRT_ENUM_DEF_ITEMS_1(first), DRT_ENUM_DEF_ITEMS_9(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_NN(n, ...) DRT_ENUM_DEF_ITEMS_##n(__VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS_N(n, ...) DRT_ENUM_DEF_ITEMS_NN(n, __VA_ARGS__) | |
#define DRT_ENUM_DEF_ITEMS(...) DRT_ENUM_DEF_ITEMS_N(DRT_NARGS(__VA_ARGS__), __VA_ARGS__) | |
#define DRT_ENUM_DBG(name, ...) \ | |
NSString* NSStringFrom##name(name value) { \ | |
switch (value) { \ | |
DRT_ENUM_DBG_ITEMS(__VA_ARGS__) \ | |
default: \ | |
return [NSString stringWithFormat:@"<unknown" #name ": %d>", value]; \ | |
} \ | |
} | |
#define DRT_ENUM_DEF(name, ...) typedef enum name { DRT_ENUM_DEF_ITEMS(__VA_ARGS__) } name; | |
#define DRT_ENUM(name, ...) \ | |
DRT_ENUM_DEF(name, __VA_ARGS__) \ | |
DRT_ENUM_DBG(name, __VA_ARGS__) | |
DRT_ENUM(JRStream, | |
(JRStream_Disconnected, 2), | |
JRStream_Connecting, | |
JRStream_Connected, | |
JRStream_Disconnecting) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment