mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
fix tuples::tuple_element, tuples::tuple_cat
add test tuple
This commit is contained in:
parent
d75283355c
commit
cb803dbd14
10 changed files with 323 additions and 92 deletions
|
@ -4,10 +4,10 @@
|
|||
#include <sprout/config.hpp>
|
||||
#include <sprout/tuple/tuple/tuple_fwd.hpp>
|
||||
#include <sprout/tuple/tuple/tuple.hpp>
|
||||
#include <sprout/tuple/tuple/comparison.hpp>
|
||||
#include <sprout/tuple/tuple/get.hpp>
|
||||
#include <sprout/tuple/tuple/ignore.hpp>
|
||||
#include <sprout/tuple/tuple/make_tuple.hpp>
|
||||
#include <sprout/tuple/tuple/comparison.hpp>
|
||||
#include <sprout/tuple/tuple/type_traits.hpp>
|
||||
#include <sprout/tuple/tuple/hash.hpp>
|
||||
|
||||
|
|
|
@ -40,17 +40,26 @@ namespace sprout {
|
|||
: public std::tuple_element<I, T>
|
||||
{};
|
||||
template<std::size_t I, typename T>
|
||||
struct tuple_element<I, T const>
|
||||
: public sprout::tuples::tuple_element<I, T>
|
||||
{};
|
||||
struct tuple_element<I, T const> {
|
||||
public:
|
||||
typedef typename std::add_const<
|
||||
typename sprout::tuples::tuple_element<I, T>::type
|
||||
>::type type;
|
||||
};
|
||||
template<std::size_t I, typename T>
|
||||
struct tuple_element<I, T volatile>
|
||||
: public sprout::tuples::tuple_element<I, T>
|
||||
{};
|
||||
struct tuple_element<I, T volatile> {
|
||||
public:
|
||||
typedef typename std::add_volatile<
|
||||
typename sprout::tuples::tuple_element<I, T>::type
|
||||
>::type type;
|
||||
};
|
||||
template<std::size_t I, typename T>
|
||||
struct tuple_element<I, T const volatile>
|
||||
: public sprout::tuples::tuple_element<I, T>
|
||||
{};
|
||||
struct tuple_element<I, T const volatile> {
|
||||
public:
|
||||
typedef typename std::add_cv<
|
||||
typename sprout::tuples::tuple_element<I, T>::type
|
||||
>::type type;
|
||||
};
|
||||
|
||||
namespace detail {
|
||||
template<std::size_t I, typename Head, typename... Tail>
|
||||
|
|
|
@ -14,7 +14,8 @@ namespace sprout {
|
|||
// make_tuple
|
||||
//
|
||||
template<typename... Types>
|
||||
inline SPROUT_CONSTEXPR sprout::tuples::tuple<typename std::decay<Types>::type...> make_tuple(Types&&... args) {
|
||||
inline SPROUT_CONSTEXPR sprout::tuples::tuple<typename std::decay<Types>::type...>
|
||||
make_tuple(Types&&... args) {
|
||||
return sprout::tuples::tuple<typename std::decay<Types>::type...>(sprout::forward<Types>(args)...);
|
||||
}
|
||||
|
||||
|
@ -22,7 +23,8 @@ namespace sprout {
|
|||
// forward_as_tuple
|
||||
//
|
||||
template<typename... Types>
|
||||
inline SPROUT_CONSTEXPR sprout::tuples::tuple<Types&&...> forward_as_tuple(Types&&... args) SPROUT_NOEXCEPT {
|
||||
inline SPROUT_CONSTEXPR sprout::tuples::tuple<Types&&...>
|
||||
forward_as_tuple(Types&&... args) SPROUT_NOEXCEPT {
|
||||
return sprout::tuples::tuple<Types&&...>(sprout::forward<Types>(args)...);
|
||||
}
|
||||
|
||||
|
@ -30,7 +32,8 @@ namespace sprout {
|
|||
// tie
|
||||
//
|
||||
template<typename... Types>
|
||||
inline sprout::tuples::tuple<Types&...> tie(Types&... args) SPROUT_NOEXCEPT {
|
||||
inline sprout::tuples::tuple<Types&...>
|
||||
tie(Types&... args) SPROUT_NOEXCEPT {
|
||||
return sprout::tuples::tuple<Types&...>(args...);
|
||||
}
|
||||
|
||||
|
@ -86,7 +89,7 @@ namespace sprout {
|
|||
template<typename... Tuples>
|
||||
struct tuple_cat
|
||||
: public sprout::tuples::result_of::detail::tuple_cat_impl<
|
||||
typename std::remove_reference<Tuples>::type...
|
||||
typename std::decay<Tuples>::type...
|
||||
>
|
||||
{};
|
||||
} // namespace result_of
|
||||
|
@ -109,23 +112,6 @@ namespace sprout {
|
|||
|
||||
template<typename Result, typename IndexTuple, typename... Tuples>
|
||||
struct tuple_cat_impl;
|
||||
template<typename Result, sprout::index_t... Indexes, typename Head, typename... Tail>
|
||||
struct tuple_cat_impl<Result, sprout::index_tuple<Indexes...>, Head, Tail...> {
|
||||
public:
|
||||
template<typename... Args>
|
||||
static SPROUT_CONSTEXPR Result
|
||||
call(Head&& head, Tail&&... tail, Args&&... args) {
|
||||
return sprout::tuples::detail::tuple_cat_impl<
|
||||
Result,
|
||||
typename sprout::tuples::detail::tuple_cat_1st_indexes<Tail...>::type,
|
||||
Tail...
|
||||
>::call(
|
||||
sprout::forward<Tail>(tail)...,
|
||||
sprout::forward<Args>(args)...,
|
||||
sprout::tuples::get<Indexes>(sprout::forward<Head>(head))...
|
||||
);
|
||||
}
|
||||
};
|
||||
template<typename Result>
|
||||
struct tuple_cat_impl<Result, sprout::index_tuple<> > {
|
||||
public:
|
||||
|
@ -135,6 +121,22 @@ namespace sprout {
|
|||
return Result(sprout::forward<Args>(args)...);
|
||||
}
|
||||
};
|
||||
template<typename Result, sprout::index_t... Indexes, typename Head, typename... Tail>
|
||||
struct tuple_cat_impl<Result, sprout::index_tuple<Indexes...>, Head, Tail...> {
|
||||
public:
|
||||
template<typename T, typename... Args>
|
||||
static SPROUT_CONSTEXPR Result
|
||||
call(T&& t, Args&&... args) {
|
||||
return sprout::tuples::detail::tuple_cat_impl<
|
||||
Result,
|
||||
typename sprout::tuples::detail::tuple_cat_1st_indexes<Tail...>::type,
|
||||
Tail...
|
||||
>::call(
|
||||
sprout::forward<Args>(args)...,
|
||||
sprout::tuples::get<Indexes>(sprout::forward<T>(t))...
|
||||
);
|
||||
}
|
||||
};
|
||||
} // namespace detail
|
||||
//
|
||||
// tuple_cat
|
||||
|
|
|
@ -93,6 +93,8 @@ namespace sprout {
|
|||
template<std::size_t Index>
|
||||
class tuple_impl<Index> {
|
||||
public:
|
||||
template<typename...>
|
||||
friend class tuple;
|
||||
template<std::size_t, typename...>
|
||||
friend class sprout::tuples::detail::tuple_impl;
|
||||
protected:
|
||||
|
@ -124,6 +126,8 @@ namespace sprout {
|
|||
, private sprout::tuples::detail::head_base<Index, Head, std::is_empty<Head>::value>
|
||||
{
|
||||
public:
|
||||
template<typename...>
|
||||
friend class tuple;
|
||||
template<std::size_t, typename...>
|
||||
friend class sprout::tuples::detail::tuple_impl;
|
||||
public:
|
||||
|
@ -142,11 +146,11 @@ namespace sprout {
|
|||
static SPROUT_CONSTEXPR inherited_type const& tail(tuple_impl const& t) SPROUT_NOEXCEPT {
|
||||
return t;
|
||||
}
|
||||
protected:
|
||||
public:
|
||||
void swap(tuple_impl& t)
|
||||
SPROUT_NOEXCEPT_EXPR(
|
||||
SPROUT_NOEXCEPT_EXPR(sprout::swap(head(std::declval<Head&>()), head(t)))
|
||||
&& SPROUT_NOEXCEPT_EXPR(inherited_type::swap(tail(t)))
|
||||
SPROUT_NOEXCEPT_EXPR(sprout::swap(head(std::declval<tuple_impl&>()), head(t)))
|
||||
&& SPROUT_NOEXCEPT_EXPR(std::declval<inherited_type&>().swap(tail(t)))
|
||||
)
|
||||
{
|
||||
sprout::swap(head(*this), head(t));
|
||||
|
@ -223,52 +227,6 @@ namespace sprout {
|
|||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
template<bool Head, bool... Tail>
|
||||
struct and_impl;
|
||||
template<>
|
||||
struct and_impl<true>
|
||||
: public std::true_type
|
||||
{};
|
||||
template<>
|
||||
struct and_impl<false>
|
||||
: public std::false_type
|
||||
{};
|
||||
template<bool... Tail>
|
||||
struct and_impl<true, Tail...>
|
||||
: public std::integral_constant<bool, sprout::tuples::detail::and_impl<Tail...>::value>
|
||||
{};
|
||||
template<bool... Tail>
|
||||
struct and_impl<false, Tail...>
|
||||
: public std::false_type
|
||||
{};
|
||||
template<typename... Types>
|
||||
struct and_
|
||||
: public sprout::tuples::detail::and_impl<Types::value...>
|
||||
{};
|
||||
|
||||
template<bool Head, bool... Tail>
|
||||
struct or_impl;
|
||||
template<>
|
||||
struct or_impl<true>
|
||||
: public std::true_type
|
||||
{};
|
||||
template<>
|
||||
struct or_impl<false>
|
||||
: public std::false_type
|
||||
{};
|
||||
template<bool... Tail>
|
||||
struct or_impl<true, Tail...>
|
||||
: public std::true_type
|
||||
{};
|
||||
template<bool... Tail>
|
||||
struct or_impl<false, Tail...>
|
||||
: public std::integral_constant<bool, sprout::tuples::detail::or_impl<Tail...>::value>
|
||||
{};
|
||||
template<typename... Types>
|
||||
struct or_
|
||||
: public sprout::tuples::detail::and_impl<Types::value...>
|
||||
{};
|
||||
} // namespace detail
|
||||
|
||||
//
|
||||
|
@ -278,7 +236,7 @@ namespace sprout {
|
|||
class tuple
|
||||
: public sprout::tuples::detail::tuple_impl<0, Types...>
|
||||
{
|
||||
public:
|
||||
private:
|
||||
typedef sprout::tuples::detail::tuple_impl<0, Types...> inherited_type;
|
||||
public:
|
||||
// tuple construction
|
||||
|
@ -338,7 +296,7 @@ namespace sprout {
|
|||
}
|
||||
// tuple swap
|
||||
void swap(tuple& other)
|
||||
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(inherited_type::swap(other)))
|
||||
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::declval<inherited_type&>().swap(other)))
|
||||
{
|
||||
inherited_type::swap(other);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue