#pragma once namespace uart { enum class DataBits { FIVE, SIX, SEVEN, EIGHT, NINE, }; enum class StopBits { ONE, TWO, }; enum class Parity { NONE, ODD, EVEN, }; namespace detail { template struct choose_data_type { using type = uint8_t; }; template <> struct choose_data_type { using type = uint16_t; }; } // namespace detail template struct config { static constexpr auto BAUD_RATE = baudRate; static constexpr auto DATA_BITS = dataBits; static constexpr auto PARITY = parity; static constexpr auto STOP_BITS = stopBits; using data_t = typename detail::choose_data_type::type; }; } // namespace uart