Advertisement
oster_man

constexpr text switch-case

May 2nd, 2025
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.84 KB | None | 0 0
  1. #pragma once
  2. #include <cinttypes>
  3. #include <string>
  4. #include <vector>
  5. #include <string_view>
  6. #include <array>
  7.  
  8. namespace translate::token{
  9.  
  10. enum class Command:uint16_t{
  11.     UNDEF,
  12.     OUT_PATH,
  13.     IN_PATH,
  14.     DATE_FROM,
  15.     DATE_TO,
  16.     POSITION,
  17.     LAT_TOP,
  18.     LON_LEFT,
  19.     LAT_BOT,
  20.     LON_RIG,
  21.     THREADS,
  22.     EXTRACT_FORMAT,
  23.     EXTRACTION_TIME_INTERVAL,
  24.     CAPITALIZE_HIERARCHY,
  25.     CAPITALIZE_FORMAT,
  26.     CENTER,
  27.     PARAMETERS,
  28.     TABLE_VERSION,
  29.     COLLECTION,
  30.     TIME_FCST,
  31.     GRID_TYPE
  32. };
  33.  
  34. enum class ModeArgs:uint8_t{
  35.     NONE,
  36.     EXTRACT,
  37.     CAPITALIZE,
  38.     INTEGRITY,
  39.     CONFIG,
  40.     HELP,
  41.     SAVE,
  42.     EXIT,
  43.     CONTAINS
  44. };
  45.  
  46. enum class ConfigAction:uint8_t{
  47.     UNDEF,      //undefined action (error)
  48.     ADD,        //check and add configuration by name
  49.     REDEFINE,   //redefine configuration by name if exists or create
  50.     REMOVE,     //remove configuration by name
  51.     SET,        //set permanent configuration
  52.     ADDSET,
  53.     GET         //get config action by name or all (if '.' is inputed)
  54. };    
  55.  
  56. enum class FileFormat:uint8_t{
  57.     UNDEF,
  58.     TXT,
  59.     BIN,
  60.     GRIB,
  61.     ARCHIVED
  62. };
  63. }
  64.  
  65. template<typename T>
  66. struct __Token_text__;
  67.  
  68. template<>
  69. struct __Token_text__<translate::token::Command>{
  70.     static constexpr std::array<const char*,21> txt = {
  71.         "",
  72.         "-outp",
  73.         "-inp",
  74.         "-dfrom",
  75.         "-dto",
  76.         "-pos",
  77.         "-lattop",
  78.         "-latbot",
  79.         "-lonleft",
  80.         "-lonrig",
  81.         "-j",
  82.         "-extoutfmt",
  83.         "-extti",
  84.         "-caporder",
  85.         "-capfmt",
  86.         "-center",
  87.         "-params",
  88.         "-tablev",
  89.         "-collect",
  90.         "-time_fcst",
  91.         "-grid"
  92.     };
  93. };
  94.  
  95. template<>
  96. struct __Token_text__<translate::token::ModeArgs>{
  97.     static constexpr std::array<const char*,9> txt = {
  98.         "",
  99.         "-ext",
  100.         "-cap",
  101.         "-integrity",
  102.         "-config",
  103.         "-help",
  104.         "-save",
  105.         "exit()",
  106.         "-contains"
  107.     };
  108. };
  109.  
  110. template<>
  111. struct __Token_text__<translate::token::ConfigAction>{
  112.     static constexpr std::array<const char*,7> txt = {
  113.         "",
  114.         "add",
  115.         "redef",
  116.         "remove",
  117.         "set",
  118.         "addset",
  119.         "get"
  120.     };
  121. };
  122.  
  123. template<>
  124. struct __Token_text__<translate::token::FileFormat>{
  125.     static constexpr std::array<const char*,5> txt = {
  126.         "",
  127.         "txt",
  128.         "bin",
  129.         "grib",
  130.         "zip"
  131.     };
  132. };
  133. template<typename T>
  134. inline T translate_from_txt(std::string_view cmd) noexcept{
  135.     for(int i=0;i<__Token_text__<T>::txt.size();++i){
  136.         if(cmd==__Token_text__<T>::txt[i])
  137.             return (T)i;
  138.     }
  139.     return (T)0U;
  140. }
  141.  
  142. template<typename T>
  143. inline std::string_view translate_from_token(T token) noexcept{
  144.     return __Token_text__<T>::txt.at((uint)token);
  145. }
  146.  
  147. //пример использования
  148. ...
  149.  
  150. switch(translate_from_txt<translate::token::ModeArgs>(argv.at(0))){
  151.             case translate::token::ModeArgs::CAPITALIZE:
  152.                 if(arguments.empty()){
  153.                     ErrorPrint::print_error(ErrorCode::TO_FEW_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE);
  154.                     return ErrorCode::TO_FEW_ARGUMENTS;
  155.                 }
  156.                 return capitalize_parse(arguments);
  157.                 break;
  158.             case translate::token::ModeArgs::EXTRACT:
  159.                 if(arguments.empty()){
  160.                     ErrorPrint::print_error(ErrorCode::TO_FEW_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE);
  161.                     return ErrorCode::TO_FEW_ARGUMENTS;
  162.                 }
  163.                 return extract_parse(arguments);
  164.                 break;
  165.             case translate::token::ModeArgs::INTEGRITY:
  166.                 if(arguments.empty()){
  167.                     ErrorPrint::print_error(ErrorCode::TO_FEW_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE);
  168.                     return ErrorCode::TO_FEW_ARGUMENTS;
  169.                 }
  170.                 return integrity_parse(arguments);
  171.                 break;
  172.             case translate::token::ModeArgs::CONTAINS:
  173.                 if(arguments.empty()){
  174.                     ErrorPrint::print_error(ErrorCode::TO_FEW_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE);
  175.                     return ErrorCode::TO_FEW_ARGUMENTS;
  176.                 }
  177.                 //TODO
  178.                 break;
  179.             case translate::token::ModeArgs::CONFIG:
  180.                 if(arguments.empty()){
  181.                     ErrorPrint::print_error(ErrorCode::TO_FEW_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE);
  182.                     return ErrorCode::TO_FEW_ARGUMENTS;
  183.                 }
  184.                 return config_parse(arguments);
  185.                 break;
  186.             case translate::token::ModeArgs::HELP:
  187.                 if(arguments.size()>1){
  188.                     ErrorPrint::print_error(ErrorCode::TO_MANY_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE);
  189.                     return ErrorCode::TO_MANY_ARGUMENTS;
  190.                 }
  191.                 else if(arguments.size()==1){
  192.                     //help(*mode*)
  193.                 }
  194.                 else
  195.                     help();
  196.                 break;
  197.             case translate::token::ModeArgs::SAVE:
  198.                 if(!arguments.empty()){
  199.                     ErrorPrint::print_error(ErrorCode::TO_MANY_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE);
  200.                     return ErrorCode::TO_MANY_ARGUMENTS;
  201.                 }
  202.                 if(!hProgram || !hProgram->save()){
  203.                     ErrorPrint::print_error(ErrorCode::IGNORING_VALUE_X1,"Nothing to save",AT_ERROR_ACTION::CONTINUE,argv.at(0));
  204.                     return ErrorCode::IGNORING_VALUE_X1;
  205.                 }
  206.                 break;
  207.             case translate::token::ModeArgs::EXIT:
  208.                 if(argv.size()>1){
  209.                     ErrorPrint::print_error(ErrorCode::TO_MANY_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE,argv.at(1));
  210.                     return ErrorCode::TO_MANY_ARGUMENTS;
  211.                 }
  212.                 exit(0);
  213.                 break;
  214.             default:{
  215.                 if(Application::config().has_config_name(argv.at(0))){
  216.                     if(argv.size()>1){
  217.                         ErrorPrint::print_error(ErrorCode::TO_MANY_ARGUMENTS,"",AT_ERROR_ACTION::CONTINUE,argv.at(1));
  218.                         return ErrorCode::TO_MANY_ARGUMENTS;
  219.                     }
  220.                     return read_command(Application::config().get_user_config(argv.at(0))|std::ranges::views::transform([](auto& str){
  221.                         return std::string_view(str);
  222.                     })|std::ranges::to<std::vector<std::string_view>>());
  223.                 }
  224.                 else{
  225.                     ErrorPrint::print_error(ErrorCode::COMMAND_INPUT_X1_ERROR,"Undefined mode argument",AT_ERROR_ACTION::CONTINUE,argv.at(0));
  226.                     return ErrorCode::COMMAND_INPUT_X1_ERROR;
  227.                 }
  228.             }
  229.  
  230. ...
  231.  
  232.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement