fix next, prev implementation and adapt-interface

This commit is contained in:
bolero-MURAKAMI 2012-09-26 16:31:11 +09:00
parent 69910ca06c
commit a4c7df65e0
19 changed files with 679 additions and 639 deletions

View file

@ -7,10 +7,29 @@
#include <sprout/type_traits/enabler_if.hpp>
#include <sprout/tuple/tuple/get.hpp>
namespace sprout_generator_detail {
struct not_found_adl_generated_value {};
namespace sprout {
namespace generators {
void generated_value();
} // namespace generators
} // namespace sprout
sprout_generator_detail::not_found_adl_generated_value generated_value(...);
namespace sprout_generator_detail {
using sprout::tuples::get;
template<typename T>
struct has_spr_generated_value_test {
public:
template<
typename U = T,
typename = decltype(sprout::generators::generated_value(std::declval<U>()))
>
static std::true_type test(int);
static std::false_type test(...);
};
template<typename T>
struct has_spr_generated_value
: public decltype(sprout_generator_detail::has_spr_generated_value_test<T>::test(0))
{};
template<typename T>
struct has_mem_generated_value_test {
@ -27,29 +46,12 @@ namespace sprout_generator_detail {
: public decltype(sprout_generator_detail::has_mem_generated_value_test<T>::test(0))
{};
template<typename T>
struct has_adl_generated_value_test {
public:
template<
typename U = T,
typename sprout::enabler_if<
!std::is_same<decltype(generated_value(std::declval<U>())), sprout_generator_detail::not_found_adl_generated_value>::value
>::type = sprout::enabler
>
static std::true_type test(int);
static std::false_type test(...);
};
template<typename T>
struct has_adl_generated_value
: public decltype(sprout_generator_detail::has_adl_generated_value_test<T>::test(0))
{};
template<typename T>
struct has_tuple_get_generated_value_test {
public:
template<
typename U = T,
typename = decltype(sprout::tuples::get<0>(std::declval<U>()))
typename = decltype(get<0>(std::declval<U>()))
>
static std::true_type test(int);
static std::false_type test(...);
@ -60,40 +62,40 @@ namespace sprout_generator_detail {
{};
template<typename T, typename Enable = void>
struct select_mem_generated_value;
struct select_spr_generated_value;
template<typename T>
struct select_mem_generated_value<
struct select_spr_generated_value<
T,
typename std::enable_if<sprout_generator_detail::has_mem_generated_value<T>::value>::type
typename std::enable_if<sprout_generator_detail::has_spr_generated_value<T>::value>::type
>
: public std::true_type
{};
template<typename T>
struct select_mem_generated_value<
struct select_spr_generated_value<
T,
typename std::enable_if<!sprout_generator_detail::has_mem_generated_value<T>::value>::type
typename std::enable_if<!sprout_generator_detail::has_spr_generated_value<T>::value>::type
>
: public std::false_type
{};
template<typename T, typename Enable = void>
struct select_adl_generated_value;
struct select_mem_generated_value;
template<typename T>
struct select_adl_generated_value<
struct select_mem_generated_value<
T,
typename std::enable_if<
sprout_generator_detail::has_adl_generated_value<T>::value
&& !sprout_generator_detail::has_mem_generated_value<T>::value
sprout_generator_detail::has_mem_generated_value<T>::value
&& !sprout_generator_detail::has_spr_generated_value<T>::value
>::type
>
: public std::true_type
{};
template<typename T>
struct select_adl_generated_value<
struct select_mem_generated_value<
T,
typename std::enable_if<!(
sprout_generator_detail::has_adl_generated_value<T>::value
&& !sprout_generator_detail::has_mem_generated_value<T>::value
sprout_generator_detail::has_mem_generated_value<T>::value
&& !sprout_generator_detail::has_spr_generated_value<T>::value
)>::type
>
: public std::false_type
@ -106,8 +108,8 @@ namespace sprout_generator_detail {
T,
typename std::enable_if<
sprout_generator_detail::has_tuple_get_generated_value<T>::value
&& !sprout_generator_detail::has_spr_generated_value<T>::value
&& !sprout_generator_detail::has_mem_generated_value<T>::value
&& !sprout_generator_detail::has_adl_generated_value<T>::value
>::type
>
: public std::true_type
@ -117,8 +119,8 @@ namespace sprout_generator_detail {
T,
typename std::enable_if<!(
sprout_generator_detail::has_tuple_get_generated_value<T>::value
&& !sprout_generator_detail::has_spr_generated_value<T>::value
&& !sprout_generator_detail::has_mem_generated_value<T>::value
&& !sprout_generator_detail::has_adl_generated_value<T>::value
)>::type
>
: public std::false_type
@ -126,37 +128,47 @@ namespace sprout_generator_detail {
template<typename T, typename = void>
struct noexcept_generated_value;
// template<typename T>
// struct noexcept_generated_value<T, typename std::enable_if<sprout_generator_detail::select_spr_generated_value<T>::value>::type>
// : public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(sprout::generators::generated_value(std::declval<T>()), false)>
// {};
template<typename T>
struct noexcept_generated_value<T, typename std::enable_if<sprout_generator_detail::select_mem_generated_value<T>::value>::type>
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(std::declval<T>().generated_value(), false)>
{};
template<typename T>
struct noexcept_generated_value<T, typename std::enable_if<sprout_generator_detail::select_adl_generated_value<T>::value>::type>
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(generated_value(std::declval<T>()), false)>
{};
template<typename T>
struct noexcept_generated_value<T, typename std::enable_if<sprout_generator_detail::select_tuple_get_generated_value<T>::value>::type>
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(sprout::tuples::get<0>(std::declval<T>()), false)>
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(get<0>(std::declval<T>()), false)>
{};
template<typename T, typename = void>
struct generated_value_result;
// template<typename T>
// struct generated_value_result<T, typename std::enable_if<sprout_generator_detail::select_spr_generated_value<T>::value>::type> {
// public:
// typedef decltype(sprout::generators::generated_value(std::declval<T>())) type;
// };
template<typename T>
struct generated_value_result<T, typename std::enable_if<sprout_generator_detail::select_mem_generated_value<T>::value>::type> {
public:
typedef decltype(std::declval<T>().generated_value()) type;
};
template<typename T>
struct generated_value_result<T, typename std::enable_if<sprout_generator_detail::select_adl_generated_value<T>::value>::type> {
public:
typedef decltype(generated_value(std::declval<T>())) type;
};
template<typename T>
struct generated_value_result<T, typename std::enable_if<sprout_generator_detail::select_tuple_get_generated_value<T>::value>::type> {
public:
typedef decltype(sprout::tuples::get<0>(std::declval<T>())) type;
typedef decltype(get<0>(std::declval<T>())) type;
};
// template<
// typename T,
// typename sprout::enabler_if<sprout_generator_detail::select_spr_generated_value<T>::value>::type = sprout::enabler
// >
// inline SPROUT_CONSTEXPR typename sprout_generator_detail::generated_value_result<T>::type
// generated_value_impl(T&& t)
// SPROUT_NOEXCEPT_EXPR((sprout_generator_detail::noexcept_generated_value<T>::value))
// {
// return sprout::generators::generated_value(sprout::forward<T>(t));
// }
template<
typename T,
typename sprout::enabler_if<sprout_generator_detail::select_mem_generated_value<T>::value>::type = sprout::enabler
@ -167,16 +179,6 @@ namespace sprout_generator_detail {
{
return sprout::forward<T>(t).generated_value();
}
template<
typename T,
typename sprout::enabler_if<sprout_generator_detail::select_adl_generated_value<T>::value>::type = sprout::enabler
>
inline SPROUT_CONSTEXPR typename sprout_generator_detail::generated_value_result<T>::type
generated_value_impl(T&& t)
SPROUT_NOEXCEPT_EXPR((sprout_generator_detail::noexcept_generated_value<T>::value))
{
return generated_value(sprout::forward<T>(t));
}
template<
typename T,
typename sprout::enabler_if<sprout_generator_detail::select_tuple_get_generated_value<T>::value>::type = sprout::enabler
@ -185,7 +187,7 @@ namespace sprout_generator_detail {
generated_value_impl(T&& t)
SPROUT_NOEXCEPT_EXPR((sprout_generator_detail::noexcept_generated_value<T>::value))
{
return sprout::tuples::get<0>(sprout::forward<T>(t));
return get<0>(sprout::forward<T>(t));
}
} // namespace sprout_generator_detail