mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
fix variant
add test variant
This commit is contained in:
parent
cb803dbd14
commit
c5d82f6a99
5 changed files with 249 additions and 5 deletions
|
@ -31,9 +31,9 @@ namespace sprout {
|
|||
template<typename Elem, typename Traits, typename... Types>
|
||||
inline std::basic_ostream<Elem, Traits>&
|
||||
operator<<(std::basic_ostream<Elem, Traits>& lhs, sprout::variant<Types...> const& rhs) {
|
||||
sprout::detail::variant_output_visitor<std::basic_ostream<Elem, Traits> > visitor(lhs);
|
||||
sprout::detail::variant_output_visitor<std::basic_ostream<Elem, Traits> > visitor(lhs);
|
||||
rhs.apply_visitor(visitor);
|
||||
return lhs;
|
||||
return lhs;
|
||||
}
|
||||
} // namespace sprout
|
||||
|
||||
|
|
|
@ -16,9 +16,14 @@
|
|||
#include <sprout/type/algorithm/find_index.hpp>
|
||||
|
||||
namespace sprout {
|
||||
template<typename... Types>
|
||||
class variant;
|
||||
|
||||
namespace detail {
|
||||
template<typename... Types>
|
||||
class variant_impl {
|
||||
template<typename...>
|
||||
friend class variant;
|
||||
protected:
|
||||
typedef sprout::tuples::tuple<Types...> tuple_type;
|
||||
typedef sprout::types::type_tuple<typename std::decay<Types>::type...> uncvref_tuple_type;
|
||||
|
@ -45,6 +50,7 @@ namespace sprout {
|
|||
{
|
||||
static_assert(Index::value < sizeof...(Types), "variant<>: invalid operand");
|
||||
}
|
||||
public:
|
||||
void swap(variant_impl& other)
|
||||
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::swap(tuple_, other.tuple_)))
|
||||
{
|
||||
|
@ -154,7 +160,7 @@ namespace sprout {
|
|||
{}
|
||||
// modifiers
|
||||
void swap(variant& other)
|
||||
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(impl_type::swap(other)))
|
||||
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::declval<impl_type&>().swap(other)))
|
||||
{
|
||||
impl_type::swap(other);
|
||||
}
|
||||
|
@ -244,11 +250,11 @@ namespace sprout {
|
|||
// visitation support
|
||||
template<typename Visitor>
|
||||
SPROUT_CONSTEXPR typename Visitor::result_type apply_visitor(Visitor&& visitor) const {
|
||||
return visit(tuple_, sprout::forward<Visitor>(visitor), which_);
|
||||
return visit<0>(tuple_, sprout::forward<Visitor>(visitor), which_);
|
||||
}
|
||||
template<typename Visitor>
|
||||
typename Visitor::result_type apply_visitor(Visitor&& visitor) {
|
||||
return visit(tuple_, sprout::forward<Visitor>(visitor), which_);
|
||||
return visit<0>(tuple_, sprout::forward<Visitor>(visitor), which_);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue