mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2024-11-12 21:09:01 +00:00
99 lines
2.5 KiB
C++
99 lines
2.5 KiB
C++
#ifndef SPROUT_TUPLE_TRAITS_HPP
|
|
#define SPROUT_TUPLE_TRAITS_HPP
|
|
|
|
#include <sprout/config.hpp>
|
|
#include <sprout/tuple/tuple.hpp>
|
|
|
|
namespace sprout {
|
|
namespace tuples {
|
|
//
|
|
// tuple_traits
|
|
//
|
|
template<typename Tuple>
|
|
struct tuple_traits {
|
|
public:
|
|
typedef Tuple internal_type;
|
|
typedef Tuple clone_type;
|
|
};
|
|
template<typename Tuple>
|
|
struct tuple_traits<Tuple const>
|
|
: public sprout::tuples::tuple_traits<Tuple>
|
|
{};
|
|
|
|
//
|
|
// rebind_types
|
|
//
|
|
template<typename Tuple>
|
|
struct rebind_types {
|
|
public:
|
|
template<typename... Types>
|
|
struct apply;
|
|
};
|
|
template<typename... Ts>
|
|
struct rebind_types<sprout::tuples::tuple<Ts...> > {
|
|
public:
|
|
template<typename... Types>
|
|
struct apply {
|
|
public:
|
|
typedef sprout::tuples::tuple<Types...> type;
|
|
};
|
|
};
|
|
|
|
//
|
|
// clone_functor
|
|
//
|
|
template<typename Tuple>
|
|
struct clone_functor {
|
|
public:
|
|
template<typename Other>
|
|
SPROUT_CONSTEXPR typename sprout::tuples::tuple_traits<Tuple>::clone_type operator()(Other&& t) const {
|
|
return typename sprout::tuples::tuple_traits<Tuple>::clone_type(sprout::forward<Other>(t));
|
|
}
|
|
};
|
|
template<typename Tuple>
|
|
struct clone_functor<Tuple const>
|
|
: public sprout::tuples::clone_functor<Tuple>
|
|
{};
|
|
|
|
//
|
|
// make_clone_functor
|
|
//
|
|
template<typename Tuple>
|
|
struct make_clone_functor {
|
|
public:
|
|
template<typename... Args>
|
|
SPROUT_CONSTEXPR typename sprout::tuples::tuple_traits<Tuple>::clone_type operator()(Args&&... args) const {
|
|
return typename sprout::tuples::tuple_traits<Tuple>::clone_type(sprout::forward<Args>(args)...);
|
|
}
|
|
};
|
|
template<typename Tuple>
|
|
struct make_clone_functor<Tuple const>
|
|
: public sprout::tuples::make_clone_functor<Tuple>
|
|
{};
|
|
|
|
//
|
|
// remake_clone_functor
|
|
//
|
|
template<typename Tuple>
|
|
struct remake_clone_functor {
|
|
public:
|
|
template<typename Other, typename... Args>
|
|
SPROUT_CONSTEXPR typename sprout::tuples::tuple_traits<Tuple>::clone_type operator()(
|
|
Other&& other,
|
|
Args&&... args
|
|
) const
|
|
{
|
|
return sprout::tuples::make_clone_functor<Tuple>().template operator()(sprout::forward<Args>(args)...);
|
|
}
|
|
};
|
|
template<typename Tuple>
|
|
struct remake_clone_functor<Tuple const>
|
|
: public sprout::tuples::remake_clone_functor<Tuple>
|
|
{};
|
|
} // namespace tuples
|
|
|
|
using sprout::tuples::tuple_traits;
|
|
using sprout::tuples::rebind_types;
|
|
} // namespace sprout
|
|
|
|
#endif // #ifndef SPROUT_TUPLE_TRAITS_HPP
|