Touchless Enum to String in C
-
Upload
arun-saha -
Category
Technology
-
view
1.192 -
download
3
description
Transcript of Touchless Enum to String in C
Touchless
enum to string
in C
Arun Saha
No more enum mapping headaches
(Log) Message: Error: Device 1234 failed.
What is device 1234, btw, any name?
Why
Nov 27 2013 Touchless enum to string 2
For machines, numbers are natural, but,
For humans, names are natural.
Why
Nov 27 2013 Touchless enum to string 3
(Log) Message: Error: Device 1234 (cdrom)
failed.
Ooops… aha! the cdrom
Why
Nov 27 2013 Touchless enum to string 4
Number to Name need
unique bidirectional
(1:1) mapping
What
Nov 27 2013 Touchless enum to string 5
Mapping Example
ColorCode (enum)
<->
ColorName (char const *)
Translation API /// Map Number -> Name
ColorName colorName( ColorCode );
/// Map Name -> Number
ColorCode colorCode( ColorName );
What
Nov 27 2013 Touchless enum to string 6
Attempt #1: Array of strings
Numbers defined as enum Names defined as array of char const *
In array of names, position/index of a string is same as its code.
(A minor variation is to use a switch statement on the number (ColorCode))
How
Nov 27 2013 Touchless enum to string 7
Attempt #1: Array of strings
In the array, position/index of a string is same as its code.
Issue 1: The sequence in the array is dependent on the sequence in the enum, any out of order element
messes up the mapping.
How
Nov 27 2013 Touchless enum to string 8
Attempt #1: Array of strings
In the array, position/index of a string is same as its code.
Issue 2: For a (number, name) pair, the number and the name are defined in two separate files;
out of sync file pair (e.g. maintainer added enum in one file but missed to add name in the
other file) garbles the mapping.
How
Nov 27 2013 Touchless enum to string 9
Solution: Define (number, name) pair in a
separate file
COLOR_DEF( ColorRed, “Red”)
How
Nov 27 2013 Touchless enum to string 10
Solution: Define (number, name) pair in a
separate file as macro
#define COLOR_DEF( ColorRed, “Red”)
How
The author avoids macro as much as possible, but the current situation is a good usage of macro, which is hard to obtain otherwise.
Nov 27 2013 Touchless enum to string 11
Solution Insight: Different Macro Expansion
.h file:
• Expand macro to get number in enum • #define COLOR_DEF(number, name) number,
.c file:
• Expand macro to get name in array
• #define COLOR_DEF(number, name) name,
How
Nov 27 2013 Touchless enum to string 12
color_defs.h
COLOR_DEF( ColorRed, "Red" )
COLOR_DEF( ColorYellow, "Yellow" )
COLOR_DEF( ColorGreen, "Green" )
color.c
static const ColorName colorNames[] = {
"First",
#define COLOR_DEF( number, name ) name,
#include "color_defs.h"
#undef COLOR_DEF
"Last"
};
.h file:
Expand macro to get number in enum
.c file:
Expand macro to get name in array
How
color.h
typedef enum ColorCode {
ColorFirst = 0,
#define COLOR_DEF( number, name ) number,
#include "color_defs.h"
#undef COLOR_DEF
ColorLast
} ColorCode;
Code available at github https://github.com/arunksaha/enum_to_string
How
Nov 27 2013 Touchless enum to string 14
Thank you!
Comments are much appreciated
Arun Saha
http://www.linkedin.com/in/arunksaha
Nov 27 2013 Touchless enum to string 15