Skip to content

Commit

Permalink
add variant_size helper
Browse files Browse the repository at this point in the history
  • Loading branch information
artemp committed Oct 23, 2017
1 parent 30560e1 commit 835ebc1
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
34 changes: 34 additions & 0 deletions include/mapbox/variant.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,29 @@ ResultType const& get_unchecked(T const& var)
{
return var.template get_unchecked<ResultType>();
}
// variant_size
template <typename T>
struct variant_size;

//variable templates is c++14
//template <typename T>
//constexpr std::size_t variant_size_v = variant_size<T>::value;

template <typename T>
struct variant_size<const T>
: variant_size<T> {};

template <typename T>
struct variant_size<volatile T>
: variant_size<T> {};

template <typename T>
struct variant_size<const volatile T>
: variant_size<T> {};

template <typename... Types>
struct variant_size<variant<Types...>>
: std::integral_constant<std::size_t, sizeof...(Types)> {};

// variant_alternative
template <std::size_t Index, typename T>
Expand Down Expand Up @@ -1060,6 +1083,17 @@ struct variant_alternative<0, variant<First, Types...>>
template <size_t Index, typename T>
using variant_alternative_t = typename variant_alternative<Index, T>::type;

template <size_t Index, typename T>
struct variant_alternative<Index, const T>
: std::add_const<variant_alternative<Index, T>> {};

template <size_t Index, typename T>
struct variant_alternative<Index, volatile T>
: std::add_volatile<variant_alternative<Index, T>> {};

template <size_t Index, typename T>
struct variant_alternative<Index, const volatile T>
: std::add_cv<variant_alternative<Index, T>> {};

} // namespace util
} // namespace mapbox
Expand Down
12 changes: 11 additions & 1 deletion test/t/variant_alternative.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

#include <string>

TEST_CASE("variant alternative", "[types]")
TEST_CASE("variant_alternative", "[types]")
{
using variant_type = mapbox::util::variant<int, double, std::string>;
using type_0 = mapbox::util::variant_alternative<0, variant_type>::type;
Expand All @@ -19,3 +19,13 @@ TEST_CASE("variant alternative", "[types]")
CHECK(check_1);
CHECK(check_2);
}

TEST_CASE("variant_size", "[types]")
{
constexpr auto value_0 = mapbox::util::variant_size<mapbox::util::variant<>>::value;
constexpr auto value_1 = mapbox::util::variant_size<mapbox::util::variant<int>>::value;
constexpr auto value_2 = mapbox::util::variant_size<mapbox::util::variant<int, std::string>>::value;
CHECK(value_0 == 0);
CHECK(value_1 == 1);
CHECK(value_2 == 2);
}

0 comments on commit 835ebc1

Please sign in to comment.