mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
fix weed type_traits
This commit is contained in:
parent
f712788cce
commit
c78e1d0e6d
27 changed files with 279 additions and 306 deletions
|
@ -7,6 +7,7 @@
|
|||
#include <sprout/array/array.hpp>
|
||||
#include <sprout/tuple/tuple.hpp>
|
||||
#include <sprout/variant/variant.hpp>
|
||||
#include <sprout/type_traits/identity.hpp>
|
||||
#include <sprout/weed/unused.hpp>
|
||||
#include <sprout/weed/traits/type/is_char_type.hpp>
|
||||
#include <sprout/weed/detail/is_same_container.hpp>
|
||||
|
@ -36,14 +37,13 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_same_container<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
!(sprout::tuples::tuple_size<T>::value < sprout::tuples::tuple_size<U>::value),
|
||||
T,
|
||||
U
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// container<V, N> | V -> container<V, N ? N : 1>
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -52,14 +52,13 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_container_and_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
sprout::container_traits<T>::static_size != 0,
|
||||
T,
|
||||
typename sprout::container_transform_traits<T>::template rebind_size<1>::type
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// V | container<V, N> -> container<V, N ? N : 1>
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -68,14 +67,13 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_elem_and_container<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
sprout::container_traits<T>::static_size != 0,
|
||||
U,
|
||||
typename sprout::container_transform_traits<U>::template rebind_size<1>::type
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// tuple<Vs...> | tuple<Ws...> -> tuple<max(Vs..., Ws...)>
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -84,14 +82,13 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_both_tuple<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
!(sprout::tuples::tuple_size<T>::value < sprout::tuples::tuple_size<U>::value),
|
||||
T,
|
||||
U
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// V | V -> V
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -100,10 +97,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_same_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef T type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<T>
|
||||
{};
|
||||
// V | W -> variant<V, W>
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -112,10 +108,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_different_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef sprout::variant<T, U> type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<sprout::variant<T, U> >
|
||||
{};
|
||||
// V | unused -> container<V, 1>
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -124,14 +119,13 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_elem_and_unused<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
sprout::weed::traits::is_char_type<T>::value,
|
||||
sprout::basic_string<T, 1>,
|
||||
sprout::array<T, 1>
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// unused | V -> container<V, 1>
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -140,14 +134,13 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_unused_and_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
sprout::weed::traits::is_char_type<U>::value,
|
||||
sprout::basic_string<U, 1>,
|
||||
sprout::array<U, 1>
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// unused | unused -> unused
|
||||
template<typename T, typename U>
|
||||
struct bitwise_or<
|
||||
|
@ -156,10 +149,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_both_unused<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef sprout::weed::unused type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<sprout::weed::unused>
|
||||
{};
|
||||
} // namespace result_of
|
||||
} // namespace attr_cnv
|
||||
} // namespace weed
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/type_traits/identity.hpp>
|
||||
#include <sprout/weed/unused.hpp>
|
||||
#include <sprout/weed/traits/type/is_unused.hpp>
|
||||
|
||||
|
@ -22,10 +23,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::traits::is_unused<T>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef sprout::weed::unused type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<sprout::weed::unused>
|
||||
{};
|
||||
} // namespace result_of
|
||||
} // namespace attr_cnv
|
||||
} // namespace weed
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <sprout/tuple/operation/append_back.hpp>
|
||||
#include <sprout/tuple/operation/push_back.hpp>
|
||||
#include <sprout/tuple/operation/push_front.hpp>
|
||||
#include <sprout/type_traits/identity.hpp>
|
||||
#include <sprout/weed/unused.hpp>
|
||||
#include <sprout/weed/traits/type/is_char_type.hpp>
|
||||
#include <sprout/weed/detail/is_same_container.hpp>
|
||||
|
@ -42,10 +43,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_same_container<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename sprout::fixed::result_of::append_back<T, U>::type type;
|
||||
};
|
||||
>
|
||||
: public sprout::fixed::result_of::append_back<T, U>
|
||||
{};
|
||||
// container<V, N> >> V -> container<V, N + 1>
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -54,10 +54,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_container_and_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename sprout::fixed::result_of::push_back<T, U>::type type;
|
||||
};
|
||||
>
|
||||
: public sprout::fixed::result_of::push_back<T, U>
|
||||
{};
|
||||
// V >> container<V, N> -> container<V, N + 1>
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -66,10 +65,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_elem_and_container<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename sprout::fixed::result_of::push_front<T, U>::type type;
|
||||
};
|
||||
>
|
||||
: public sprout::fixed::result_of::push_front<T, U>
|
||||
{};
|
||||
// tuple<Vs...> >> tuple<Ws...> -> tuple<Vs..., Ws...>
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -78,10 +76,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_both_tuple<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename sprout::tuples::result_of::append_back<T, U>::type type;
|
||||
};
|
||||
>
|
||||
: public sprout::tuples::result_of::append_back<T, U>
|
||||
{};
|
||||
// tuple<Vs...> >> V -> tuple<Vs..., V>
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -90,10 +87,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_tuple_and_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename sprout::tuples::result_of::push_back<T, U>::type type;
|
||||
};
|
||||
>
|
||||
: public sprout::tuples::result_of::push_back<T, U>
|
||||
{};
|
||||
// V >> tuple<Vs...> -> tuple<V, Vs...>
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -102,10 +98,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_elem_and_tuple<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename sprout::tuples::result_of::push_front<T, U>::type type;
|
||||
};
|
||||
>
|
||||
: public sprout::tuples::result_of::push_front<T, U>
|
||||
{};
|
||||
// V >> V -> container<V, 2>
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -114,14 +109,13 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_same_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
sprout::weed::traits::is_char_type<T>::value,
|
||||
sprout::basic_string<T, 2>,
|
||||
sprout::array<T, 2>
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// V >> W -> tuple<V, W>
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -130,10 +124,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_different_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef sprout::tuples::tuple<T, U> type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<sprout::tuples::tuple<T, U> >
|
||||
{};
|
||||
// V >> unused -> V
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -142,10 +135,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_elem_and_unused<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef T type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<T>
|
||||
{};
|
||||
// unused >> V -> V
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -154,10 +146,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_unused_and_elem<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef U type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<U>
|
||||
{};
|
||||
// unused >> unused -> unused
|
||||
template<typename T, typename U>
|
||||
struct shift_left<
|
||||
|
@ -166,10 +157,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::detail::is_both_unused<T, U>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef sprout::weed::unused type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<sprout::weed::unused>
|
||||
{};
|
||||
} // namespace result_of
|
||||
} // namespace attr_cnv
|
||||
} // namespace weed
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <sprout/string.hpp>
|
||||
#include <sprout/array/array.hpp>
|
||||
#include <sprout/algorithm/string/join.hpp>
|
||||
#include <sprout/type_traits/identity.hpp>
|
||||
#include <sprout/weed/unused.hpp>
|
||||
#include <sprout/weed/traits/type/is_char_type.hpp>
|
||||
#include <sprout/weed/traits/type/is_container.hpp>
|
||||
|
@ -30,12 +31,11 @@ namespace sprout {
|
|||
Limit != std::size_t(-1)
|
||||
&& sprout::weed::traits::is_container<T>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename sprout::algorithm::result_of::join<
|
||||
>
|
||||
: public sprout::algorithm::result_of::join<
|
||||
sprout::array<T, Limit>
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// times<N>(V) -> container<V, N>
|
||||
template<std::size_t Limit, typename T>
|
||||
struct times<
|
||||
|
@ -46,14 +46,13 @@ namespace sprout {
|
|||
&& !sprout::weed::traits::is_container<T>::value
|
||||
&& !sprout::weed::traits::is_unused<T>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef typename std::conditional<
|
||||
>
|
||||
: public std::conditional<
|
||||
sprout::weed::traits::is_char_type<T>::value,
|
||||
sprout::basic_string<T, Limit>,
|
||||
sprout::array<T, Limit>
|
||||
>::type type;
|
||||
};
|
||||
>
|
||||
{};
|
||||
// times<N>(unused) -> unused
|
||||
template<std::size_t Limit, typename T>
|
||||
struct times<
|
||||
|
@ -62,10 +61,9 @@ namespace sprout {
|
|||
typename std::enable_if<
|
||||
sprout::weed::traits::is_unused<T>::value
|
||||
>::type
|
||||
> {
|
||||
public:
|
||||
typedef sprout::weed::unused type;
|
||||
};
|
||||
>
|
||||
: public sprout::identity<sprout::weed::unused>
|
||||
{};
|
||||
} // namespace result_of
|
||||
} // namespace attr_cnv
|
||||
} // namespace weed
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue