//
// 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__)