1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
// Copyright 2025 Braden Ganetsky
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/compat/to_underlying.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/core/lightweight_test_trait.hpp>
#include <cstdint>
enum unscoped
{
unscoped_value = 1
};
enum unscoped_int8_t : std::int8_t
{
unscoped_int8_t_value = 2
};
enum unscoped_uint16_t : std::uint16_t
{
unscoped_uint16_t_value = 3
};
enum class scoped
{
value = 4
};
enum class scoped_int8_t : std::int8_t
{
value = 5
};
enum class scoped_uint16_t : std::uint16_t
{
value = 6
};
int main()
{
{
auto output = boost::compat::to_underlying(unscoped_value);
// Per the standard [dcl.enum], the underlying type of an unscoped enumeration
// is unspecified, unless it is explicitly specified.
BOOST_TEST_EQ(output, 1);
}
{
auto output = boost::compat::to_underlying(unscoped_int8_t_value);
BOOST_TEST_TRAIT_SAME(decltype(output), std::int8_t);
BOOST_TEST_EQ(output, 2);
}
{
auto output = boost::compat::to_underlying(unscoped_uint16_t_value);
BOOST_TEST_TRAIT_SAME(decltype(output), std::uint16_t);
BOOST_TEST_EQ(output, 3);
}
{
auto output = boost::compat::to_underlying(scoped::value);
BOOST_TEST_TRAIT_SAME(decltype(output), int);
BOOST_TEST_EQ(output, 4);
}
{
auto output = boost::compat::to_underlying(scoped_int8_t::value);
BOOST_TEST_TRAIT_SAME(decltype(output), std::int8_t);
BOOST_TEST_EQ(output, 5);
}
{
auto output = boost::compat::to_underlying(scoped_uint16_t::value);
BOOST_TEST_TRAIT_SAME(decltype(output), std::uint16_t);
BOOST_TEST_EQ(output, 6);
}
return boost::report_errors();
}
|