mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2025-01-21 20:36:37 +00:00
sprout/variant/apply_visitor.hpp 追加
This commit is contained in:
parent
04809933e0
commit
8103682fdb
5 changed files with 65 additions and 3 deletions
|
@ -61,7 +61,7 @@ namespace sprout {
|
||||||
};
|
};
|
||||||
|
|
||||||
template<std::size_t Index, typename... Types>
|
template<std::size_t Index, typename... Types>
|
||||||
class tuple_impl;
|
class tuple_impl;
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
class tuple_impl<Index> {
|
class tuple_impl<Index> {
|
||||||
public:
|
public:
|
||||||
|
@ -200,7 +200,7 @@ namespace sprout {
|
||||||
//
|
//
|
||||||
// tuple
|
// tuple
|
||||||
//
|
//
|
||||||
template<typename... Types>
|
template<typename... Types>
|
||||||
class tuple
|
class tuple
|
||||||
: public sprout::tuples::detail::tuple_impl<0, Types...>
|
: public sprout::tuples::detail::tuple_impl<0, Types...>
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,5 +4,7 @@
|
||||||
#include <sprout/config.hpp>
|
#include <sprout/config.hpp>
|
||||||
#include <sprout/variant/variant.hpp>
|
#include <sprout/variant/variant.hpp>
|
||||||
#include <sprout/variant/get.hpp>
|
#include <sprout/variant/get.hpp>
|
||||||
|
#include <sprout/variant/static_visitor.hpp>
|
||||||
|
#include <sprout/variant/apply_visitor.hpp>
|
||||||
|
|
||||||
#endif // #ifndef SPROUT_VARIANT_HPP
|
#endif // #ifndef SPROUT_VARIANT_HPP
|
||||||
|
|
18
sprout/variant/apply_visitor.hpp
Normal file
18
sprout/variant/apply_visitor.hpp
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef SPROUT_VARIANT_APPLY_VISITOR_HPP
|
||||||
|
#define SPROUT_VARIANT_APPLY_VISITOR_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
#include <sprout/utility/forward.hpp>
|
||||||
|
|
||||||
|
namespace sprout {
|
||||||
|
template<typename Visitor, typename Visitable>
|
||||||
|
SPROUT_CONSTEXPR inline typename Visitor::result_type apply_visitor(
|
||||||
|
Visitor&& visitor,
|
||||||
|
Visitable&& visitable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return sprout::forward<Visitable>(visitable).apply_visitor(sprout::forward<Visitor>(visitor));
|
||||||
|
}
|
||||||
|
} // namespace sprout
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_VARIANT_APPLY_VISITOR_HPP
|
14
sprout/variant/static_visitor.hpp
Normal file
14
sprout/variant/static_visitor.hpp
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef SPROUT_VARIANT_STATIC_VISITOR_HPP
|
||||||
|
#define SPROUT_VARIANT_STATIC_VISITOR_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
|
||||||
|
namespace sprout {
|
||||||
|
template<typename R = void>
|
||||||
|
class static_visitor {
|
||||||
|
public:
|
||||||
|
typedef R result_type;
|
||||||
|
};
|
||||||
|
} // namespace sprout
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_VARIANT_STATIC_VISITOR_HPP
|
|
@ -114,6 +114,23 @@ namespace sprout {
|
||||||
: output<I + 1>(os, t, which)
|
: output<I + 1>(os, t, which)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
template<int I, typename Tuple, typename Visitor>
|
||||||
|
static SPROUT_CONSTEXPR typename std::enable_if<
|
||||||
|
I == sizeof...(Types),
|
||||||
|
typename Visitor::result_type
|
||||||
|
>::type visit(Tuple&& t, Visitor&& v, int which) {
|
||||||
|
return typename Visitor::result_type();
|
||||||
|
}
|
||||||
|
template<int I, typename Tuple, typename Visitor>
|
||||||
|
static SPROUT_CONSTEXPR typename std::enable_if<
|
||||||
|
I != sizeof...(Types),
|
||||||
|
typename Visitor::result_type
|
||||||
|
>::type visit(Tuple&& t, Visitor&& v, int which) {
|
||||||
|
return I == which
|
||||||
|
? sprout::forward<Visitor>(v)(sprout::tuples::get<I>(sprout::forward<Tuple>(t)))
|
||||||
|
: visit<I + 1>(sprout::forward<Tuple>(t), sprout::forward<Visitor>(v), which)
|
||||||
|
;
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
using impl_type::tuple_;
|
using impl_type::tuple_;
|
||||||
using impl_type::which_;
|
using impl_type::which_;
|
||||||
|
@ -149,7 +166,7 @@ namespace sprout {
|
||||||
return which_;
|
return which_;
|
||||||
}
|
}
|
||||||
SPROUT_CONSTEXPR bool empty() const {
|
SPROUT_CONSTEXPR bool empty() const {
|
||||||
return sizeof...(Types) == 0;
|
return false;
|
||||||
}
|
}
|
||||||
// relational
|
// relational
|
||||||
friend SPROUT_CONSTEXPR bool operator==(variant const& lhs, variant const& rhs) {
|
friend SPROUT_CONSTEXPR bool operator==(variant const& lhs, variant const& rhs) {
|
||||||
|
@ -177,6 +194,7 @@ namespace sprout {
|
||||||
friend std::basic_ostream<Elem, Traits>& operator<<(std::basic_ostream<Elem, Traits>& lhs, variant const& rhs) {
|
friend std::basic_ostream<Elem, Traits>& operator<<(std::basic_ostream<Elem, Traits>& lhs, variant const& rhs) {
|
||||||
return output<0>(lhs, rhs.tuple_, rhs.which_);
|
return output<0>(lhs, rhs.tuple_, rhs.which_);
|
||||||
}
|
}
|
||||||
|
// get support
|
||||||
template<typename U>
|
template<typename U>
|
||||||
SPROUT_CONSTEXPR typename std::enable_if<
|
SPROUT_CONSTEXPR typename std::enable_if<
|
||||||
sprout::types::find_index<tuple_type, U>::value != sizeof...(Types),
|
sprout::types::find_index<tuple_type, U>::value != sizeof...(Types),
|
||||||
|
@ -197,6 +215,15 @@ namespace sprout {
|
||||||
: (throw std::domain_error("variant<>: bad get"), sprout::tuples::get<sprout::types::find_index<tuple_type, U>::value>(tuple_))
|
: (throw std::domain_error("variant<>: bad get"), sprout::tuples::get<sprout::types::find_index<tuple_type, U>::value>(tuple_))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
// visitation support
|
||||||
|
template<typename Visitor>
|
||||||
|
SPROUT_CONSTEXPR typename Visitor::result_type apply_visitor(Visitor&& visitor) const {
|
||||||
|
return visit(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_);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -217,6 +244,7 @@ namespace std {
|
||||||
// tuple_size
|
// tuple_size
|
||||||
//
|
//
|
||||||
template<typename... Types>
|
template<typename... Types>
|
||||||
|
|
||||||
struct tuple_size<sprout::variant<Types...> >
|
struct tuple_size<sprout::variant<Types...> >
|
||||||
: public std::tuple_size<typename sprout::variant<Types...>::tuple_tyep>
|
: public std::tuple_size<typename sprout::variant<Types...>::tuple_tyep>
|
||||||
{};
|
{};
|
||||||
|
|
Loading…
Reference in a new issue