Skip to content

Instantly share code, notes, and snippets.

@drodriguez
Created December 9, 2012 22:48
Show Gist options
  • Save drodriguez/4247342 to your computer and use it in GitHub Desktop.
Save drodriguez/4247342 to your computer and use it in GitHub Desktop.
Creating enums and its companion NSStringFrom... function.
#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