Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // 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__)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement