编辑代码

#include <iostream>
#include <stdint.h>

#ifndef JF_ENUM_CONVERT_MACRO_HPP
#define JF_ENUM_CONVERT_MACRO_HPP
#include <stdio.h>
#include <string.h>
#define FUNC_NAME_1 string_to_enum
#define FUNC_NAME_2 enum_to_string

#define _DEFINE_FUNC_NAME(a, b, c, d, e)  a##b##c##d##e
#define DEFINE_FUNC_NAME(a, b, c, d, e)  _DEFINE_FUNC_NAME(a, b, c, d, e)

#define CUR_STRING_TO_ENUM_FUNC(enumtype)   inline enumtype DEFINE_FUNC_NAME(FUNC_NAME_1,_, enumtype, ,)(const std::string& strEnum)
#define CUR_ENUM_TO_STRING_FUNC(enumtype)   inline std::string DEFINE_FUNC_NAME(FUNC_NAME_2,_,enumtype, ,)(enumtype enumInput)
#define CUR_ENUM_TO_STRING_FUNC_OVERLOAD(enumtype)  inline std::string DEFINE_FUNC_NAME(FUNC_NAME_2,,, ,)(enumtype enumInput)

#define FUN_STRING_DEFINE_UNKNOW "UNKNOW"

#define FUN_STRING_TO_ENUM_DEFINE_1
#define FUN_STRING_TO_ENUM_DEFINE_2(GET_FUNC_NAME_MACRO, enumType, enumValue_1) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else {exit(1);}\
}
#define FUN_STRING_TO_ENUM_DEFINE_3(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else {exit(1);}\
}
#define FUN_STRING_TO_ENUM_DEFINE_4(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else {exit(1);}\
}
#define FUN_STRING_TO_ENUM_DEFINE_5(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_6(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_7(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_6;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_8(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_9(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_10(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_11(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_12(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_13(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_14(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_15(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_14)){return enumValue_14;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_16(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14,enumValue_15) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_14)){return enumValue_14;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_15)){return enumValue_15;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_17(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14,enumValue_15, enumValue_16) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_14)){return enumValue_14;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_15)){return enumValue_15;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_16)){return enumValue_16;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_18(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14,enumValue_15, enumValue_16, enumValue_17) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_14)){return enumValue_14;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_15)){return enumValue_15;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_16)){return enumValue_16;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_17)){return enumValue_17;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_19(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14,enumValue_15, enumValue_16, enumValue_17,enumValue_18) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_14)){return enumValue_14;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_15)){return enumValue_15;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_16)){return enumValue_16;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_17)){return enumValue_17;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_18)){return enumValue_18;}\
else { exit(1);}\
}
#define FUN_STRING_TO_ENUM_DEFINE_20(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14,enumValue_15, enumValue_16, enumValue_17,enumValue_18, enumValue_19) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_14)){return enumValue_14;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_15)){return enumValue_15;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_16)){return enumValue_16;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_17)){return enumValue_17;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_18)){return enumValue_18;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_19)){return enumValue_19;}\
else { exit(1); }\
}
#define FUN_STRING_TO_ENUM_DEFINE_21(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8,enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14,enumValue_15, enumValue_16, enumValue_17,enumValue_18, enumValue_19,enumValue_20) GET_FUNC_NAME_MACRO(enumType){\
if (0 == strcmp(strEnum.c_str(), #enumValue_1)) {return enumValue_1;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_2)){return enumValue_2;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_3)){return enumValue_3;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_4)){return enumValue_4;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_5)){return enumValue_5;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_6)){return enumValue_6;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_7)){return enumValue_7;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_8)){return enumValue_8;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_9)){return enumValue_9;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_10)){return enumValue_10;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_11)){return enumValue_11;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_12)){return enumValue_12;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_13)){return enumValue_13;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_14)){return enumValue_14;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_15)){return enumValue_15;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_16)){return enumValue_16;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_17)){return enumValue_17;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_18)){return enumValue_18;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_19)){return enumValue_19;}\
else if(0 == strcmp(strEnum.c_str(), #enumValue_20)){return enumValue_20;}\
else { exit(1);}\
}
//////////////////////////////////////////////////////////////////////////////////////////////
#define FUN_ENUM_TO_STRING_DEFINE_1
#define FUN_ENUM_TO_STRING_DEFINE_2(GET_FUNC_NAME_MACRO, enumType, enumValue_1) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else { return FUN_STRING_DEFINE_UNKNOW;}\
}
#define FUN_ENUM_TO_STRING_DEFINE_3(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_4(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_5(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_6(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_7(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_8(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_9(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_10(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_11(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_12(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}

#define FUN_ENUM_TO_STRING_DEFINE_13(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_14(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else {return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_15(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else if(enumValue_14 == enumInput) return #enumValue_14;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_16(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14, enumValue_15) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else if(enumValue_14 == enumInput) return #enumValue_14;\
else if(enumValue_15 == enumInput) return #enumValue_15;\
else {return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_17(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14, enumValue_15, enumValue_16) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else if(enumValue_14 == enumInput) return #enumValue_14;\
else if(enumValue_15 == enumInput) return #enumValue_15;\
else if(enumValue_16 == enumInput) return #enumValue_16;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_18(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14, enumValue_15, enumValue_16, enumValue_17) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else if(enumValue_14 == enumInput) return #enumValue_14;\
else if(enumValue_15 == enumInput) return #enumValue_15;\
else if(enumValue_16 == enumInput) return #enumValue_16;\
else if(enumValue_17 == enumInput) return #enumValue_17;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_19(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14, enumValue_15, enumValue_16, enumValue_17, enumValue_18) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else if(enumValue_14 == enumInput) return #enumValue_14;\
else if(enumValue_15 == enumInput) return #enumValue_15;\
else if(enumValue_16 == enumInput) return #enumValue_16;\
else if(enumValue_17 == enumInput) return #enumValue_17;\
else if(enumValue_18 == enumInput) return #enumValue_18;\
else { return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_20(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14, enumValue_15, enumValue_16, enumValue_17, enumValue_18, enumValue_19) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else if(enumValue_14 == enumInput) return #enumValue_14;\
else if(enumValue_15 == enumInput) return #enumValue_15;\
else if(enumValue_16 == enumInput) return #enumValue_16;\
else if(enumValue_17 == enumInput) return #enumValue_17;\
else if(enumValue_18 == enumInput) return #enumValue_18;\
else if(enumValue_19 == enumInput) return #enumValue_19;\
else {return FUN_STRING_DEFINE_UNKNOW; }\
}
#define FUN_ENUM_TO_STRING_DEFINE_21(GET_FUNC_NAME_MACRO, enumType, enumValue_1, enumValue_2, enumValue_3, enumValue_4, enumValue_5, enumValue_6, enumValue_7, enumValue_8, enumValue_9, enumValue_10, enumValue_11, enumValue_12, enumValue_13, enumValue_14, enumValue_15, enumValue_16, enumValue_17, enumValue_18, enumValue_19, enumValue_20) GET_FUNC_NAME_MACRO(enumType){\
if (enumValue_1 == enumInput) return #enumValue_1;\
else if(enumValue_2 == enumInput) return #enumValue_2;\
else if(enumValue_3 == enumInput) return #enumValue_3;\
else if(enumValue_4 == enumInput) return #enumValue_4;\
else if(enumValue_5 == enumInput) return #enumValue_5;\
else if(enumValue_6 == enumInput) return #enumValue_6;\
else if(enumValue_7 == enumInput) return #enumValue_7;\
else if(enumValue_8 == enumInput) return #enumValue_8;\
else if(enumValue_9 == enumInput) return #enumValue_9;\
else if(enumValue_10 == enumInput) return #enumValue_10;\
else if(enumValue_11 == enumInput) return #enumValue_11;\
else if(enumValue_12 == enumInput) return #enumValue_12;\
else if(enumValue_13 == enumInput) return #enumValue_13;\
else if(enumValue_14 == enumInput) return #enumValue_14;\
else if(enumValue_15 == enumInput) return #enumValue_15;\
else if(enumValue_16 == enumInput) return #enumValue_16;\
else if(enumValue_17 == enumInput) return #enumValue_17;\
else if(enumValue_18 == enumInput) return #enumValue_18;\
else if(enumValue_19 == enumInput) return #enumValue_19;\
else if(enumValue_20 == enumInput) return #enumValue_20;\
else {  return FUN_STRING_DEFINE_UNKNOW; }\
}


#define DEDUCTION_MACRO_NAME(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, NAME, ...) NAME

#define DEDUCTION_FUN_ENUM_TO_STRING_DEFINE(...)                             \
    DEDUCTION_MACRO_NAME(__VA_ARGS__,FUN_ENUM_TO_STRING_DEFINE_21, FUN_ENUM_TO_STRING_DEFINE_20, FUN_ENUM_TO_STRING_DEFINE_19, FUN_ENUM_TO_STRING_DEFINE_18, FUN_ENUM_TO_STRING_DEFINE_17, FUN_ENUM_TO_STRING_DEFINE_16, FUN_ENUM_TO_STRING_DEFINE_15, FUN_ENUM_TO_STRING_DEFINE_14, FUN_ENUM_TO_STRING_DEFINE_13, FUN_ENUM_TO_STRING_DEFINE_12, FUN_ENUM_TO_STRING_DEFINE_11, FUN_ENUM_TO_STRING_DEFINE_10, FUN_ENUM_TO_STRING_DEFINE_9, FUN_ENUM_TO_STRING_DEFINE_8, FUN_ENUM_TO_STRING_DEFINE_7, FUN_ENUM_TO_STRING_DEFINE_6,FUN_ENUM_TO_STRING_DEFINE_5, FUN_ENUM_TO_STRING_DEFINE_4, FUN_ENUM_TO_STRING_DEFINE_3, FUN_ENUM_TO_STRING_DEFINE_2, FUN_ENUM_TO_STRING_DEFINE_1) \
    (CUR_ENUM_TO_STRING_FUNC, __VA_ARGS__)

#define DEDUCTION_FUN_STRING_TO_ENUM_DEFINE(...)                             \
    DEDUCTION_MACRO_NAME(__VA_ARGS__, FUN_STRING_TO_ENUM_DEFINE_21, FUN_STRING_TO_ENUM_DEFINE_20, FUN_STRING_TO_ENUM_DEFINE_19, FUN_STRING_TO_ENUM_DEFINE_18, FUN_STRING_TO_ENUM_DEFINE_17, FUN_STRING_TO_ENUM_DEFINE_16, FUN_STRING_TO_ENUM_DEFINE_15, FUN_STRING_TO_ENUM_DEFINE_14, FUN_STRING_TO_ENUM_DEFINE_13, FUN_STRING_TO_ENUM_DEFINE_12, FUN_STRING_TO_ENUM_DEFINE_11, FUN_STRING_TO_ENUM_DEFINE_10, FUN_STRING_TO_ENUM_DEFINE_9, FUN_STRING_TO_ENUM_DEFINE_8, FUN_STRING_TO_ENUM_DEFINE_7, FUN_STRING_TO_ENUM_DEFINE_6,FUN_STRING_TO_ENUM_DEFINE_5, FUN_STRING_TO_ENUM_DEFINE_4, FUN_STRING_TO_ENUM_DEFINE_3, FUN_STRING_TO_ENUM_DEFINE_2, FUN_STRING_TO_ENUM_DEFINE_1) \
    (CUR_STRING_TO_ENUM_FUNC, __VA_ARGS__)

#define DEDUCTION_FUN_ENUM_TO_STRING_DEFINE_OVERLOAD(...)                             \
    DEDUCTION_MACRO_NAME(__VA_ARGS__,FUN_ENUM_TO_STRING_DEFINE_21,FUN_ENUM_TO_STRING_DEFINE_20, FUN_ENUM_TO_STRING_DEFINE_19, FUN_ENUM_TO_STRING_DEFINE_18, FUN_ENUM_TO_STRING_DEFINE_17, FUN_ENUM_TO_STRING_DEFINE_16, FUN_ENUM_TO_STRING_DEFINE_15, FUN_ENUM_TO_STRING_DEFINE_14, FUN_ENUM_TO_STRING_DEFINE_13, FUN_ENUM_TO_STRING_DEFINE_12, FUN_ENUM_TO_STRING_DEFINE_11, FUN_ENUM_TO_STRING_DEFINE_10, FUN_ENUM_TO_STRING_DEFINE_9, FUN_ENUM_TO_STRING_DEFINE_8, FUN_ENUM_TO_STRING_DEFINE_7, FUN_ENUM_TO_STRING_DEFINE_6,FUN_ENUM_TO_STRING_DEFINE_5, FUN_ENUM_TO_STRING_DEFINE_4, FUN_ENUM_TO_STRING_DEFINE_3, FUN_ENUM_TO_STRING_DEFINE_2, FUN_ENUM_TO_STRING_DEFINE_1) \
    (CUR_ENUM_TO_STRING_FUNC_OVERLOAD, __VA_ARGS__)

#define STRING_ENUM_CONVERT_GENERATOR(NAME_SPACE_NAME, ...) \
namespace NAME_SPACE_NAME { \
    DEDUCTION_FUN_STRING_TO_ENUM_DEFINE(__VA_ARGS__) \
    DEDUCTION_FUN_ENUM_TO_STRING_DEFINE(__VA_ARGS__) \
    DEDUCTION_FUN_ENUM_TO_STRING_DEFINE_OVERLOAD(__VA_ARGS__) \
};
#define STRING_ENUM_CONVERT_GENERATOR_CURR_NAMESPACE(...) \
    DEDUCTION_FUN_STRING_TO_ENUM_DEFINE(__VA_ARGS__) \
    DEDUCTION_FUN_ENUM_TO_STRING_DEFINE(__VA_ARGS__) \
    DEDUCTION_FUN_ENUM_TO_STRING_DEFINE_OVERLOAD(__VA_ARGS__) 


#define PRINT_STR_MEMBER(json, structType, member) \
    json[#member] = (structType).member; 

#define PRINT_STR_MEMBER_OPT(json, structType, member) \
    json[#member] = (structType)->member; 

#define PRINT_STR_MEMBER_ENUM(json, structType, member) \
    json[#member] = enum_to_string((structType).member); 

#define PRINT_STR_MEMBER_OPT_ENUM(json, structType, member) \
    json[#member] = enum_to_string((structType)->member); 

#endif
using namespace std;

typedef enum tagARCS_TURN_SIGNAL_TYPE {
    ARCS_TURN_SIGNAL_TYPE_NONE = 0,      ///< 未转向
    ARCS_TURN_SIGNAL_TYPE_LEFT,          ///< 左转
    ARCS_TURN_SIGNAL_TYPE_RIGHT,         ///< 右转
} ARCS_TURN_SIGNAL_TYPE;

STRING_ENUM_CONVERT_GENERATOR_CURR_NAMESPACE(
    ARCS_TURN_SIGNAL_TYPE,
    ARCS_TURN_SIGNAL_TYPE_NONE,      
    ARCS_TURN_SIGNAL_TYPE_LEFT,          
    ARCS_TURN_SIGNAL_TYPE_RIGHT       
);

typedef uint32_t ARCS_MASK_TYPE;
#define ARCS_MASK_NONE                          0x0000
#define ARCS_MASK_DISTRACT                      0x0001  ///< 分心
#define ARCS_MASK_DROWSY                        0x0002  ///< 疲劳

STRING_ENUM_CONVERT_GENERATOR_CURR_NAMESPACE(
    ARCS_MASK_TYPE,
    ARCS_MASK_NONE,      
    ARCS_MASK_DISTRACT,          
    ARCS_MASK_DROWSY       
);

int main() {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
	cout << "Hello world!    - cpp.jsrun.net." << endl;

    auto res = enum_to_string(ARCS_TURN_SIGNAL_TYPE_NONE);
    cout << res << endl;

    ARCS_MASK_TYPE v;
    v = ARCS_MASK_DISTRACT | ARCS_MASK_DROWSY;
    auto res2 = enum_to_string(v);
    cout << res2 << endl;
	return 0;
}