Информация об изменениях

Сообщение Re[9]: Определение регулярных последовательностей статически от 16.12.2024 12:20

Изменено 16.12.2024 13:18 kov_serg

Re[9]: Определение регулярных последовательностей статически
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>У Вас получается скомпилировать это с consteval? Мой прошлогодний VC++ отказывается.


consteval не умеет static. Поэтому там есть второй вариант без лямбд.
struct Rec {
    enum Type { RT_End, RT_Int, RT_Cstr, RT_Rec, RT_Enter, RT_Leave };
    int type, id;
    union {
        int v_int;
        const char* v_cstr;
        struct Rec *v_rec;
    };
    constexpr Rec() : type(RT_End),id(0),v_int(0) {}
    constexpr Rec(int id,int v) : type(RT_Int),id(id),v_int(v) {}
    constexpr Rec(int id,const char* v) : type(RT_Cstr),id(id),v_cstr(v) {}
    constexpr Rec(int id,Rec *v) : type(RT_Rec),id(id),v_rec(v) {}
    struct Enter{}; constexpr Rec(Enter,int id) : type(RT_Enter),id(id),v_int(0) {}
    struct Leave{}; constexpr Rec(Leave) : type(RT_Leave),id(0),v_int(0) {}
};

#define R_ENTER(id)      { Rec::Enter(),id },
#define R_LEAVE()        { Rec::Leave() },
enum ParameterType { PT_MaxNumberOfLines, PT_AllowedLineTypes, PT_UniqueKey, PT_LineConfig };
enum LineParameterType { LPT_Id,LPT_Name,LPT_Dir };
enum LT { LT_Mic=1,LT_DigitalOutput=2,LT_Speakers=4 };
enum LD { LD_Input,LD_Output };
const Rec ParameterList[]={
    { PT_UniqueKey,"12345-67890" },
    { PT_AllowedLineTypes,LT_Mic | LT_DigitalOutput | LT_Speakers },
    R_ENTER(PT_LineConfig)
        { LPT_Name,"line3" },
        { LPT_Id,12 },
        { LPT_Dir,LD_Input },
    R_LEAVE()    
    R_ENTER(PT_LineConfig)
        { LPT_Name,"line4" },
        { LPT_Id,7 },
        { LPT_Dir,LD_Output },
    R_LEAVE()
    { PT_MaxNumberOfLines,5 },
    {}
};


Если отдельно вложенные структуры определять то тоже работает: https://godbolt.org/z/Ec34cKznd
Re[9]: Определение регулярных последовательностей статически
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>У Вас получается скомпилировать это с consteval? Мой прошлогодний VC++ отказывается.


consteval не умеет static. Поэтому там есть второй вариант без лямбд.
struct Rec {
    enum Type { RT_End, RT_Int, RT_Cstr, RT_Rec, RT_Enter, RT_Leave };
    int type, id;
    union {
        int v_int;
        const char* v_cstr;
        struct Rec *v_rec;
    };
    constexpr Rec() : type(RT_End),id(0),v_int(0) {}
    constexpr Rec(int id,int v) : type(RT_Int),id(id),v_int(v) {}
    constexpr Rec(int id,const char* v) : type(RT_Cstr),id(id),v_cstr(v) {}
    constexpr Rec(int id,Rec *v) : type(RT_Rec),id(id),v_rec(v) {}
    struct Enter{}; constexpr Rec(Enter,int id) : type(RT_Enter),id(id),v_int(0) {}
    struct Leave{}; constexpr Rec(Leave) : type(RT_Leave),id(0),v_int(0) {}
};

#define R_ENTER(id)      { Rec::Enter(),id },
#define R_LEAVE()        { Rec::Leave() },
enum ParameterType { PT_MaxNumberOfLines, PT_AllowedLineTypes, PT_UniqueKey, PT_LineConfig };
enum LineParameterType { LPT_Id,LPT_Name,LPT_Dir };
enum LT { LT_Mic=1,LT_DigitalOutput=2,LT_Speakers=4 };
enum LD { LD_Input,LD_Output };
const Rec ParameterList[]={
    { PT_UniqueKey,"12345-67890" },
    { PT_AllowedLineTypes,LT_Mic | LT_DigitalOutput | LT_Speakers },
    R_ENTER(PT_LineConfig)
        { LPT_Name,"line3" },
        { LPT_Id,12 },
        { LPT_Dir,LD_Input },
    R_LEAVE()    
    R_ENTER(PT_LineConfig)
        { LPT_Name,"line4" },
        { LPT_Id,7 },
        { LPT_Dir,LD_Output },
    R_LEAVE()
    { PT_MaxNumberOfLines,5 },
    {}
};


Если отдельно вложенные структуры определять то тоже constexpr работает: https://godbolt.org/z/rMTrsMbse