#include <iostream>
#include <exception>
enum class Launches : std::uint32_t
{
First = 0,
D_FROM_FILE = First,
D_FROM_FDISK,
D_FROM_RDDISK,
D_FROM_USB,
D_FROM_UI,
D_FROM_NET,
D_FROM_DEFAULT,
Last = D_FROM_DEFAULT
};
template< typename E, typename T >
Launches seq_enum_cast(T v)
{
return v >= static_cast<T>(E::First) && v <= static_cast<T>(E::Last)
? static_cast<E>(v)
: throw std::bad_cast();
}
int main()
{
try
{
auto a = seq_enum_cast<Launches>(1);
std::cout << "a - success\n";
auto b = seq_enum_cast<Launches>(-3); // fails
std::cout << "b - success\n";
}
catch (const std::bad_cast& e)
{
std::cout << e.what();
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZXhjZXB0aW9uPgoKZW51bSBjbGFzcyBMYXVuY2hlcyA6IHN0ZDo6dWludDMyX3QKewogIEZpcnN0ID0gMCwKCiAgRF9GUk9NX0ZJTEUgPSBGaXJzdCwKICBEX0ZST01fRkRJU0ssCiAgRF9GUk9NX1JERElTSywKICBEX0ZST01fVVNCLAogIERfRlJPTV9VSSwKICBEX0ZST01fTkVULAogIERfRlJPTV9ERUZBVUxULAoKICBMYXN0ID0gRF9GUk9NX0RFRkFVTFQKfTsKCnRlbXBsYXRlPCB0eXBlbmFtZSBFLCB0eXBlbmFtZSBUID4KTGF1bmNoZXMgc2VxX2VudW1fY2FzdChUICB2KQp7CiAgcmV0dXJuIHYgPj0gc3RhdGljX2Nhc3Q8VD4oRTo6Rmlyc3QpICYmIHYgPD0gc3RhdGljX2Nhc3Q8VD4oRTo6TGFzdCkKICAgID8gc3RhdGljX2Nhc3Q8RT4odikKICAgIDogdGhyb3cgc3RkOjpiYWRfY2FzdCgpOwp9CgppbnQgbWFpbigpCnsKICB0cnkKICB7CiAgICBhdXRvIGEgPSBzZXFfZW51bV9jYXN0PExhdW5jaGVzPigxKTsKICAgIHN0ZDo6Y291dCA8PCAiYSAtIHN1Y2Nlc3NcbiI7CiAgICBhdXRvIGIgPSBzZXFfZW51bV9jYXN0PExhdW5jaGVzPigtMyk7IC8vIGZhaWxzCiAgICBzdGQ6OmNvdXQgPDwgImIgLSBzdWNjZXNzXG4iOwogIH0KICBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfY2FzdCYgZSkKICB7CiAgICBzdGQ6OmNvdXQgPDwgZS53aGF0KCk7CiAgfQp9