SHARE
TWEET

Untitled

a guest Apr 22nd, 2019 76 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef ENUM_FACTORY_H__
  2. #define ENUM_FACTORY_H__
  3.  
  4. /*
  5. Factory used example:
  6. someEnum.h:
  7. #include "enum_factory.h"
  8. #define SOME_ENUM(XX) \
  9.     XX(FirstValue,) \
  10.     XX(SecondValue,) \
  11.     XX(SomeOtherValue,=50) \
  12.     XX(OneMoreValue,=100)
  13.  
  14. DECLARE_ENUM(SomeEnum,SOME_ENUM)
  15.  
  16. someEnum.cpp:
  17. #include "someEnum.h"
  18. DEFINE_ENUM(SomeEnum,SOME_ENUM)
  19. */
  20.  
  21. #include <string.h>
  22. // expansion macro for enum value definition
  23. #define ENUM_VALUE(name, assign) name assign,
  24.  
  25. // expansion macro for enum to string conversion
  26. #define ENUM_CASE(name, assign)                                                \
  27.     case name:                                                                 \
  28.         return #name;
  29.  
  30. // expansion macro for string to enum conversion
  31. #define ENUM_STRCMP(name, assign)                                              \
  32.     if (!strcmp(str, #name))                                                   \
  33.         return name;
  34.  
  35. /// declare the access function and define enum values
  36. #define DECLARE_ENUM(EnumType, ENUM_DEF)                                       \
  37.     enum EnumType { ENUM_DEF(ENUM_VALUE) };                                    \
  38.     const char *GetString(EnumType dummy);                                     \
  39.     EnumType Get##EnumType##Value(const char *string);
  40.  
  41. /// define the access function names
  42. #define DEFINE_ENUM(EnumType, ENUM_DEF)                                        \
  43.     const char *GetString(EnumType value) {                                    \
  44.         switch (value) {                                                       \
  45.             ENUM_DEF(ENUM_CASE)                                                \
  46.         default:                                                               \
  47.             return ""; /* handle input error */                                \
  48.         }                                                                      \
  49.     }                                                                          \
  50.     EnumType Get##EnumType##Value(const char *str) {                           \
  51.         ENUM_DEF(ENUM_STRCMP)                                                  \
  52.         return (EnumType)0; /* handle input error */                           \
  53.     }
  54. #endif
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top