strict is_sequence_t

This commit is contained in:
方而静 2023-07-23 15:24:13 +08:00
parent b71ef30f3e
commit 753b474376

View File

@ -19,24 +19,6 @@ struct sequence_terminated_error : std::exception {
}
};
namespace details {
template<typename T>
auto is_sequence_helper(char) -> decltype(
std::declval<T>()()
, std::declval<T>().is_terminated()
, typename std::enable_if<std::is_same<decltype(std::declval<T>()())
, typename T::result>::value, int>::type()
, std::true_type{});
template<typename T>
auto is_sequence_helper(int) -> std::false_type;
}
template<typename T>
using is_sequence_t = decltype(details::is_sequence_helper<T>(' '));
namespace polyfill {
#if __cplusplus >= 201703L
@ -75,6 +57,26 @@ decltype(auto) apply(Func &&f, Tuple &&t) {
namespace details {
template<typename T>
auto is_sequence_helper(char) -> decltype(
std::declval<T>()()
, typename std::enable_if<std::is_same<decltype(
std::declval<typename polyfill::add_const_t<T>::type>().is_terminated())
, bool>::value, int>::type{0}
, typename std::enable_if<std::is_same<decltype(std::declval<T>()())
, typename T::result>::value, int>::type{0}
, std::true_type{});
template<typename T>
auto is_sequence_helper(int) -> std::false_type;
}
template<typename T>
using is_sequence_t = decltype(details::is_sequence_helper<T>(' '));
namespace details {
template<typename T>
struct iota_sequence {
using result = T;
@ -608,7 +610,7 @@ struct unique_ints_sequence {
}
auto operator()() {
if (!halfed && Tval{(used.size() + 1) * 2} >= r - l + 1) {
if (!halfed && (used.size() + 1) * 2 - (r - l + 1) >= 0) {
for (Tval i = l; i <= r; ++i) {
if (!used.count(i)) rest.push_back(i);
}
@ -741,6 +743,7 @@ namespace _checks {
using empty_sequence_int = decltype(nothing<int>());
/*
static_assert(is_sequence_t<empty_sequence_int>::value
&& is_sequence_t<decltype(take(empty_sequence_int{}, 1))>::value
&& is_sequence_t<decltype(group<20>(empty_sequence_int{}))>::value
@ -748,7 +751,7 @@ static_assert(is_sequence_t<empty_sequence_int>::value
&& !is_sequence_t<int>::value
&& !is_sequence_t<std::less<int>>::value
, "compile-time self-checking failed(try upgrading your compiler).");
*/
} // namespace _checks
} // namespace vmake