Touchless Enum to String in C

15
Touchless enum to string in C Arun Saha No more enum mapping headaches

description

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

Transcript of Touchless Enum to String in C

Page 1: Touchless Enum to String in C

Touchless

enum to string

in C

Arun Saha

No more enum mapping headaches

Page 2: Touchless Enum to String in C

(Log) Message: Error: Device 1234 failed.

What is device 1234, btw, any name?

Why

Nov 27 2013 Touchless enum to string 2

Page 3: Touchless Enum to String in C

For machines, numbers are natural, but,

For humans, names are natural.

Why

Nov 27 2013 Touchless enum to string 3

Page 4: Touchless Enum to String in C

(Log) Message: Error: Device 1234 (cdrom)

failed.

Ooops… aha! the cdrom

Why

Nov 27 2013 Touchless enum to string 4

Page 5: Touchless Enum to String in C

Number to Name need

unique bidirectional

(1:1) mapping

What

Nov 27 2013 Touchless enum to string 5

Page 6: Touchless Enum to String in C

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

Page 7: Touchless Enum to String in C

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

Page 8: Touchless Enum to String in C

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

Page 9: Touchless Enum to String in C

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

Page 10: Touchless Enum to String in C

Solution: Define (number, name) pair in a

separate file

COLOR_DEF( ColorRed, “Red”)

How

Nov 27 2013 Touchless enum to string 10

Page 11: Touchless Enum to String in C

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

Page 12: Touchless Enum to String in C

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

Page 13: Touchless Enum to String in C

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;

Page 14: Touchless Enum to String in C

Code available at github https://github.com/arunksaha/enum_to_string

How

Nov 27 2013 Touchless enum to string 14

Page 15: Touchless Enum to String in C

Thank you!

Comments are much appreciated

Arun Saha

http://www.linkedin.com/in/arunksaha

Nov 27 2013 Touchless enum to string 15