// // NSStringFromEnum.h // // Created by Jonathan Annett on 21/11/13. // Copyright (c) 2013 Sophtwhere. All rights reserved. // /* example 1 : completely define a NEW enum typedef, with string converters. notes: - define_XXX is a macro that calls a macro to define an aspect of type XXX. - interface_NSString_Enum_DefinitionAndConverters can take up to 4 parameters. . 1 (manadtory) the enum name (minus the word "enum") . 2 an option name to use for the parameter in the NSStringFromEnumXXX function. purely sugar. . 3 an optional type rename for use in the function names (does not affect typedef) . you'd use this if you dont wan't the word Enum in the function name, for example. . 4 if you want to camel case the function names, specify parameter 3 with first char caprilized, . and use the same name in 4, with the first character as lower case. - whatever parameters you use in interface_NSString_Enum_DefinitionAndConverters() use the same ones in implementation_NSString_Enum_Converters() tip: to ensure the same settings are used, make a #define for them (see example 2 for an example of this). this first example however is a simple case using default names, since the type name is already capitalized. in myfile.h -------------------------------------------------------- #import "NSStringFromEnum.h" #define define_Dispatch_chain_cmd(enum)\ enum(chain_done,=0)\ enum(chain_entry)\ enum(chain_bg)\ enum(chain_mt)\ enum(chain_alt)\ enum(chain_for_c)\ enum(chain_while)\ enum(chain_continue_for)\ enum(chain_continue_while)\ enum(chain_break_for)\ enum(chain_break_while)\ enum(chain_previous)\ enum(chain_if)\ enum(chain_else)\ interface_NSString_Enum_DefinitionAndConverters(Dispatch_chain_cmd) -------------------------------------------------------- in myfile.m: -------------------------------------------------------- #import "myfile.h" implementation_NSString_Enum_Converters(Dispatch_chain_cmd) -------------------------------------------------------- to use : NSString *NSStringFromEnumDispatch_chain_cmd(enum Dispatch_chain_cmd value); NSStringFromEnumDispatch_chain_cmd(chain_for_c) returns @"chain_for_c" enum Dispatch_chain_cmd enumDispatch_chain_cmdFromNSString(NSString *value); enumDispatch_chain_cmdFromNSString(@"chain_previous") returns chain_previous Example 2: provide conversion routines for an existing enum also demonstrates using a settings string, and renaming the typename used in the functions. in myfile.h -------------------------------------------------------- #import "NSStringFromEnum.h" #define CAEdgeAntialiasingMask_SETTINGS_PARAMS CAEdgeAntialiasingMask,mask,EdgeMask,edgeMask interface_NSString_Enum_Converters(CAEdgeAntialiasingMask_SETTINGS_PARAMS) -------------------------------------------------------- in myfile.m: -------------------------------------------------------- // we can put this in the .m file as we are not defining a typedef, just the strings. #define define_CAEdgeAntialiasingMask(enum)\ enum(kCALayerLeftEdge)\ enum(kCALayerRightEdge)\ enum(kCALayerBottomEdge)\ enum(kCALayerTopEdge) implementation_NSString_Enum_Converters(CAEdgeAntialiasingMask_SETTINGS_PARAMS) */ #import "SW+Variadic.h" #define make_typedef_enum(name,...)\ name __VA_ARGS__, #define make_enum_to_NSString(name,...)\ [name] = @#name, #define make_NSString_to_enum(name,...)\ if ([value isEqualToString:@#name]) return name; #define __NSString_Enum_Converters_ERROR__ Error_Please_Specify_Enum_Name #define interface_NSString_Enum_Definition_0() \ __NSString_Enum_Converters_ERROR__ #define interface_NSString_Enum_Definition_1(typeName) \ interface_NSString_Enum_Definition_4(typeName,value,...) #define interface_NSString_Enum_Definition_2(typeName,value) \ interface_NSString_Enum_Definition_4(typeName,value,...) #define interface_NSString_Enum_Definition_3(typeName,value,...) \ interface_NSString_Enum_Definition_4(typeName,value) #define interface_NSString_Enum_Definition_4(typeName,value,...) \ typedef enum typeName {\ define_##typeName(make_typedef_enum)\ } typeName; #define interface_NSString_Enum_Converters_0() \ __NSString_Enum_Converters_ERROR__ #define interface_NSString_Enum_Converters_1(typeName) \ interface_NSString_Enum_Converters_4(typeName,value,Enum##typeName,enum##typeName) #define interface_NSString_Enum_Converters_2(typeName,value) \ interface_NSString_Enum_Converters_4(typeName,value,Enum##typeName,enum##typeName) #define interface_NSString_Enum_Converters_3(typeName,value,AltTypeName) \ interface_NSString_Enum_Converters_4(typeName,value,AltTypeName,AltTypeName) #define interface_NSString_Enum_Converters_4(typeName,value,AltTypeName,altTypeName) \ extern NSString * NSStringFrom##AltTypeName ( enum typeName value );\ extern enum typeName altTypeName##FromNSString(NSString *value);\ #define interface_NSString_Enum_DefinitionAndConverters_0() \ __NSString_Enum_Converters_ERROR__ #define interface_NSString_Enum_DefinitionAndConverters_1(typeName) \ interface_NSString_Enum_DefinitionAndConverters_4(typeName,value,Enum##typeName,enum##typeName) #define interface_NSString_Enum_DefinitionAndConverters_2(typeName,value) \ interface_NSString_Enum_DefinitionAndConverters_4(typeName,value,Enum##typeName,enum##typeName) #define interface_NSString_Enum_DefinitionAndConverters_3(typeName,value,AltTypeName) \ interface_NSString_Enum_DefinitionAndConverters_4(typeName,value,AltTypeName,AltTypeName) #define interface_NSString_Enum_DefinitionAndConverters_4(typeName,value,AltTypeName,altTypeName)\ interface_NSString_Enum_Definition_4(typeName,value,AltTypeName,altTypeName)\ interface_NSString_Enum_Converters_4(typeName,value,AltTypeName,altTypeName)\ #define implementation_NSString_Enum_Converters_0() __NSString_Enum_Converters_ERROR__ #define implementation_NSString_Enum_Converters_1(typeName)\ implementation_NSString_Enum_Converters_4(typeName,value,Enum##typeName,enum##typeName) #define implementation_NSString_Enum_Converters_2(typeName,value)\ implementation_NSString_Enum_Converters_4(typeName,value,Enum##typeName,enum##typeName) #define implementation_NSString_Enum_Converters_3(typeName,value,AltTypeName) \ implementation_NSString_Enum_Converters_4(typeName,value,AltTypeName,altTypeName) #define implementation_NSString_Enum_Converters_4(typeName,value_,AltTypeName,altTypeName)\ NSString * NSStringFrom##AltTypeName(enum typeName value_){\ static NSString * const NSStringFrom_##typeName##_[] = {\ define_##typeName(make_enum_to_NSString)\ };\ return NSStringFrom_##typeName##_[value_];\ }\ enum typeName altTypeName##FromNSString(NSString *value) {\ define_##typeName(make_NSString_to_enum)\ return (enum typeName) 0;\ } #define interface_NSString_Enum_Definition(...) VARARG(interface_NSString_Enum_Definition_, __VA_ARGS__) #define interface_NSString_Enum_Converters(...) VARARG(interface_NSString_Enum_Converters_, __VA_ARGS__) #define interface_NSString_Enum_DefinitionAndConverters(...) VARARG(interface_NSString_Enum_DefinitionAndConverters_, __VA_ARGS__) #define implementation_NSString_Enum_Converters(...) VARARG(implementation_NSString_Enum_Converters_, __VA_ARGS__)