When defining an Enum on a CPP file it is impossible to print the enumerator string without adding manually a code snippet that does it - converting the enum value to a string, and adding an output stream operator for printing it. Adding code that does it for every enum is a painful job.
CPP Enum Auto-Print is a tool written in Python3 which able to scan a CPP repository, detecting Enums, and automatically generate a code snippet below an Enum definition that will make the Enum printable.
Example:
enum eBananaStates {
GreenAndHardLikeHulk,
LightGreenTasteLikeAvocado,
SweetYellowHeaven,
DontWaitAnotherDay,
OmgItsRotten
};
The script will generate the following code:
// Enum AutoPrint generated code snippet begining- DON'T EDIT!
const char *eBananaStates_str(eBananaStates enum_value) {
switch (enum_value) {
case GreenAndHardLikeHulk: return "GreenAndHardLikeHulk";
case LightGreenTasteLikeAvocado: return "LightGreenTasteLikeAvocado";
case SweetYellowHeaven: return "SweetYellowHeaven";
case DontWaitAnotherDay: return "DontWaitAnotherDay";
case OmgItsRotten: return "OmgItsRotten";
}
static std::string out_str = std::to_string(int(enum_value));
return out_str.c_str();
}
std::ostream &operator<<(std::ostream &out, eBananaStates value) { return out << eBananaStates_str(value); }
// Enum AutoPrint generated code snippet end
The script can be used inside a building script and modify the source code before compiling it.
- The generated code use
std::ostream
andstd::string
. It is the user's responsibility to make surestring
andostream
are included so the code will compile successfully. - The script will not generate code for the following cases:
- Anonymous Enum (Enum with not name).
- Enum with no enumerator-list.
- Enum which has an enumerator-list with identical values.
- Enum which on its enumerator-list there is an enumerator whose value is calculated using another enum or constexpr value.
- Enum struct (enum class is supported though).
The script uses a JSON configuration file with the following properties:
Property | Mandatory | Default Value | Summary |
---|---|---|---|
workspaceRoot |
yes | NA | The root folder of the project. Can be a relative path to the script location. |
spaces_in_tab |
yes | 4 | The width of a hard tab character in source code. |
testWorkspaceRoot |
Only for test mode | NA | An alternate root path for testing the script. |
formatter_open_direction formatter_close_direction |
No | "" | A direction to the formatter which will be added to the auto generated code beginning and end. For example "// clang-format off". |
encoding |
no | utf-8 | The encoding of the files to read. Could be any of mentioned in Python's Standard Encodings Table. |
redirect_stdout_to_log_file |
No | False | If "True" script output will be directed to a log file "output.log", otherwise to the console. |
excluded_files |
No | NA | List of files and folders to ignore. |
To disable code generation for a specific enum, add the following comment to the code, and for the enum below it, auto-generated code will not be generated.
// enum auto-print skip
To run the script on the project root:
./enum_auto_print/enum_auto_print.py
To run the script on test mode:
./enum_auto_print/enum_auto_print.py -t
The script works successfully on the common majority of cases (please see `test/test.h). If there is an enum definition that the script fails to generate code for, please let me know. [email protected]