Touchless Enum to String in C

Post on 22-Nov-2014

1.192 views 3 download

description

A foolproof approach to maintain number-to-string mappings. No more name mapping headache.

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